form-4-handlers: добавил ручку со списком expense item и фильтрацией по полю r_start #41
@ -4,9 +4,10 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|||||||
|
|
||||||
from src.services.expense_item_service import ExpenseItemService
|
from src.services.expense_item_service import ExpenseItemService
|
||||||
from src.db.models.app_user import AppUser
|
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.db.session import get_db
|
||||||
from src.domain.schemas import (
|
from src.domain.schemas import (
|
||||||
|
BaseListResponse,
|
||||||
BaseSingleResponse,
|
BaseSingleResponse,
|
||||||
ExpenseItemResponseSchema,
|
ExpenseItemResponseSchema,
|
||||||
)
|
)
|
||||||
@ -33,3 +34,20 @@ async def get_expense_item_by_id(
|
|||||||
message="Запись Expense Item",
|
message="Запись Expense Item",
|
||||||
result=ExpenseItemResponseSchema.model_validate(result),
|
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],
|
||||||
|
)
|
||||||
|
|||||||
@ -11,3 +11,11 @@ class ExpenseItemRepository:
|
|||||||
async def get(self, item_id: int) -> ExpenseItem | None:
|
async def get(self, item_id: int) -> ExpenseItem | None:
|
||||||
query = select(ExpenseItem).where(ExpenseItem.id == item_id).limit(1)
|
query = select(ExpenseItem).where(ExpenseItem.id == item_id).limit(1)
|
||||||
return (await self.db.execute(query)).scalar_one_or_none()
|
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()
|
||||||
|
|||||||
@ -10,7 +10,17 @@ class ExpenseItemService:
|
|||||||
def __init__(self, db: AsyncSession):
|
def __init__(self, db: AsyncSession):
|
||||||
self.repo = ExpenseItemRepository(db)
|
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:
|
if not user or user.role_id == UserRoleEnum.ADMIN:
|
||||||
return await self.repo.get(item_id=item_id)
|
return await self.repo.get(item_id=item_id)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
async def get_list(
|
||||||
|
self,
|
||||||
|
r_start: bool | None = None,
|
||||||
|
) -> list[ExpenseItem]:
|
||||||
|
return await self.repo.get_list(r_start=r_start)
|
||||||
|
|||||||
@ -30,3 +30,28 @@ def test_expense_item_get_executor(client, isp_tokens, auth_headers):
|
|||||||
headers=auth_headers(isp_tokens),
|
headers=auth_headers(isp_tokens),
|
||||||
)
|
)
|
||||||
assert response.status_code == 403
|
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"]])
|
||||||
Loading…
x
Reference in New Issue
Block a user