Skip to content

Commit 5ee40f6

Browse files
Merge pull request #3 from Cinnamoon-dev/refactor/services
refactor: raising exceptions with errors responses
2 parents cc4f283 + ac41bed commit 5ee40f6

2 files changed

Lines changed: 52 additions & 43 deletions

File tree

src/services/userService.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
from typing import Any
12
from functools import reduce
2-
from fastapi.responses import JSONResponse
3+
from fastapi import HTTPException
34
from fastapi.datastructures import QueryParams
45

56
from src.infra.database.database import PgDatabase
@@ -14,7 +15,7 @@ def __init__(self) -> None:
1415
self.columns = retrieve_table_columns(self.table)
1516
self.all_columns = reduce(lambda acc, elem: acc + ", " + str(elem), self.columns)
1617

17-
def all(self, query_params: QueryParams) -> JSONResponse:
18+
def all(self, query_params: QueryParams) -> dict[str, Any]:
1819
show_fk_id = bool(int(query_params.get("show_fk_id", 1)))
1920
page = int(query_params.get("page", 1))
2021
rows_per_page = int(query_params.get("rows_per_page", 10))
@@ -26,18 +27,21 @@ def all(self, query_params: QueryParams) -> JSONResponse:
2627
query = f"SELECT u.id, u.email, u.senha, tu.nome AS tipo_usuario FROM {self.table} AS u INNER JOIN tipo_usuario AS tu ON u.tipo_usuario_id=tu.id"
2728

2829
if sort is not None:
29-
sort_column, sort_order = sort.split(",")
30+
try:
31+
sort_column, sort_order = sort.split(",")
32+
except Exception:
33+
raise HTTPException(status_code=422, detail={"error": True, "message": f"Coluna e direção {sort} não separada corretamente por ','"})
3034

3135
if sort_column not in self.columns:
32-
return JSONResponse({"error": True, "message": f"Coluna {sort_column} não identificada"}, 400)
36+
raise HTTPException(status_code=422, detail={"error": True, "message": f"Coluna {sort_column} não identificada"})
3337

3438
if sort_order.lower() not in ["asc", "desc"]:
35-
return JSONResponse({"error": True, "message": f"Direção de ordenação {sort_order} inválida, deve ser 'asc' ou 'desc'"}, 400)
39+
raise HTTPException(status_code=422, detail={"error": True, "message": f"Direção de ordenação {sort_order} inválida, deve ser 'asc' ou 'desc'"})
3640

3741
output = paginate(query, page, rows_per_page, sort)
38-
return JSONResponse(output, 200)
42+
return output
3943

40-
def view(self, user_id: int) -> JSONResponse:
44+
def view(self, user_id: int) -> dict[str, Any]:
4145
user = None
4246

4347
try:
@@ -46,50 +50,50 @@ def view(self, user_id: int) -> JSONResponse:
4650
row = db.cursor.fetchone()
4751

4852
if row is None:
49-
return JSONResponse(status_code=404, content={"error": True, "message": "Usuário não encontrado"})
53+
raise HTTPException(status_code=404, detail={"error": True, "message": "Usuário não encontrado"})
5054
except Exception:
51-
return JSONResponse(status_code=500, content={"error": True, "message": "Database error"})
55+
raise HTTPException(status_code=500, detail={"error": True, "message": "Database error"})
5256

5357
user = line_to_dict(row, self.columns)
54-
return JSONResponse(status_code=200, content={"error": False, "data": user})
58+
return user
5559

56-
def add(self, user: UserAddSchema) -> JSONResponse:
60+
def add(self, user: UserAddSchema) -> dict[str, Any]:
5761
try:
5862
with PgDatabase() as db:
5963
db.cursor.execute(f"INSERT INTO {self.table} (email, senha, tipo_usuario_id) VALUES (%s, %s, %s) RETURNING id", (user.email, user.senha, user.tipo_usuario_id))
6064
raw_id = db.cursor.fetchone()
6165

6266
if raw_id is None:
63-
return JSONResponse(status_code=500, content={"error": True, "message": f"Não foi possível inserir o usuário {user.email}."})
67+
raise HTTPException(status_code=500, detail={"error": True, "message": f"Não foi possível inserir o usuário {user.email}."})
6468

6569
inserted_id = raw_id[0]
6670
db.connection.commit()
6771
except Exception as e:
68-
return JSONResponse(status_code=500, content={"error": True, "message": str(e)})
72+
raise HTTPException(status_code=500, detail={"error": True, "message": str(e)})
6973

