From ab77ce458da2eb02714c5024df5f1d91080eebbc Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Mon, 20 Jul 2026 14:37:04 +0300 Subject: [PATCH] =?UTF-8?q?form-4-handlers:=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=80=D1=83=D1=87=D0=BA=D1=83=20=D1=81?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=BE=D0=BC=20expense?= =?UTF-8?q?=20item=20=D0=B8=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B5=D0=B9=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8E=20r=5Fstart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/api/v1/expense_item.py | 20 +++++++++++++- api/src/repository/expense_item_repository.py | 8 ++++++ api/src/services/expense_item_service.py | 12 ++++++++- api/tests/integration/test_expense_item.py | 27 ++++++++++++++++++- 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/api/src/api/v1/expense_item.py b/api/src/api/v1/expense_item.py index 23f2a91..27ec439 100644 --- a/api/src/api/v1/expense_item.py +++ b/api/src/api/v1/expense_item.py @@ -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], + ) diff --git a/api/src/repository/expense_item_repository.py b/api/src/repository/expense_item_repository.py index 99e9ed8..7b109e6 100644 --- a/api/src/repository/expense_item_repository.py +++ b/api/src/repository/expense_item_repository.py @@ -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() diff --git a/api/src/services/expense_item_service.py b/api/src/services/expense_item_service.py index bda4eeb..e3982d8 100644 --- a/api/src/services/expense_item_service.py +++ b/api/src/services/expense_item_service.py @@ -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) diff --git a/api/tests/integration/test_expense_item.py b/api/tests/integration/test_expense_item.py index 38760cd..f033a19 100644 --- a/api/tests/integration/test_expense_item.py +++ b/api/tests/integration/test_expense_item.py @@ -29,4 +29,29 @@ def test_expense_item_get_executor(client, isp_tokens, auth_headers): "/api/v1/expense-item/1", headers=auth_headers(isp_tokens), ) - assert response.status_code == 403 \ No newline at end of file + 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"]]) \ No newline at end of file -- 2.47.2