Таска 1/2: явный каст и 404 ошибка #1

Open
skvachuk wants to merge 3 commits from feature/1 into develop
4 changed files with 61 additions and 19 deletions

View File

@@ -10,7 +10,6 @@ from src.presentation.dependencies.logger import get_logger
from src.presentation.decorators import csrf_protect from src.presentation.decorators import csrf_protect
from src.presentation.schemas.api_errors import ApiErrorPayload, ApiValidationErrorsPayload from src.presentation.schemas.api_errors import ApiErrorPayload, ApiValidationErrorsPayload
from src.presentation.schemas.me_public import MeUserPublicResponse from src.presentation.schemas.me_public import MeUserPublicResponse
from src.presentation.serializers import me_user_public
account_router = APIRouter() account_router = APIRouter()
@@ -37,6 +36,10 @@ account_router = APIRouter()
'description': 'Ошибка проверки CSRF (нет пары cookie/заголовка, несовпадение или просрочен токен).', 'description': 'Ошибка проверки CSRF (нет пары cookie/заголовка, несовпадение или просрочен токен).',
'model': ApiErrorPayload, 'model': ApiErrorPayload,
}, },
status.HTTP_404_NOT_FOUND: {
'description': 'Учётная запись не найдена.',
'model': ApiErrorPayload,
},
status.HTTP_422_UNPROCESSABLE_ENTITY: { status.HTTP_422_UNPROCESSABLE_ENTITY: {
'description': 'Ошибка валидации входных данных (например, заголовков).', 'description': 'Ошибка валидации входных данных (например, заголовков).',
'model': ApiValidationErrorsPayload, 'model': ApiValidationErrorsPayload,
@@ -52,4 +55,22 @@ async def me(
) -> MeUserPublicResponse: ) -> MeUserPublicResponse:
user = await command(user_id=auth.user_id) user = await command(user_id=auth.user_id)
logger.info(f'Get user: {user.id}') logger.info(f'Get user: {user.id}')
return me_user_public(user) return MeUserPublicResponse(
id=user.id,
email=user.email,
first_name=user.first_name,
middle_name=user.middle_name,
last_name=user.last_name,
birth_date=user.birth_date,
encrypted_mnemonic=user.encrypted_mnemonic,
phone=user.phone,
passport_data=user.passport_data,
inn=user.inn,
erc20=user.erc20,
avatar_link=user.avatar_link,
kyc_verified=user.kyc_verified,
is_deleted=user.is_deleted,
created_at=user.created_at,
updated_at=user.updated_at,
kyc_verified_at=user.kyc_verified_at
)

View File

@@ -30,7 +30,6 @@ from src.presentation.schemas import (
) )
from src.presentation.schemas.api_errors import ApiErrorPayload, ApiValidationErrorsPayload from src.presentation.schemas.api_errors import ApiErrorPayload, ApiValidationErrorsPayload
from src.presentation.schemas.me_public import MeUserPublicResponse, SetAvatarPublicResponse from src.presentation.schemas.me_public import MeUserPublicResponse, SetAvatarPublicResponse
from src.presentation.serializers import me_user_public
account_settings_router = APIRouter(prefix='/settings') account_settings_router = APIRouter(prefix='/settings')
@@ -175,7 +174,25 @@ async def set_avatar(
command: SetAvatarCommand = Depends(get_set_avatar_command), command: SetAvatarCommand = Depends(get_set_avatar_command),
) -> SetAvatarPublicResponse: ) -> SetAvatarPublicResponse:
user, webp_size = await command(user_id=auth.user_id, image_bytes=body.decoded_bytes) user, webp_size = await command(user_id=auth.user_id, image_bytes=body.decoded_bytes)
pub = me_user_public(user) pub = MeUserPublicResponse(
id=user.id,
email=user.email,
first_name=user.first_name,
middle_name=user.middle_name,
last_name=user.last_name,
birth_date=user.birth_date,
encrypted_mnemonic=user.encrypted_mnemonic,
phone=user.phone,
passport_data=user.passport_data,
inn=user.inn,
erc20=user.erc20,
avatar_link=user.avatar_link,
kyc_verified=user.kyc_verified,
is_deleted=user.is_deleted,
created_at=user.created_at,
updated_at=user.updated_at,
kyc_verified_at=user.kyc_verified_at
)
return SetAvatarPublicResponse(**pub.model_dump(), webp_size_bytes=webp_size) return SetAvatarPublicResponse(**pub.model_dump(), webp_size_bytes=webp_size)
Review

**pub.model_dump()

Точно также нужно заменить на явное создание, а не распаковку

**pub.model_dump() Точно также нужно заменить на явное создание, а не распаковку
@@ -197,7 +214,25 @@ async def delete_avatar(
command: DeleteAvatarCommand = Depends(get_delete_avatar_command), command: DeleteAvatarCommand = Depends(get_delete_avatar_command),
) -> MeUserPublicResponse: ) -> MeUserPublicResponse:
user = await command(user_id=auth.user_id) user = await command(user_id=auth.user_id)
return me_user_public(user) return MeUserPublicResponse(
id=user.id,
email=user.email,
first_name=user.first_name,
middle_name=user.middle_name,
last_name=user.last_name,
birth_date=user.birth_date,
encrypted_mnemonic=user.encrypted_mnemonic,
phone=user.phone,
passport_data=user.passport_data,
inn=user.inn,
erc20=user.erc20,
avatar_link=user.avatar_link,
kyc_verified=user.kyc_verified,
is_deleted=user.is_deleted,
created_at=user.created_at,
updated_at=user.updated_at,
kyc_verified_at=user.kyc_verified_at
)
@account_settings_router.post( @account_settings_router.post(

View File

@@ -1 +0,0 @@
from src.presentation.serializers.me_user import me_user_payload, me_user_public

View File

@@ -1,13 +0,0 @@
from __future__ import annotations
from src.application.domain.entities import UserEntity
from src.presentation.schemas.me_public import MeUserPublicResponse
def me_user_public(user: UserEntity) -> MeUserPublicResponse:
return MeUserPublicResponse.from_user(user)
def me_user_payload(user: UserEntity) -> dict:
return me_user_public(user).model_dump(mode='json')