Skip to content

Commit cc4e939

Browse files
wip(filters): FIlter for tasks and projects
Start the routes of filters dedicated to get especific data from tasks and projects.
1 parent 83177a9 commit cc4e939

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

src/modules/modules_api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from src.routes.user_routes import user_router
44
from src.routes.task_routes import task_router
55
from src.routes.project_routes import project_router
6+
from src.routes.filter_routes import router as filter_router
67
from src.routes.authentication_routes import authentication_router
78

89
# -------------------- API ROUTES -------------------- #
@@ -12,3 +13,4 @@
1213
router.include_router(user_router)
1314
router.include_router(project_router)
1415
router.include_router(task_router)
16+
router.include_router(filter_router)

src/routes/filter_routes.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
from fastapi import APIRouter, Depends, HTTPException, Query
2+
from sqlalchemy.orm import Session
3+
from datetime import date
4+
from typing import List, Optional
5+
6+
from src.utils.utils import get_db
7+
from src.models.user_model import User
8+
from src.models.project_model import Project
9+
from src.models.task_model import Task
10+
from src.schemas.projects.projects_schema import ProjectResponse
11+
from src.schemas.tasks.tasks_schema import TaskResponse
12+
from src.utils.security import get_current_user
13+
14+
router = APIRouter(
15+
prefix="/filters",
16+
tags=["Filters and Relationships"]
17+
)
18+
19+
20+
@router.get("/tasks", response_model=List[TaskResponse])
21+
def filter_tasks(
22+
completed: Optional[bool] = Query(None, description="Filter by completion status (true/false)"),
23+
reminder: Optional[bool] = Query(None, description="Filter by reminder flag (true/false)"),
24+
due_before: Optional[date] = Query(None, description="Tasks due before this date"),
25+
db: Session = Depends(get_db),
26+
current_user: User = Depends(get_current_user)
27+
):
28+
"""
29+
Retorna as tarefas pertencentes aos projetos do usuário logado.
30+
É possível aplicar filtros por status, lembrete e data de vencimento.
31+
"""
32+
33+
# Busca apenas as tarefas de projetos pertencentes ao usuário autenticado
34+
query = (
35+
db.query(Task)
36+
.join(Project, Project.id == Task.project_id)
37+
.filter(Project.owner_id == current_user.id)
38+
)
39+
40+
# Filtro por status de conclusão
41+
if completed is not None:
42+
query = query.filter(Task.completed == completed)
43+
44+
# Filtro por lembrete
45+
if reminder is not None:
46+
query = query.filter(Task.reminder == reminder)
47+
48+
# Filtro por data de entrega
49+
if due_before:
50+
query = query.filter(Task.due_date <= due_before)
51+
52+
return query.all()
53+
54+
55+
@router.get("/user/projects", response_model=List[ProjectResponse])
56+
def get_projects_by_user(
57+
db: Session = Depends(get_db),
58+
current_user: User = Depends(get_current_user)
59+
):
60+
"""
61+
Retorna todos os projetos pertencentes ao usuário autenticado.
62+
"""
63+
64+
projects = db.query(Project).filter(Project.owner_id == current_user.id).all()
65+
return projects
66+
67+
68+
@router.get("/project/{project_id}/tasks", response_model=List[TaskResponse])
69+
def get_tasks_by_project(
70+
project_id: int,
71+
db: Session = Depends(get_db),
72+
current_user: User = Depends(get_current_user)
73+
):
74+
"""
75+
Retorna todas as tarefas de um projeto específico,
76+
desde que o projeto pertença ao usuário autenticado.
77+
"""
78+
79+
project = db.query(Project).filter(Project.id == project_id, Project.owner_id == current_user.id).first()
80+
if not project:
81+
raise HTTPException(status_code=404, detail="Project not found or not owned by user")
82+
83+
return db.query(Task).filter(Task.project_id == project.id).all()
84+
85+
86+
@router.get("/tasks/advanced", response_model=List[TaskResponse])
87+
def advanced_filter_tasks(
88+
completed: Optional[bool] = Query(None, description="Filter by completion status"),
89+
reminder: Optional[bool] = Query(None, description="Filter by reminder flag"),
90+
project_id: Optional[int] = Query(None, description="Filter by project ID"),
91+
due_before: Optional[date] = Query(None, description="Tasks due before this date"),
92+
db: Session = Depends(get_db),
93+
current_user: User = Depends(get_current_user)
94+
):
95+
"""
96+
Filtro avançado de tarefas relacionadas ao usuário autenticado.
97+
Permite combinar múltiplos parâmetros de busca.
98+
"""
99+
100+
query = (
101+
db.query(Task)
102+
.join(Project, Project.id == Task.project_id)
103+
.filter(Project.owner_id == current_user.id)
104+
)
105+
106+
if completed is not None:
107+
query = query.filter(Task.completed == completed)
108+
if reminder is not None:
109+
query = query.filter(Task.reminder == reminder)
110+
if project_id is not None:
111+
query = query.filter(Task.project_id == project_id)
112+
if due_before:
113+
query = query.filter(Task.due_date <= due_before)
114+
115+
return query.all()

0 commit comments

Comments
 (0)