70-
return JSONResponse(status_code=200, content={"error": False, "message": f"Usuário {user.email} adicionado com sucesso.", "id": inserted_id})
74+
return {"error": False, "message": f"Usuário {user.email} adicionado com sucesso.", "id": inserted_id}
7175

72-
def edit(self, user_id: int, user: UserEditSchema) -> JSONResponse:
76+
def edit(self, user_id: int, user: UserEditSchema) -> dict[str, Any]:
7377
user_dict = user.model_dump(exclude_none=True)
7478
if not user_dict:
75-
return JSONResponse(status_code=200, content={"error": False, "message": f"Usuário com id {user_id} editado com sucesso."})
79+
raise HTTPException(status_code=200, detail={"error": False, "message": f"Usuário com id {user_id} editado com sucesso."})
7680

7781
set_fields, set_values = fields_to_update(user_dict)
7882
try:
7983
with PgDatabase() as db:
8084
db.cursor.execute(f"UPDATE {self.table} SET {set_fields} WHERE id = %s", set_values + (user_id,))
8185
db.connection.commit()
8286
except Exception:
83-
return JSONResponse(status_code=500, content={"error": True, "message": "Database error"})
87+
raise HTTPException(status_code=500, detail={"error": True, "message": "Database error"})
8488

85-
return JSONResponse(status_code=200, content={"error": False, "message": f"Usuário com id {user_id} editado com sucesso."})
89+
return {"error": False, "message": f"Usuário com id {user_id} editado com sucesso."}
8690

87-
def delete(self, user_id: int) -> JSONResponse:
91+
def delete(self, user_id: int) -> dict[str, Any]:
8892
try:
8993
with PgDatabase() as db:
9094
db.cursor.execute(f"DELETE FROM {self.table} WHERE id = %s", (user_id,))
9195
db.connection.commit()
9296
except Exception:
93-
return JSONResponse(status_code=500, content={"error": True, "message": "Database error"})
97+
raise HTTPException(status_code=500, detail={"error": True, "message": "Database error"})
9498

95-
return JSONResponse(status_code=200, content={"error": False, "message": f"Usuário com id {user_id} deletado com sucesso."})
99+
return {"error": False, "message": f"Usuário com id {user_id} deletado com sucesso."}

src/services/userTypeService.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from functools import reduce
2+
from typing import Any
3+
from fastapi import HTTPException
24
from fastapi.responses import JSONResponse
35
from psycopg2.errors import UniqueViolation
46
from fastapi.datastructures import QueryParams
@@ -16,25 +18,28 @@ def __init__(self) -> None:
1618
self.columns: list[str] = retrieve_table_columns(self.table)
1719
self.all_columns = reduce(lambda acc, elem: acc + ", " + str(elem), self.columns)
1820

19-
def all(self, query_params: QueryParams) -> JSONResponse:
21+
def all(self, query_params: QueryParams) -> dict[str, Any]:
2022
query = f"SELECT {self.all_columns} FROM {self.table}"
2123
page = int(query_params.get("page", 1))
2224
rows_per_page = int(query_params.get("rows_per_page", 10))
2325
sort = query_params.get("sort_by", None)
2426

2527
if sort is not None:
26-
sort_column, sort_order = sort.split(",")
28+
try:
29+
sort_column, sort_order = sort.split(",")
30+
except Exception:
31+
raise HTTPException(status_code=422, detail={"error": True, "message": f"Coluna e direção {sort} não separada corretamente por ','"})
2732

2833
if sort_column not in self.columns:
29-
return JSONResponse({"error": True, "message": f"Coluna {sort_column} não identificada"}, 400)
34+
raise HTTPException(status_code=422, detail={"error": True, "message": f"Coluna {sort_column} não identificada"})
3035

3136
if sort_order.lower() not in ["asc", "desc"]:
32-
return JSONResponse({"error": True, "message": f"Direção de ordenação {sort_order} inválida, deve ser 'asc' ou 'desc'"}, 400)
37+
raise HTTPException(status_code=422, detail={"error": True, "message": f"Direção de ordenação {sort_order} inválida, deve ser 'asc' ou 'desc'"})
3338

3439
output = paginate(query, page, rows_per_page, sort)
35-
return JSONResponse(output, 200)
40+
return output
3641

37-
def view(self, user_type_id: int) -> JSONResponse:
42+
def view(self, user_type_id: int) -> dict[str, Any]:
3843
user_type = None
3944

4045
try:
@@ -43,54 +48,54 @@ def view(self, user_type_id: int) -> JSONResponse:
4348
row = db.cursor.fetchone()
4449

