11from __future__ import annotations
22
3- from fastapi import APIRouter , Depends , HTTPException , Query , Security
3+ from fastapi import APIRouter , Depends , HTTPException , Query , Security , Response
4+ import uuid
45from sqlalchemy .ext .asyncio import AsyncSession
56
67from app .auth .dependencies import require_permissions
78from app .database import get_db
9+ from app .models import Permission , Role , User
810from app .schemas import (
911 PermissionResponse ,
1012 RoleCreate ,
2426
2527router = APIRouter (prefix = "/roles" , tags = ["🎭 Role Management" ])
2628
29+ # Singletons de dependencias para evitar B008
30+ db_dep = Depends (get_db )
31+ perm_read = Security (require_permissions (), scopes = ["roles:read" ])
32+ perm_write = Security (require_permissions (), scopes = ["roles:write" ])
33+ perm_delete = Security (require_permissions (), scopes = ["roles:delete" ])
34+
2735
2836@router .get ("/" , response_model = list [RoleResponse ])
2937async def get_roles (
3038 skip : int = Query (0 , ge = 0 ),
3139 limit : int = Query (100 , ge = 1 , le = 500 ),
32- db : AsyncSession = Depends ( get_db ) ,
33- current_user = Security ( require_permissions (), scopes = [ "roles:read" ]) ,
34- ):
40+ db : AsyncSession = db_dep ,
41+ _current_user : User = perm_read ,
42+ ) -> list [ Role ] :
3543 return await list_roles (db , skip = skip , limit = limit )
3644
3745
3846@router .get ("/{role_id}" , response_model = RoleWithUsers )
3947async def get_role (
4048 role_id : str ,
41- db : AsyncSession = Depends (get_db ),
42- current_user = Security (require_permissions (), scopes = ["roles:read" ]),
43- ):
44- import uuid as _uuid
45-
46- role = await get_role_by_id (db , _uuid .UUID (role_id ))
49+ db : AsyncSession = db_dep ,
50+ _current_user : User = perm_read ,
51+ ) -> Role :
52+ role = await get_role_by_id (db , uuid .UUID (role_id ))
4753 if not role :
4854 raise HTTPException (status_code = 404 , detail = "Rol no encontrado" )
4955 return role
@@ -52,52 +58,47 @@ async def get_role(
5258@router .post ("/" , response_model = RoleResponse , status_code = 201 )
5359async def create_role_endpoint (
5460 payload : RoleCreate ,
55- db : AsyncSession = Depends ( get_db ) ,
56- current_user = Security ( require_permissions (), scopes = [ "roles:write" ]) ,
57- ):
61+ db : AsyncSession = db_dep ,
62+ _current_user : User = perm_write ,
63+ ) -> Role :
5864 return await create_role (db , payload )
5965
6066
6167@router .put ("/{role_id}" , response_model = RoleResponse )
6268async def update_role_endpoint (
6369 role_id : str ,
6470 payload : RoleUpdate ,
65- db : AsyncSession = Depends (get_db ),
66- current_user = Security (require_permissions (), scopes = ["roles:write" ]),
67- ):
68- import uuid as _uuid
69-
70- return await update_role (db , _uuid .UUID (role_id ), payload )
71+ db : AsyncSession = db_dep ,
72+ _current_user : User = perm_write ,
73+ ) -> Role :
74+ return await update_role (db , uuid .UUID (role_id ), payload )
7175
7276
73- @router .delete ("/{role_id}" , status_code = 204 )
77+ @router .delete ("/{role_id}" , status_code = 204 , response_class = Response , response_model = None )
7478async def delete_role_endpoint (
7579 role_id : str ,
76- db : AsyncSession = Depends (get_db ),
77- current_user = Security (require_permissions (), scopes = ["roles:delete" ]),
78- ):
79- import uuid as _uuid
80-
81- ok = await delete_role (db , _uuid .UUID (role_id ))
80+ db : AsyncSession = db_dep ,
81+ _current_user : User = perm_delete ,
82+ ) -> None :
83+ ok = await delete_role (db , uuid .UUID (role_id ))
8284 if not ok :
8385 raise HTTPException (status_code = 404 , detail = "Rol no encontrado" )
86+ return Response (status_code = 204 )
8487
8588
8689@router .post ("/{role_id}/permissions" , response_model = RoleResponse )
8790async def assign_permissions_endpoint (
8891 role_id : str ,
8992 permission_names : list [str ],
90- db : AsyncSession = Depends (get_db ),
91- current_user = Security (require_permissions (), scopes = ["roles:write" ]),
92- ):
93- import uuid as _uuid
94-
95- return await assign_permissions (db , _uuid .UUID (role_id ), permission_names )
93+ db : AsyncSession = db_dep ,
94+ _current_user : User = perm_write ,
95+ ) -> Role :
96+ return await assign_permissions (db , uuid .UUID (role_id ), permission_names )
9697
9798
98- @router .get ("/../ permissions/" , response_model = list [PermissionResponse ])
99+ @router .get ("/permissions/" , response_model = list [PermissionResponse ])
99100async def get_permissions (
100- db : AsyncSession = Depends ( get_db ) ,
101- current_user = Security ( require_permissions (), scopes = [ "roles:read" ]) ,
102- ):
101+ db : AsyncSession = db_dep ,
102+ _current_user : User = perm_read ,
103+ ) -> list [ Permission ] :
103104 return await list_permissions (db )
0 commit comments