diff --git a/api/api/db/logic/account.py b/api/api/db/logic/account.py index 7e5811c..2c58497 100644 --- a/api/api/db/logic/account.py +++ b/api/api/db/logic/account.py @@ -3,6 +3,8 @@ import math from datetime import datetime, timezone +from pydantic import TypeAdapter + from sqlalchemy import insert, select, func from sqlalchemy.ext.asyncio import AsyncConnection from enum import Enum @@ -10,33 +12,45 @@ from enum import Enum from api.db.tables.account import account_table from api.schemas.account.account import User -from api.schemas.endpoints.account import AllUser,AllUserResponse +from api.schemas.endpoints.account import AllUser, AllUserResponse -async def get_all_users_login_and_id(connection: AsyncConnection,page,limit) -> Optional[User]: + +async def get_all_users_login_and_id(connection: AsyncConnection, page, limit) -> Optional[User]: """ Получает id и login всех юзеров """ - first_user = page*limit-(limit-1) - last_user = first_user+(limit-1) - query = select(account_table.c.id, account_table.c.login).where(account_table.c.id.between(first_user, last_user )) + user_adapter = TypeAdapter(AllUser) + response_adapter = TypeAdapter(AllUserResponse) - result = await connection.execute(query) + first_user = page*limit-(limit) - users = result.fetchall() - - user_list = [{'id': user.id, 'login': user.login} for user in users] - - user_models = [AllUser(id=user['id'], login=user['login']) for user in user_list] + query = ( + select(account_table.c.id, account_table.c.login) + .order_by(account_table.c.id) + .offset(first_user) + .limit(limit) + ) count_query = select(func.count()).select_from(account_table) + result = await connection.execute(query) count_result = await connection.execute(count_query) - amount_count = count_result.scalar() - amount_pages = math.ceil(amount_count / limit) + users_data = result.fetchall() + total_count = count_result.scalar() + total_pages = math.ceil(total_count / limit) - return AllUserResponse(users=user_models, amount_count=amount_count, amount_pages=amount_pages) + validated_users = [ + user_adapter.validate_python({"id": u.id, "login": u.login}) + for u in users_data + ] + + return response_adapter.validate_python({ + "users": validated_users, + "amount_count": total_count, + "amount_pages": total_pages + }) async def get_user_id(connection: AsyncConnection, id: int) -> Optional[User]: @@ -116,8 +130,6 @@ async def create_user(connection: AsyncConnection, user: User, creator_id: int) status=user.status.value ) - - await connection.execute(query) await connection.commit()