Merge pull request 'form-4-handlers: добавил ручку со списком expense item и фильтрацией по полю r_start' (#41) from form-4-handlers into test

Reviewed-on: #41
Reviewed-by: Raykov-MS <RaykovMS@avt.rshb.ru>
This commit is contained in:
tsygankoviva 2026-07-20 15:47:17 +03:00
commit 7c64938020
4 changed files with 64 additions and 3 deletions

View File

@ -4,9 +4,10 @@ from sqlalchemy.ext.asyncio import AsyncSession
from src.services.expense_item_service import ExpenseItemService
from src.db.models.app_user import AppUser
from src.api.v1.deps import require_admin
from src.api.v1.deps import require_admin, require_executor
from src.db.session import get_db
from src.domain.schemas import (
BaseListResponse,
BaseSingleResponse,
ExpenseItemResponseSchema,
)
@ -33,3 +34,20 @@ async def get_expense_item_by_id(
message="Запись Expense Item",
result=ExpenseItemResponseSchema.model_validate(result),
)
@router.get("/", response_model=BaseListResponse[ExpenseItemResponseSchema])
async def get_expense_item_by_id(
db: AsyncSession = Depends(get_db),
current_user: AppUser = Depends(require_executor),
r_start: bool | None = None,
):
"""Получение записей expense item"""
service = ExpenseItemService(db)
result = await service.get_list(r_start=r_start)
return BaseListResponse(
success=True,
message="Запись Expense Item",
result=[ExpenseItemResponseSchema.model_validate(el) for el in result],
)

View File

@ -11,3 +11,11 @@ class ExpenseItemRepository:
async def get(self, item_id: int) -> ExpenseItem | None:
query = select(ExpenseItem).where(ExpenseItem.id == item_id).limit(1)
return (await self.db.execute(query)).scalar_one_or_none()
async def get_list(self, r_start: bool | None = None) -> list[ExpenseItem]:
where = []
if r_start is not None:
where.append(ExpenseItem.item_id.startswith("R"))
query = select(ExpenseItem).where(*where)
return (await self.db.execute(query)).scalars().all()

View File

@ -10,7 +10,17 @@ class ExpenseItemService:
def __init__(self, db: AsyncSession):
self.repo = ExpenseItemRepository(db)
async def get(self, item_id: int, user: AppUser | None = None) -> ExpenseItem | None:
async def get(
self,
item_id: int,
user: AppUser | None = None,
) -> ExpenseItem | None:
if not user or user.role_id == UserRoleEnum.ADMIN:
return await self.repo.get(item_id=item_id)
return None
async def get_list(
self,
r_start: bool | None = None,
) -> list[ExpenseItem]:
return await self.repo.get_list(r_start=r_start)

View File

@ -30,3 +30,28 @@ def test_expense_item_get_executor(client, isp_tokens, auth_headers):
headers=auth_headers(isp_tokens),
)
assert response.status_code == 403
def test_expense_item_list(client, isp_tokens, auth_headers):
response = client.get(
"/api/v1/expense-item/",
headers=auth_headers(isp_tokens),
)
assert response.status_code == 200
result = response.json()
assert result["success"] is True
assert isinstance(result["result"], list)
assert len(result["result"]) != 0
def test_expense_item_list_r_start(client, isp_tokens, auth_headers):
response = client.get(
"/api/v1/expense-item/?r_start=true",
headers=auth_headers(isp_tokens),
)
assert response.status_code == 200
result = response.json()
assert result["success"] is True
assert isinstance(result["result"], list)
assert len(result["result"]) != 0
assert all([el["item_id"].startswith("R") for el in result["result"]])