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 typing import Annotated
from fastapi import Depends, Query 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): class Pagination(BaseModel):
@@ -9,4 +19,25 @@ class Pagination(BaseModel):
limit: int | None = Query(default=30, ge=0, le=50) 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 fastapi import APIRouter, Depends
from src.api.dependacies.db_dep import sessionDep 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.api.dependacies.user_dep import ActiveUser, TaskOwnerDep
from src.schemas.tasks import TaskADDRequest from src.schemas.tasks import TaskADDRequest
from src.services.tasks import TaskService from src.services.tasks import TaskService
@@ -13,7 +13,13 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"])
@router.get("/") @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) result = await UserService(session).get_user_with_tasks(user.id)
return result return result

View File

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