add date_to date_from endpoints

This commit is contained in:
IluaAir
2025-08-29 21:48:38 +03:00
parent 3e6468fa38
commit 07f14b0564
3 changed files with 36 additions and 8 deletions

View File

@@ -1,8 +1,10 @@
from datetime import date
from enum import Enum 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): class StatEnum(str, Enum):
@@ -25,3 +27,17 @@ class Status(BaseModel):
StatusTaskDep = Annotated[Status, Depends()] 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 PaginationTasksDep, StatusTaskDep 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: PaginationTasksDep, status: StatusTaskDep): 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,7 +61,9 @@ 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)
@@ -69,7 +73,9 @@ class UsersRepo(BaseRepo):
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)