
    ie                        d Z ddlmZmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZ ddlmZ d	eez  d
efdZ e       Zej5                  de      d ee	       ee      fdedz  deded
efd       Zej=                  deej>                         ee	       ee      fdededed
efd       Z ej5                  de       ee	       ee      fdededed
efd       Z!ejE                  de       ee	       ee      fdedededed
ef
d       Z#ejI                  dejJ                         ee	       ee      fdededed
dfd       Z&ej5                  de       ee	       ee      fdededed
efd       Z'ejQ                  de       ee	       ee      fdedededed
ef
d       Z)y)uG   Roles router — endpoints for role management and permission matrices.    )	APIRouterDependsHTTPExceptionstatus)AsyncSession)get_db)get_current_user)User)PermissionsUpdate
RoleCreateRolePermissionResponseRoleResponse
RoleUpdate)role_serviceereturnc                     t        | t              r$t        t        j                  t        |             S t        t        j                  t        |             S )uE   Convert service-layer ValueError → 404 and PermissionError → 403.status_codedetail)
isinstancePermissionErrorr   r   HTTP_403_FORBIDDENstrHTTP_404_NOT_FOUND)r   s    3/var/www/html/spbu.com/backend/app/routers/roles.py_service_errorr      s:    !_%)B)B3q6RRV%>%>s1vNN     )response_modelNspbu_iddbcurrent_userc                    K   t        j                  ||        d{   }d|D cg c]  }t        j                  |       c}iS 7 )c c}w w)zOReturn all roles, optionally scoped to a specific SPBU (includes global roles).Ndata)r   
list_rolesr   model_validate)r!   r"   r#   rolesrs        r   r&   r&      sJ      ))"g66EUCU\003UCDD 7Cs    AA	AAAA)r    r   r%   c                    K   	 t        j                  || |       d{   }t        j                  |      ddS 7 # t        $ r)}t        t        j
                  t        |            d}~ww xY ww)z[Create a new role. Super Admin can create global roles; SPBU Admin only for their own SPBU.Nr   zRole berhasil dibuatr%   message)	r   create_roler   r   r   r   r   r   r'   )r%   r"   r#   roler   s        r   r-   r-   "   sj     R!--b$EE !//5BXYY F R(A(A#a&QQRs1   A2= ;= A2= 	A/$A**A//A2z
/{role_id}role_idc                    K   	 t        j                  ||        d{   }dt        j                  |      iS 7 # t        $ r)}t        t        j
                  t        |            d}~ww xY ww)z;Return details for a single role including its permissions.Nr   r%   )	r   get_role
ValueErrorr   r   r   r   r   r'   )r/   r"   r#   r.   r   s        r   r1   r1   0   sf     R!**2w77 L//566 8 R(A(A#a&QQRs1   A0; 9; A0; 	A-$A((A--A0c                    K   	 t        j                  || ||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)zUpdate scalar fields on a role.NzRole berhasil diupdater+   )r   update_roler2   r   r   r   r'   )r/   r%   r"   r#   r.   r   s         r   r4   r4   >   sb      !--b'4NN !//5BZ[[ O(  Q s1   A > <> A > AAAA )r   c                    K   	 t        j                  || |       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)zPermanently delete a role.N)r   delete_roler2   r   r   )r/   r"   r#   r   s       r   r6   r6   M   sB      &&r7LAAA(  Q s0   A& $& A& AA  AAz/{role_id}/permissionsc                 
  K   	 t        j                  ||        d{   }d|D cg c]  }t        j                  |       c}iS 7 )# t        $ r)}t        t        j
                  t        |            d}~ww xY wc c}w w)z/Return all permission entries for a given role.Nr   r%   )	r   get_permissionsr2   r   r   r   r   r   r'   )r/   r"   r#   permissionsr   ps         r   r8   r8   Z   sz     R(88WEE {S{!+::1={STT F R(A(A#a&QQRSsB   BA	 AA	 BA>BA	 		A;$A66A;;Bc                    K   	 t        j                  || |j                  |       d{   }|D cg c]  }t        j                  |       c}ddS 7 *# t        t        f$ r}t        |      d}~ww xY wc c}w w)z9Replace the full permission matrix for a role atomically.NzPermissions berhasil disimpanr+   )r   set_permissionsr9   r2   r   r   r   r'   )r/   r%   r"   r#   r9   r   r:   s          r   r<   r<   h   s      (88WdFVFVXdee DOO;a'66q9;O2  f(  Q  PsB   A=%A AA A=A8A=A A5%A00A55A=)*__doc__fastapir   r   r   r   sqlalchemy.ext.asyncior   app.core.databaser   app.dependenciesr	   app.models.userr
   app.schemas.roler   r   r   r   r   app.servicesr   r2   r   r   routergetdictintr&   postHTTP_201_CREATEDr-   r1   patchr4   deleteHTTP_204_NO_CONTENTr6   r8   putr<    r   r   <module>rP      s   M = = / $ -   l l %Oj?2 O} O 
 Bt$v !12E4ZEE E 
	E %E R&2I2IJ v !12
Z

Z
Z 
Z 
	
Z K
Z L. v !12
7
7
7 
7 
	
7 /
7 l40 v !12	\\
\ 	\ 	\
 
\ 1\ |)C)CD v !12	 	 	  	  
		  E	  $T: v !12
U
U
U 
U 
	
U ;
U $T: v !12	
 	 	
 
 ;r   