4550
if row is None:
46-
return JSONResponse(status_code=404, content={"error": True, "message": "Tipo de usuário não encontrado"})
51+
raise HTTPException(status_code=404, detail={"error": True, "message": "Tipo de usuário não encontrado"})
4752
except Exception:
48-
return JSONResponse(status_code=500, content={"error": True, "message": "Database error"})
53+
raise HTTPException(status_code=500, detail={"error": True, "message": "Database error"})
4954

5055
user_type = line_to_dict(row, self.columns)
51-
return JSONResponse(status_code=200, content={"error": False, "data": user_type})
56+
return user_type
5257

53-
def add(self, user_type: UserTypeSchema) -> JSONResponse:
58+
def add(self, user_type: UserTypeSchema) -> dict[str, Any]:
5459
try:
5560
with PgDatabase() as db:
5661
db.cursor.execute(f"INSERT INTO {self.table} (nome) VALUES (%s) RETURNING id", (user_type.nome,))
5762
raw_id = db.cursor.fetchone()
5863

5964
if raw_id is None:
60-
return JSONResponse(status_code=500, content={"error": True, "message": "Não foi possível inserir o tipo de usuário."})
65+
raise HTTPException(status_code=500, detail={"error": True, "message": "Não foi possível inserir o tipo de usuário."})
6166

6267
inserted_id = raw_id[0]
6368
db.connection.commit()
6469
except UniqueViolation as e:
65-
return JSONResponse(status_code=400, content={"error": True, "message": str(e)})
70+
raise HTTPException(status_code=400, detail={"error": True, "message": str(e)})
6671
except Exception:
67-
return JSONResponse(status_code=500, content={"error": True, "message": "Database error"})
72+
raise HTTPException(status_code=500, detail={"error": True, "message": "Database error"})
6873

69-
return JSONResponse(status_code=200, content={"error": False, "message": f"Tipo de usuário {user_type.nome} adicionado com sucesso.", "id": inserted_id})
74+
return {"error": False, "message": f"Tipo de usuário {user_type.nome} adicionado com sucesso.", "id": inserted_id}
7075

71-
def edit(self, user_type_id: int, user_type: UserTypeSchema) -> JSONResponse:
76+
def edit(self, user_type_id: int, user_type: UserTypeSchema) -> dict[str, Any]:
7277
user_type_dict = user_type.model_dump(exclude_none=True)
7378
if not user_type_dict:
74-
return JSONResponse(status_code=200, content={"error": False, "message": f"Tipo de usuário com id {user_type_id} editado com sucesso."})
79+
raise HTTPException(status_code=200, detail={"error": False, "message": f"Tipo de usuário com id {user_type_id} editado com sucesso."})
7580

7681
set_fields, set_values = fields_to_update(user_type_dict)
7782
try:
7883
with PgDatabase() as db:
7984
db.cursor.execute(f"UPDATE {self.table} SET {set_fields} WHERE id = %s", set_values + (user_type_id,))
8085
db.connection.commit()
8186
except UniqueViolation as e:
82-
return JSONResponse(status_code=400, content={"error": True, "message": str(e)})
87+
raise HTTPException(status_code=400, detail={"error": True, "message": str(e)})
8388
except Exception as e:
84-
return JSONResponse(status_code=500, content={"error": True, "message": str(e)})
89+
raise HTTPException(status_code=500, detail={"error": True, "message": str(e)})
8590

86-
return JSONResponse(status_code=200, content={"error": False, "message": f"Tipo de usuário com id {user_type_id} editado com sucesso."})
91+
return {"error": False, "message": f"Tipo de usuário com id {user_type_id} editado com sucesso."}
8792

88-
def delete(self, user_type_id: int) -> JSONResponse:
93+
def delete(self, user_type_id: int) -> dict[str, Any]:
8994
try:
9095
with PgDatabase() as db:
9196
db.cursor.execute(f"DELETE FROM {self.table} WHERE id = %s", (user_type_id,))
9297
db.connection.commit()
9398
except Exception:
94-
return JSONResponse(status_code=500, content={"error": True, "message": "Database error"})
99+
raise HTTPException(status_code=500, detail={"error": True, "message": "Database error"})
95100

96-
return JSONResponse(status_code=200, content={"error": False, "message": f"Tipo de usuário com id {user_type_id} deletado com sucesso."})
101+
return {"error": False, "message": f"Tipo de usuário com id {user_type_id} deletado com sucesso."}

0 commit comments

Comments
 (0)