
    E|j="              
       X   d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ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  e j<                  e      Z  e       Z! G d de      Z" G d de      Z#dede$fdZ%de&de&ddfdZ'dedejP                  de)fdZ*de)de&fdZ+e!jY                  d       ee       ee      fdede$fd       Z-e!j]                  dej^                         ee       ee      fde"dede$fd        Z0e!jc                  d!       ee       ee      fde&de#dede$fd"       Z2e!jY                  d#       ee       ee      fde&dede$fd$       Z3e!ji                  d!ejj                         ee       ee      fde&dede$fd%       Z6y)&    N)	APIRouterDependsHTTPExceptionstatus)AsyncSession)selectfunc)	BaseModelfield_validator)Optional)get_dbget_current_staff)MstrRole)User)error_codes)ADMIN_ROLE_KEYSROLE_KEY_HIERARCHYget_assignable_role_keysc                   n    e Zd ZU eed<   eed<    ed      ed               Z ed      ed               Zy)CreateRoleRequestnameroleKeyc                 @    |j                         }|st        d      |S NzRole name must not be emptystrip
ValueErrorclsvs     2/var/www/html/ai-nims-dev/backend/app/api/roles.pyname_must_not_be_emptyz(CreateRoleRequest.name_must_not_be_empty   s#     GGI:;;    c                     |j                         j                         j                  dd      }|t        vr!t	        ddj                  t                     |S N _zroleKey must be one of z, r   upperreplacer   r   joinr   s     r!   role_key_must_be_validz(CreateRoleRequest.role_key_must_be_valid#   sO     GGIOO%%c3/&&6tyyAS7T6UVWWr#   N)	__name__
__module____qualname__str__annotations__r   classmethodr"   r,    r#   r!   r   r      sL    
ILV   Y   r#   r   c                       e Zd ZU dZee   ed<   dZee   ed<    ed      e	d               Z
 ed      e	d               Zy)UpdateRoleRequestNr   r   c                 D    ||j                         }|st        d      |S r   r   r   s     r!   r"   z(UpdateRoleRequest.name_must_not_be_empty0   s(     =	A !>??r#   c                     |W|j                         j                         j                  dd      }|t        vr!t	        ddj                  t                     |S r%   r(   r   s     r!   r,   z(UpdateRoleRequest.role_key_must_be_valid9   sT     =	!))#s3A** #:499EW;X:Y!Z[[r#   )r-   r.   r/   r   r   r0   r1   r   r   r2   r"   r,   r3   r#   r!   r5   r5   ,   s^    D(3-!GXc]!V   Y   r#   r5   rolereturnc                     t        | j                        | j                  | j                  | j                  j                         dS )N)idr   r   	createdAt)r0   r;   r   role_key
created_at	isoformat)r8   s    r!   role_to_dictr@   E   s5    $''l		==__..0	 r#   requested_keycurrent_role_keyc                 v    | t        |      vr,t        t        j                  t        j
                  dd      y )NzYou cannot assign this role keyerrormessagestatus_codedetail)r   r   r   HTTP_403_FORBIDDENr   ROLE_KEY_NOT_ALLOWED)rA   rB   s     r!   ensure_role_key_assignablerL   N   s>    45EFF11$99<
 	
 Gr#   dbrole_idc                    K   | j                  t        t        j                               j	                  t
              j                  t
        j                  |k(               d {   }|j                         S 7 w)N)	executer   r	   countselect_fromr   whererN   scalar)rM   rN   results      r!   get_role_staff_countrV   Y   sY     ::tzz|((.44T\\W5LM F ==?s   A#A<%A:&A<staff_countc                 $    | dk(  rdnd}|  d| dS )N   zstaff member iszstaff members arer&   z2 already on this role. Please reassign them first.r3   )rW   
staff_words     r!   staff_in_use_messager[   `   s&    &1Q&6"<OJ]!J<'YZZr#    current_staffc                   K   t        |j                  dd            }t        t              j	                  t        j
                  j                  |            j                  t        j                        }| j                  |       d {   }|j                         j                         }d|D cg c]  }t        |       c}iS 7 =c c}w w)Nr8   r\   roles)r   getr   r   rS   r=   in_order_byr   rP   scalarsallr@   )rM   r]   assignable_keysqueryrU   r_   rs          r!   
list_rolesrh   g   s      /}/@/@/LMO8""8#4#4#8#8#IJSST\TaTabE::e$$FNN  "Eu5!l1o566 %5s$   BC
C'C2C
C
C)rH   bodyc                 @  K   |j                  d      t        vr,t        t        j                  t
        j                  dd      t        | j                  |j                  d             |j                  t        t              j                  t        j                  | j                  k(               d {   }|j                         r,t        t        j                  t
        j                   dd      t        t#        j$                         | j                  | j                        }|j'                  |       |j)                          d {    |j+                  |       d {    t,        j/                  d|j                         t1        |      S 7 7 J7 3w)Nr8   zOnly admins can create rolesrD   rG   Role already exists)r;   r   r=   zRole created: %s)r`   r   r   r   rJ   r   	FORBIDDENrL   r   rP   r   r   rS   r   scalar_one_or_noneHTTP_409_CONFLICTROLE_ALREADY_EXISTSuuiduuid4addcommitrefreshloggerinfor@   )ri   rM   r]   existingr8   s        r!   create_rolerx   w   s9      711(22?]^
 	
 t||]->->v-FGZZx 0 6 6x}}		7Q RSSH""$00(<<I^_
 	

 ::<YYD
 FF4L
))+
**T

