diff --git a/api/api/db/logic/account.py b/api/api/db/logic/account.py index 06d42a6..e6fe163 100644 --- a/api/api/db/logic/account.py +++ b/api/api/db/logic/account.py @@ -1,16 +1,14 @@ -from typing import Optional import math - from datetime import datetime, timezone - -from sqlalchemy import insert, select, func -from sqlalchemy.ext.asyncio import AsyncConnection from enum import Enum +from typing import Optional + +from sqlalchemy import func, insert, select +from sqlalchemy.ext.asyncio import AsyncConnection from api.db.tables.account import account_table - from api.schemas.account.account import User -from api.schemas.endpoints.account import AllUserResponse, all_user_adapter +from api.schemas.endpoints.account import all_user_adapter, AllUserResponse, UserUpdate async def get_user_accaunt_page(connection: AsyncConnection, page, limit) -> Optional[AllUserResponse]: @@ -47,31 +45,28 @@ async def get_user_accaunt_page(connection: AsyncConnection, page, limit) -> Opt validated_users = all_user_adapter.validate_python(users_data) - return AllUserResponse(users=validated_users, amount_count=total_count, amount_pages=total_pages, current_page=page) + return AllUserResponse( + users=validated_users, + amount_count=total_count, + amount_pages=total_pages, + current_page=page, + limit=limit, + ) -async def get_user_by_id(connection: AsyncConnection, id: int) -> Optional[User]: +async def get_user_by_id(connection: AsyncConnection, user_id: int) -> Optional[UserUpdate]: """ Получает юзера по id. """ - query = select(account_table).where(account_table.c.id == id) + query = select(account_table).where(account_table.c.id == user_id) user_db_cursor = await connection.execute(query) - user_db = user_db_cursor.one_or_none() + user = user_db_cursor.mappings().one_or_none() - if not user_db: + if not user: return None - user_data = { - column.name: ( - getattr(user_db, column.name).name - if isinstance(getattr(user_db, column.name), Enum) - else getattr(user_db, column.name) - ) - for column in account_table.columns - } - - return User.model_validate(user_data) + return UserUpdate.model_validate(user) async def get_user_by_login(connection: AsyncConnection, login: str) -> Optional[User]: @@ -107,7 +102,7 @@ async def update_user_by_id(connection: AsyncConnection, update_values, user) -> await connection.commit() -async def create_user(connection: AsyncConnection, user: User, creator_id: int) -> Optional[User]: +async def create_user(connection: AsyncConnection, user: UserUpdate, creator_id: int) -> Optional[UserUpdate]: """ Создает нове поле в таблице account_table. """ @@ -123,8 +118,9 @@ async def create_user(connection: AsyncConnection, user: User, creator_id: int) status=user.status.value, ) - await connection.execute(query) + res = await connection.execute(query) await connection.commit() + user = await get_user_by_id(connection, res.lastrowid) return user diff --git a/api/api/endpoints/account.py b/api/api/endpoints/account.py index 99ecf83..77df6dd 100644 --- a/api/api/endpoints/account.py +++ b/api/api/endpoints/account.py @@ -4,29 +4,23 @@ from fastapi import ( HTTPException, status, ) - - from sqlalchemy.ext.asyncio import AsyncConnection from api.db.connection.session import get_connection_dep - from api.db.logic.account import ( - get_user_by_id, - update_user_by_id, create_user, - get_user_by_login, get_user_accaunt_page, + get_user_by_id, + get_user_by_login, + update_user_by_id, ) - -from api.schemas.account.account import User from api.db.tables.account import AccountStatus +from api.schemas.account.account import User from api.schemas.base import bearer_schema -from api.schemas.endpoints.account import UserUpdate, AllUserResponse +from api.schemas.endpoints.account import AllUserResponse, UserUpdate from api.services.auth import get_current_user - -from api.services.user_role_validation import db_user_role_validation from api.services.update_data_validation import update_user_data_changes - +from api.services.user_role_validation import db_user_role_validation api_router = APIRouter( prefix="/account", @@ -53,7 +47,9 @@ async def get_all_account( @api_router.get("/{user_id}", dependencies=[Depends(bearer_schema)], response_model=User) async def get_account( - user_id: int, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user) + user_id: int, + connection: AsyncConnection = Depends(get_connection_dep), + current_user=Depends(get_current_user), ): authorize_user = await db_user_role_validation(connection, current_user) @@ -65,19 +61,19 @@ async def get_account( return user -@api_router.post("", dependencies=[Depends(bearer_schema)], response_model=User) +@api_router.post("", dependencies=[Depends(bearer_schema)], response_model=UserUpdate) async def create_account( - user: UserUpdate, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user) + user: UserUpdate, + connection: AsyncConnection = Depends(get_connection_dep), + current_user=Depends(get_current_user), ): authorize_user = await db_user_role_validation(connection, current_user) user_validation = await get_user_by_login(connection, user.login) if user_validation is None: - await create_user(connection, user, authorize_user.id) - user_new = await get_user_by_login(connection, user.login) - return user_new - + new_user = await create_user(connection, user, authorize_user.id) + return new_user else: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="An account with this information already exists." @@ -113,7 +109,9 @@ async def update_account( @api_router.delete("/{user_id}", dependencies=[Depends(bearer_schema)], response_model=User) async def delete_account( - user_id: int, connection: AsyncConnection = Depends(get_connection_dep), current_user=Depends(get_current_user) + user_id: int, + connection: AsyncConnection = Depends(get_connection_dep), + current_user=Depends(get_current_user), ): authorize_user = await db_user_role_validation(connection, current_user) diff --git a/api/api/schemas/endpoints/account.py b/api/api/schemas/endpoints/account.py index 6366ce7..4817122 100644 --- a/api/api/schemas/endpoints/account.py +++ b/api/api/schemas/endpoints/account.py @@ -36,6 +36,7 @@ class AllUserResponse(Base): amount_count: int amount_pages: int current_page: int + limit: int all_user_adapter = TypeAdapter(List[AllUser])