11from __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
46from sqlalchemy .ext .asyncio import AsyncSession
57
68from app .auth .dependencies import require_permissions
79from app .database import get_db
10+ from app .models import User
811from app .schemas import UserCreate , UserInDB , UserResponse , UserUpdate
912from app .services .user_service import (
1013 assign_roles ,
1720
1821router = 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 ])
2231async 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 )
3241async 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 )
4453async 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 )
5362async 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 )
6372async 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 )
7484async 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