
    ]iS              
       <   d Z ddlmZmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZ 	 dded	edz  d
ee   fdZdeded
edz  fdZded
efdZdeded
efdZddededed
dfdZdeded
ee   fdZdededeeeef      d
ee   fdZdedededed
ef
dZy)uK   Role repository — all DB queries for roles and their permission matrices.    )datetimetimezone)deleteor_select)AsyncSession)selectinload)AksiEnum	ModulEnumRoleRolePermissionNdbspbu_idreturnc                 Z  K   t        t              j                  t        j                  j	                  d            j                  t        t        j                              }|I|j                  t        t        j                  j	                  d      t        j                  |k(              }| j                  |j                  t        j                  j                         t        j                               d{   }t        |j!                         j#                               S 7 +w)zTReturn all roles, optionally scoped to a specific SPBU (includes global/seed roles).N)r   r   where
deleted_atis_optionsr	   permissionsr   r   executeorder_by	is_systemdescnamalistscalarsall)r   r   queryresults       B/var/www/html/spbu.com/backend/app/repositories/role_repository.pyget_allr"      s     
 	t	t""4(	)	d../	0 

   &(?@
 ::ennT^^-@-@-BDIINOOF $$&'' Ps   C;D+=D)>,D+role_idc                 B  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                                     d{   }|j                         S 7 w)z@Fetch a single role by primary key, with its permissions loaded.N)r   r   r   r   idr   r   r   r	   r   scalar_one_or_noner   r#   r    s      r!   	get_by_idr(      so     ::t	tww'!4??#6#6t#<	=	d../	0 F
 $$&&s   BBB	Bc                    K   t        di |}| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)u8   Create a new role record. Flush only — caller commits.N )r   addflushr(   r%   )r   kwargsroles      r!   creater/   '   sH     >&>DFF4L
((*2tww''' 's!   0AAAAAAr.   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uH   Update scalar fields on an existing role. Flush only — caller commits.N)itemssetattrr,   r(   r%   )r   r.   r-   keyvalues        r!   updater5   /   sR     lln
Uc5! %
((*2tww''' 's!   9A"AA"A A" A"hard_deletec                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u4   Delete a role record. Flush only — caller commits.N)r   r   nowr   utcr   r,   )r   r.   r6   s      r!   delete_roler:   7   sH     iio",,x||4
((* 	 s"   A$A A A$A"A$"A$c                    K   | j                  t        t              j                  t        j                  |k(               d{   }t        |j                         j                               S 7 +w)z/Return all permission entries for a given role.N)r   r   r   r   r#   r   r   r   r'   s      r!   get_permissionsr<   @   sY     ::~$$^%;%;w%FG F  $$&''s   AA2A0,A2r   c           	      @  K   | j                  t        t              j                  t        j                  |k(               d{    |D cg c]  \  }}t        |||       }}}| j                  |       | j                          d{    |S 7 Oc c}}w 7 w)uu   Atomically replace the full permission matrix for a role (delete-all then insert-all). Flush only — caller commits.N)r#   modulaksi)r   r   r   r   r#   add_allr,   )r   r#   r   r>   r?   	new_permss         r!   set_permissionsrB   H   s      **~$$^%;%;w%FG  
 '&KE4 	we$?&   JJy
((*
 s0   ABB	BB&'BBBBr>   r?   c                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(  t        j                  |k(               d{   }|j                         duS 7 w)zCReturn True if the role has the specified module+action permission.N)r   r   r   r   r#   r>   r?   r&   )r   r#   r>   r?   r    s        r!   has_permissionrD   Z   ss      ::~$$""g-  E)4'	
 F $$&d22s   A&B(A?)B)N)T)__doc__r   r   
sqlalchemyr   r   r   sqlalchemy.ext.asyncior   sqlalchemy.ormr	   app.models.roler
   r   r   r   intr   r"   r(   r/   r5   boolr:   r<   tuplerB   rD   r*       r!   <module>rN      s=   Q ' * * / ' E E -1(("Tz(	$Z("' 's 'td{ '(\ ( ((\ ( (D (, d  QU (l (S (T.=Q ( eIx/01 
.	$33"3+43<D3	3rM   