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