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
import math
from datetime import datetime, timezone
from sqlalchemy import insert, select
from sqlalchemy import insert, select, func
from sqlalchemy.ext.asyncio import AsyncConnection
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.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 всех юзеров
"""
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)
ivan.dev marked this conversation as resolved Outdated
  1. Тебе нужен адаптер для list[AllUser]. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам.
  2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
1. Тебе нужен адаптер для `list[AllUser]`. В текущем виде это не имеет смысла, это равносильно простому созданию класса по кейвордам. 2. В документации написано, что такие конструкции лучше создавать один раз, соответственно стоит их делать глобальными тогда.
# Получаем все результаты
users = result.fetchall()
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

View File

@ -30,10 +30,12 @@ api_router = APIRouter(
)
@api_router.get("/")
@api_router.get("")
async def get_all_account(
request: Request,
page: int = 3,
limit: int = 10,
connection: AsyncConnection = Depends(get_connection_dep)
):
@ -41,7 +43,7 @@ async def get_all_account(
current_user = request.state.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:
raise HTTPException(