VORKOUT-7 #9

Merged
ivan.dev merged 12 commits from VORKOUT-7 into master 2025-06-05 16:29:14 +05:00
2 changed files with 24 additions and 7 deletions
Showing only changes of commit e47e449a36 - Show all commits

View File

@ -1,8 +1,9 @@
from typing import Optional from typing import Optional
import math
from datetime import datetime, timezone from datetime import datetime, timezone
from sqlalchemy import insert, select from sqlalchemy import insert, select, func
from sqlalchemy.ext.asyncio import AsyncConnection from sqlalchemy.ext.asyncio import AsyncConnection
from enum import Enum from enum import Enum
@ -11,20 +12,34 @@ from api.db.tables.account import account_table
from api.schemas.account.account import User from api.schemas.account.account import User
from api.schemas.endpoints.account import UserUpdate, Role, Status from api.schemas.endpoints.account import UserUpdate, Role, Status
async def get_all_users_login_and_id(connection: AsyncConnection) -> Optional[User]: async def get_all_users_login_and_id(connection: AsyncConnection,page,limit) -> Optional[User]:
""" """
ivan.dev marked this conversation as resolved Outdated

Надо переименовать метод и изменить описание, сейчас же не только login и id

Надо переименовать метод и изменить описание, сейчас же не только `login` и `id`
Получает id и login всех юзеров Получает id и login всех юзеров
""" """
query = select(account_table.c.id, account_table.c.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 ))
ivan.dev marked this conversation as resolved Outdated

Давай все-таки через offset делать, а то вычислять по id как-то сомнительно выглядит

Давай все-таки через `offset` делать, а то вычислять по `id` как-то сомнительно выглядит
# Выполняем запрос
result = await connection.execute(query) result = await connection.execute(query)
ivan.dev marked this conversation as resolved Outdated
  1. Тебе нужен адаптер для list[AllUser]. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам.
  2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
1. Тебе нужен адаптер для `list[AllUser]`. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам. 2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
# Получаем все результаты
users = result.fetchall() users = result.fetchall()
user_list = [{'id': user.id, 'login': user.login} for user in users] user_list = [{'id': user.id, 'login': user.login} for user in users]
count_query = select(func.count()).select_from(account_table)
ivan.dev marked this conversation as resolved Outdated

Можно вместо этого использовать parse_obj_as из pydantic.tools, чтобы парсить запрос сразу из бд в модель User
Можешь посмотреть в репозитории бэка

Можно вместо этого использовать `parse_obj_as` из `pydantic.tools`, чтобы парсить запрос сразу из бд в модель `User` Можешь посмотреть в [репозитории](https://gitea.heado.ru/dinar/backend/src/branch/master/backend/db/logic/issues.py#L93) бэка

parse_obj_as устарело в Pydantic 2, не используйте это. Для подобных целей создали TypeAdapter.

`parse_obj_as` устарело в Pydantic 2, не используйте это. Для подобных целей создали [TypeAdapter](https://docs.pydantic.dev/2.11/concepts/type_adapter/).
count_result = await connection.execute(count_query)
amount_count = count_result.scalar()
amount_pages = math.ceil(amount_count / limit)
return {
'users': user_list,
'amount_count': amount_count,
'amount_pages': amount_pages
ivan.dev marked this conversation as resolved Outdated

А почему ты только эти поля селектишь? Просто для теста взял?

А почему ты только эти поля селектишь? Просто для теста взял?

Да.

Да.
}
return user_list return user_list

View File

@ -30,10 +30,12 @@ api_router = APIRouter(
) )
@api_router.get("/") @api_router.get("")
async def get_all_account( async def get_all_account(
request: Request, request: Request,
page: int = 3,
limit: int = 10,
connection: AsyncConnection = Depends(get_connection_dep) connection: AsyncConnection = Depends(get_connection_dep)
): ):
@ -41,7 +43,7 @@ async def get_all_account(
current_user = request.state.current_user current_user = request.state.current_user
authorize_user = await db_user_role_validation(connection, current_user) authorize_user = await db_user_role_validation(connection, current_user)
user_list = await get_all_users_login_and_id(connection) user_list = await get_all_users_login_and_id(connection,page,limit)
if user_list is None: if user_list is None:
raise HTTPException( raise HTTPException(