22from fastapi import Depends , Header , HTTPException
33
44from freenit .api .router import route
5+ from freenit .config import getConfig
56from freenit .decorators import description
6- from freenit .models .ldap .base import get_client
7+ from freenit .models .ldap .role import RoleCreate
78from freenit .models .pagination import Page
89from freenit .models .role import Role
9- from freenit .models .safe import RoleSafe , UserSafe
10+ from freenit .models .safe import RoleSafe
1011from freenit .models .user import User
1112from freenit .permissions import role_perms
1213
1314tags = ["role" ]
15+ config = getConfig ()
1416
1517
1618@route ("/roles" , tags = tags )
@@ -19,68 +21,60 @@ class RoleListAPI:
1921 @description ("Get roles" )
2022 async def get (
2123 page : int = Header (default = 1 ),
22- _ : int = Header (default = 10 ),
23- user : User = Depends (role_perms ),
24+ perpage : int = Header (default = 10 ),
25+ _ : User = Depends (role_perms ),
2426 ) -> Page [RoleSafe ]:
2527 data = await Role .get_all ()
26- total = len (data )
27- page = Page (total = total , page = 1 , pages = 1 , perpage = total , data = data )
28- return page
28+ perpage = len (data )
29+ data = Page (total = perpage , page = page , pages = 1 , perpage = perpage , data = data )
30+ return data
2931
3032 @staticmethod
31- async def post (role : Role , user : User = Depends (role_perms )) -> RoleSafe :
33+ async def post (data : RoleCreate , user : User = Depends (role_perms )) -> RoleSafe :
34+ if data .name == "" :
35+ raise HTTPException (status_code = 409 , detail = "Name is mandatory" )
36+ role = Role .create (data .name )
3237 try :
33- await role .create (user )
38+ await role .save (user )
3439 except bonsai .errors .AlreadyExists :
3540 raise HTTPException (status_code = 409 , detail = "Role already exists" )
3641 return role
3742
3843
39- @route ("/roles/{id }" , tags = tags )
44+ @route ("/roles/{name }" , tags = tags )
4045class RoleDetailAPI :
4146 @staticmethod
42- async def get (id , _ : User = Depends (role_perms )) -> RoleSafe :
43- role = await Role .get (id )
47+ async def get (name , _ : User = Depends (role_perms )) -> RoleSafe :
48+ role = await Role .get (name )
4449 return role
4550
4651 @staticmethod
47- async def delete (id , _ : User = Depends (role_perms )) -> RoleSafe :
48- client = get_client ()
52+ async def delete (name , _ : User = Depends (role_perms )) -> RoleSafe :
4953 try :
50- async with client .connect (is_async = True ) as conn :
51- res = await conn .search (
52- id , bonsai .LDAPSearchScope .SUB , "objectClass=groupOfUniqueNames"
53- )
54- if len (res ) < 1 :
55- raise HTTPException (status_code = 404 , detail = "No such role" )
56- if len (res ) > 1 :
57- raise HTTPException (status_code = 409 , detail = "Multiple role found" )
58- existing = res [0 ]
59- role = Role (
60- cn = existing ["cn" ][0 ],
61- dn = str (existing ["dn" ]),
62- users = existing ["uniqueMember" ],
63- )
64- await existing .delete ()
65- return role
54+ role = await Role .get (name )
55+ await role .destroy ()
56+ return role
6657 except bonsai .errors .AuthenticationError :
6758 raise HTTPException (status_code = 403 , detail = "Failed to login" )
6859
6960
70- @route ("/roles/{role_id }/{user_id }" , tags = tags )
61+ @route ("/roles/{role_name }/{id }" , tags = tags )
7162class RoleUserAPI :
7263 @staticmethod
7364 @description ("Assign user to role" )
74- async def post (role_id , user_id , _ : User = Depends (role_perms )) -> UserSafe :
75- user = await User .get ( user_id )
76- role = await Role .get (role_id )
65+ async def post (role_name , id , _ : User = Depends (role_perms )) -> RoleSafe :
66+ user = await User .get_by_uid ( id )
67+ role = await Role .get (role_name )
7768 await role .add (user )
78- return user
69+ return role
7970
8071 @staticmethod
81- @description ("Deassign user to role" )
82- async def delete (role_id , user_id , _ : User = Depends (role_perms )) -> UserSafe :
83- user = await User .get (user_id )
84- role = await Role .get (role_id )
72+ @description ("Remove user from role" )
73+ async def delete (role_name , id , _ : User = Depends (role_perms )) -> RoleSafe :
74+ user = await User .get_by_uid (id )
75+ role = await Role .get (role_name )
76+ if len (role .users ) == 1 :
77+ if role .users [0 ] == user .dn :
78+ raise HTTPException (status_code = 409 , detail = "Can not remove last member" )
8579 await role .remove (user )
86- return user
80+ return role
0 commit comments