Coverage for src / tarefas / tarefas_router.py: 89%
56 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
1"""Rotas HTTP do modulo de tarefas."""
3from fastapi import APIRouter, Depends, HTTPException, Response, status
4from sqlalchemy.orm import Session
6from src.database.session import get_db
7from src.tarefas.schemas import TarefaConcluirSchema
8from src.tarefas.schemas import TarefaCreateSchema, TarefaResponseSchema
9from src.tarefas.schemas import TarefaUpdateSchema, TarefasResponseSchema
10from src.tarefas.services import can_read_tarefa, conclude_tarefa
11from src.tarefas.services import create_tarefa, delete_tarefa, get_tarefa_by_id
12from src.tarefas.services import list_tarefas, patch_tarefa, update_tarefa
14router = APIRouter(prefix="/tarefas", tags=["tarefas"])
17@router.get("/", response_model=TarefasResponseSchema)
18async def read_tarefas(
19 solicitante_id: str | None = None,
20 grupo_nome: str | None = None,
21 db: Session = Depends(get_db),
22) -> TarefasResponseSchema:
23 """Retorna tarefas visiveis para o solicitante."""
24 return TarefasResponseSchema(
25 tarefas=list_tarefas(db, solicitante_id, grupo_nome)
26 )
29@router.get("/{tarefa_id}", response_model=TarefaResponseSchema)
30async def read_tarefa(
31 tarefa_id: int,
32 solicitante_id: str | None = None,
33 grupo_nome: str | None = None,
34 db: Session = Depends(get_db),
35) -> TarefaResponseSchema:
36 """Retorna uma tarefa por id, respeitando a visibilidade."""
37 tarefa = get_tarefa_by_id(db, tarefa_id)
38 if tarefa is None or not can_read_tarefa(tarefa, solicitante_id, grupo_nome):
39 raise HTTPException(
40 status_code=status.HTTP_404_NOT_FOUND,
41 detail="Tarefa nao encontrada.",
42 )
43 return tarefa
46@router.post(
47 "/",
48 response_model=TarefaResponseSchema,
49 status_code=status.HTTP_201_CREATED,
50)
51async def add_tarefa(
52 payload: TarefaCreateSchema, db: Session = Depends(get_db)
53) -> TarefaResponseSchema:
54 """Adiciona uma nova tarefa."""
55 try:
56 return create_tarefa(db, payload)
57 except ValueError as error:
58 raise HTTPException(
59 status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
60 detail=str(error),
61 ) from error
64@router.put("/{tarefa_id}", response_model=TarefaResponseSchema)
65async def replace_tarefa(
66 tarefa_id: int,
67 payload: TarefaCreateSchema,
68 db: Session = Depends(get_db),
69) -> TarefaResponseSchema:
70 """Atualiza completamente uma tarefa."""
71 tarefa = get_tarefa_by_id(db, tarefa_id)
72 if tarefa is None:
73 raise HTTPException(
74 status_code=status.HTTP_404_NOT_FOUND,
75 detail="Tarefa nao encontrada.",
76 )
77 try:
78 return update_tarefa(db, tarefa, payload)
79 except ValueError as error:
80 raise HTTPException(
81 status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
82 detail=str(error),
83 ) from error
86@router.patch("/{tarefa_id}", response_model=TarefaResponseSchema)
87async def edit_tarefa(
88 tarefa_id: int,
89 payload: TarefaUpdateSchema,
90 db: Session = Depends(get_db),
91) -> TarefaResponseSchema:
92 """Edita parcialmente uma tarefa."""
93 tarefa = get_tarefa_by_id(db, tarefa_id)
94 if tarefa is None:
95 raise HTTPException(
96 status_code=status.HTTP_404_NOT_FOUND,
97 detail="Tarefa nao encontrada.",
98 )
99 try:
100 return patch_tarefa(db, tarefa, payload)
101 except ValueError as error:
102 raise HTTPException(
103 status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
104 detail=str(error),
105 ) from error
108@router.patch("/{tarefa_id}/concluir", response_model=TarefaResponseSchema)
109async def finish_tarefa(
110 tarefa_id: int,
111 payload: TarefaConcluirSchema,
112 db: Session = Depends(get_db),
113) -> TarefaResponseSchema:
114 """Marca uma tarefa como concluida."""
115 tarefa = get_tarefa_by_id(db, tarefa_id)
116 if tarefa is None:
117 raise HTTPException(
118 status_code=status.HTTP_404_NOT_FOUND,
119 detail="Tarefa nao encontrada.",
120 )
121 return conclude_tarefa(db, tarefa, payload.concluida)
124@router.delete("/{tarefa_id}", status_code=status.HTTP_204_NO_CONTENT)
125async def remove_tarefa(
126 tarefa_id: int, db: Session = Depends(get_db)
127) -> Response:
128 """Remove uma tarefa existente."""
129 tarefa = get_tarefa_by_id(db, tarefa_id)
130 if tarefa is None:
131 raise HTTPException(
132 status_code=status.HTTP_404_NOT_FOUND,
133 detail="Tarefa nao encontrada.",
134 )
135 delete_tarefa(db, tarefa)
136 return Response(status_code=status.HTTP_204_NO_CONTENT)