Compare commits

...

2 Commits

Author SHA1 Message Date
IluaAir
07f14b0564 add date_to date_from endpoints 2025-08-29 21:48:38 +03:00
IluaAir
3e6468fa38 add quary status 2025-08-29 21:37:42 +03:00
3 changed files with 51 additions and 8 deletions

View File

@@ -1,7 +1,17 @@
from datetime import date
from enum import Enum
from typing import Annotated
from fastapi import Depends, Query
from pydantic import BaseModel
from fastapi.exceptions import HTTPException
from pydantic import BaseModel, model_validator
class StatEnum(str, Enum):
open = "open"
closed = "closed"
in_progress = "in_progress"
todo = "todo"
class Pagination(BaseModel):
@@ -9,4 +19,25 @@ class Pagination(BaseModel):
limit: int | None = Query(default=30, ge=0, le=50)
PaginationTasks = Annotated[Pagination, Depends()]
PaginationTasksDep = Annotated[Pagination, Depends()]
class Status(BaseModel):
status: StatEnum | None = Query(default=None)
StatusTaskDep = Annotated[Status, Depends()]
class Date(BaseModel):
date_from: date | None = Query(default=None)
date_to: date | None = Query(default=None)
@model_validator(mode="after")
def check_dates(self):
if self.date_from and self.date_to and self.date_to < self.date_from:
raise HTTPException(status_code=422, detail="date_to cannot be less than date_from")
return self
DateDep = Annotated[Date, Depends()]

View File

@@ -3,7 +3,7 @@ from typing import Annotated
from fastapi import APIRouter, Depends
from src.api.dependacies.db_dep import sessionDep
from src.api.dependacies.task_dep import PaginationTasks
from src.api.dependacies.task_dep import DateDep, PaginationTasksDep, StatusTaskDep
from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep
from src.schemas.tasks import TaskADDRequest
from src.services.tasks import TaskService
@@ -13,7 +13,13 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"])
@router.get("/")
async def get_tasks(session: sessionDep, user: ActiveUser, page: PaginationTasks):
async def get_tasks(
session: sessionDep,
user: ActiveUser,
page: PaginationTasksDep,
status: StatusTaskDep,
date: DateDep,
):
result = await UserService(session).get_user_with_tasks(user.id)
return result

View File

@@ -31,7 +31,9 @@ class UsersRepo(BaseRepo):
date_to: Optional[date] = None,
date_from: Optional[date] = None,
) -> UsersORM | None:
tasks_subquery = self._tasks_subquary(date_from=date_from, date_to=date_to, user_id=user_id)
tasks_subquery = self._tasks_subquary(
date_from=date_from, date_to=date_to, user_id=user_id
)
if tasks_limit is not None:
tasks_subquery = tasks_subquery.limit(tasks_limit)
@@ -59,17 +61,21 @@ class UsersRepo(BaseRepo):
)
return obj
async def get_tasks_count(self, date_from: date | None, date_to: date | None, **filter_by) -> int:
async def get_tasks_count(
self, date_from: date | None, date_to: date | None, **filter_by
) -> int:
subq = self._tasks_subquary(date_from, date_to, **filter_by).subquery()
stmt = select(func.count()).select_from(subq)
result = await self.session.execute(stmt)
return result.scalar_one()
def _priority(self, priority: str):
priority_map = {"low": 1, "medium": 2, "high": 3, "critical": 4}
return priority_map.get(priority, 0)
def _tasks_subquary(self, date_from: date | None, date_to: date | None, **filter_by):
def _tasks_subquary(
self, date_from: date | None, date_to: date | None, **filter_by
):
subq = select(TasksORM.id).filter_by(**filter_by)
if date_from is not None:
subq = subq.filter(TasksORM.due_date >= date_from)