Skip to content

Commit a6efb87

Browse files
committed
refactor(users): consolidate uuid import, add type hints and dependency singletons
1 parent 6f66db0 commit a6efb87

File tree

1 file changed

+32
-24
lines changed

1 file changed

+32
-24
lines changed

app/routers/users.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from __future__ import annotations
22

3-
from fastapi import APIRouter, Depends, HTTPException, Path, Query, Security
3+
import uuid as uuid_pkg
4+
5+
from fastapi import APIRouter, Depends, HTTPException, Path, Query, Security, Response
46
from sqlalchemy.ext.asyncio import AsyncSession
57

68
from app.auth.dependencies import require_permissions
79
from app.database import get_db
10+
from app.models import User
811
from app.schemas import UserCreate, UserInDB, UserResponse, UserUpdate
912
from app.services.user_service import (
1013
assign_roles,
@@ -17,23 +20,29 @@
1720

1821
router = APIRouter(prefix="/users", tags=["👥 User Management"])
1922

23+
# Evitar B008: crear dependencias como singletons de módulo
24+
db_dep = Depends(get_db)
25+
perm_read = Security(require_permissions(), scopes=["users:read"])
26+
perm_write = Security(require_permissions(), scopes=["users:write"])
27+
perm_delete = Security(require_permissions(), scopes=["users:delete"])
28+
2029

2130
@router.get("/", response_model=list[UserResponse])
2231
async def get_users(
2332
skip: int = Query(0, ge=0),
2433
limit: int = Query(100, ge=1, le=500),
25-
db: AsyncSession = Depends(get_db),
26-
current_user=Security(require_permissions(), scopes=["users:read"]),
27-
):
34+
db: AsyncSession = db_dep,
35+
_current_user: User = perm_read,
36+
) -> list[User]:
2837
return await list_users(db, skip=skip, limit=limit)
2938

3039

3140
@router.get("/{user_id}", response_model=UserInDB)
3241
async def get_user(
3342
user_id: str = Path(...),
34-
db: AsyncSession = Depends(get_db),
35-
current_user=Security(require_permissions(), scopes=["users:read"]),
36-
):
43+
db: AsyncSession = db_dep,
44+
_current_user: User = perm_read,
45+
) -> User:
3746
user = await get_user_by_id(db, uuid_from_str(user_id))
3847
if not user:
3948
raise HTTPException(status_code=404, detail="Usuario no encontrado")
@@ -43,44 +52,43 @@ async def get_user(
4352
@router.post("/", response_model=UserResponse, status_code=201)
4453
async def create_user_admin(
4554
payload: UserCreate,
46-
db: AsyncSession = Depends(get_db),
47-
current_user=Security(require_permissions(), scopes=["users:write"]),
48-
):
55+
db: AsyncSession = db_dep,
56+
_current_user: User = perm_write,
57+
) -> User:
4958
return await create_user(db, payload)
5059

5160

5261
@router.put("/{user_id}", response_model=UserResponse)
5362
async def update_user_endpoint(
5463
user_id: str,
5564
payload: UserUpdate,
56-
db: AsyncSession = Depends(get_db),
57-
current_user=Security(require_permissions(), scopes=["users:write"]),
58-
):
65+
db: AsyncSession = db_dep,
66+
_current_user: User = perm_write,
67+
) -> User:
5968
return await update_user(db, uuid_from_str(user_id), payload)
6069

6170

62-
@router.delete("/{user_id}", status_code=204)
71+
@router.delete("/{user_id}", status_code=204, response_class=Response, response_model=None)
6372
async def delete_user_endpoint(
6473
user_id: str,
65-
db: AsyncSession = Depends(get_db),
66-
current_user=Security(require_permissions(), scopes=["users:delete"]),
67-
):
74+
db: AsyncSession = db_dep,
75+
_current_user: User = perm_delete,
76+
) -> None:
6877
ok = await delete_user(db, uuid_from_str(user_id))
6978
if not ok:
7079
raise HTTPException(status_code=404, detail="Usuario no encontrado")
80+
return Response(status_code=204)
7181

7282

7383
@router.post("/{user_id}/roles", response_model=UserInDB)
7484
async def assign_roles_endpoint(
7585
user_id: str,
7686
role_names: list[str],
77-
db: AsyncSession = Depends(get_db),
78-
current_user=Security(require_permissions(), scopes=["users:write"]),
79-
):
87+
db: AsyncSession = db_dep,
88+
_current_user: User = perm_write,
89+
) -> User:
8090
return await assign_roles(db, uuid_from_str(user_id), role_names)
8191

8292

83-
def uuid_from_str(value: str):
84-
import uuid as _uuid
85-
86-
return _uuid.UUID(value)
93+
def uuid_from_str(value: str) -> uuid_pkg.UUID:
94+
return uuid_pkg.UUID(value)

0 commit comments

Comments
 (0)