KK"DII.! T s7   B4F6F7BFFF(F)0FFFz
/{role_id}c                   K   |j                  d      t        vr,t        t        j                  t
        j                  dd      |j                  %t        |j                  |j                  d             |j                  t        t              j                  t        j                  t        j                  |       k(               d {   }|j!                         }|s,t        t        j"                  t
        j$                  dd      |j&                  |j&                  |j&                  k7  r|j                  t        t              j                  t        j&                  |j&                  k(               d {   }|j!                         r,t        t        j(                  t
        j*                  dd      |j&                  |_        |j                  |j                  |_        |j/                          d {    |j1                  |       d {    t2        j5                  d|j&                         t7        |      S 7 ~7 7 M7 6w)Nr8   zOnly admins can update rolesrD   rG   Role not foundrk   zRole updated: %s)r`   r   r   r   rJ   r   rl   r   rL   rP   r   r   rS   r;   rp   UUIDrm   HTTP_404_NOT_FOUNDROLE_NOT_FOUNDr   rn   ro   r=   rs   rt   ru   rv   r@   )rN   ri   rM   r]   rU   r8   rw   s          r!   update_roler~      s      711(22?]^
 	
 ||"4<<1B1B61JK::fX.44X[[DIIgDV5VWXXF$$&D11(77DTU
 	

 yydii!7F8$4$:$:8==DII;U$VWW&&("44!,!@!@Mbc  II	||
))+
**T

KK"DII.- Y X sJ   C	II	B2I>I?BI III0IIIIz/{role_id}/staff-countc                 
  K   |j                  d      t        vr,t        t        j                  t
        j                  dd      |j                  t        t              j                  t        j                  t        j                  |       k(               d {   }|j                         }|s,t        t        j                  t
        j                   dd      t#        ||j                         d {   }d|iS 7 d7 
w)Nr8   zOnly admins can view role usagerD   rG   rz   
staffCount)r`   r   r   r   rJ   r   rl   rP   r   r   rS   r;   rp   r{   rm   r|   r}   rV   rN   rM   r]   rU   r8   rW   s         r!   get_role_staff_count_router      s       711(22?`a
 	

 ::fX.44X[[DIIgDV5VWXXF$$&D11(77DTU
 	

 -R99K+&& Y :s%   BDC?AD6D7	DDc                   K   |j                  d      t        vr,t        t        j                  t
        j                  dd      |j                  t        t              j                  t        j                  t        j                  |       k(               d {   }|j                         }|s,t        t        j                  t
        j                   dd      t#        ||j                         d {   }|dkD  r5t        t        j$                  t
        j&                  t)        |      d      |j+                  |       d {    |j-                          d {    t.        j1                  d|        y 7 7 7 77 !w)Nr8   zOnly admins can delete rolesrD   rG   rz   r   zRole deleted: %s)r`   r   r   r   rJ   r   rl   rP   r   r   rS   r;   rp   r{   rm   r|   r}   rV   rn   ROLE_IN_USEr[   deleters   ru   rv   r   s         r!   delete_roler      s9      711(22?]^
 	

 ::fX.44X[[DIIgDV5VWXXF$$&D11(77DTU
 	

 -R99KQ00(44AUVaAbc
 	

 ))D/
))+
KK"G,# Y : sJ   BFE=AF6E?7AF	F
F!F"F?FFF)7loggingrp   fastapir   r   r   r   sqlalchemy.ext.asyncior   
sqlalchemyr   r	   pydanticr
   r   typingr   app.core.depsr   r   app.models.mstr_roler   app.models.userr   app.constantsr   app.constants.role_keysr   r   r   	getLoggerr-   ru   routerr   r5   dictr@   r0   rL   r{   intrV   r[   r`   rh   postHTTP_201_CREATEDrx   putr~   r   r   HTTP_204_NO_CONTENTr   r3   r#   r!   <module>r      sB     = = / # /  3 )   % a a			8	$	
	 *	 2x D 
c 
S 
T 
< $))  [c [c [ Bv!"34777 7 RV445 v!"34
  6> L v!"34	$$
$ 	$ 	$ $N $% v!"34''' ' &'. |)C)CD v!"34--- - E-r#   