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

1"""Rotas HTTP do modulo de tarefas.""" 

2 

3from fastapi import APIRouter, Depends, HTTPException, Response, status 

4from sqlalchemy.orm import Session 

5 

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 

13 

14router = APIRouter(prefix="/tarefas", tags=["tarefas"]) 

15 

16 

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 ) 

27 

28 

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 

44 

45 

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 

62 

63 

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 

84 

85 

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 

106 

107 

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) 

122 

123 

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)