Compare commits

...

2 Commits

Author SHA1 Message Date
IluaAir
c941b25a90 repo tasks count 2025-08-28 00:36:59 +03:00
IluaAir
45c5492ff8 api pagin, db _task_subquary, tasks depends 2025-08-28 00:27:27 +03:00
3 changed files with 30 additions and 8 deletions

View File

@@ -0,0 +1,12 @@
from typing import Annotated
from fastapi import Depends, Query
from pydantic import BaseModel
class Pagination(BaseModel):
page: int | None = Query(default=0, ge=0)
limit: int | None = Query(default=30, ge=0, le=50)
PaginationTasks = Annotated[Pagination, Depends()]

View File

@@ -3,6 +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.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
@@ -12,7 +13,7 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"])
@router.get("/") @router.get("/")
async def get_tasks(session: sessionDep, user: ActiveUser): async def get_tasks(session: sessionDep, user: ActiveUser, page: PaginationTasks):
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

@@ -1,7 +1,7 @@
from datetime import date from datetime import date
from typing import Optional from typing import Optional
from sqlalchemy import select, update from sqlalchemy import func, select, update
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
from src.models import UsersORM from src.models import UsersORM
@@ -31,12 +31,7 @@ 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 = select(TasksORM.id).where(TasksORM.user_id == user_id) tasks_subquery = self._tasks_subquary(date_from=date_from, date_to=date_to, user_id=user_id)
if date_from is not None:
tasks_subquery = tasks_subquery.where(TasksORM.due_date >= date_from)
if date_to is not None:
tasks_subquery = tasks_subquery.where(TasksORM.due_date <= date_to)
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)
@@ -64,6 +59,20 @@ class UsersRepo(BaseRepo):
) )
return obj return obj
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): 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):
subq = select(TasksORM.id).filter_by(**filter_by)
if date_from is not None:
subq = subq.filter(TasksORM.due_date >= date_from)
if date_to is not None:
subq = subq.filter(TasksORM.due_date <= date_to)
return subq