U
    <¨h  ã                   @   sX   d dl mZmZ d dlmZ d dlmZmZmZm	Z	 d dl
m
Z
mZ G dd„ deƒZdS )é    )ÚDocumentÚPydanticObjectId)ÚField)ÚOptionalÚDictÚAnyÚList)ÚdatetimeÚ	timedeltac                
   @   sú  e Zd ZU eed< eed< dZee ed< ee	j
dZe	ed< dZeed< dZee	 ed	< dZeed
< dZee ed< eedZeeef ed< dZee ed< ee	j
dZe	ed< ee	j
dZe	ed< dZee	 ed< dZee ed< dZee ed< G dd„ dƒZG dd„ dƒZed2eeee ee ee ee d dœdd„ƒZed3eeee ee edœdd„ƒZ ed4eee!d  dœdd„ƒZ"ed5eee!d  d œd!d"„ƒZ#ed#œd$d%„Z$ed#œd&d'„Z%ed(œd)d*„Z&d+d,„ Z'ed-d.„ ƒZ(eeed  d/œd0d1„ƒZ)dS )6ÚUserRoleÚuser_idÚ	role_nameNÚassigned_by)Údefault_factoryÚassigned_atTÚ	is_activeÚ
expires_atÚis_permanentÚscopeÚ
conditionsÚnotesÚ
created_atÚ
updated_atÚ
revoked_atÚ
revoked_byÚrevocation_reasonc                   @   s   e Zd ZdZdS )zUserRole.ConfigTN)Ú__name__Ú
__module__Ú__qualname__Úarbitrary_types_allowed© r    r    úG/var/www/html/Mana-Pige/backend/account-service/app/models/user_role.pyÚConfig$   s   r"   c                   @   s    e Zd ZdZddddddgZdS )	zUserRole.SettingsÚ
user_rolesr   r   r   r   r   r   N)r   r   r   ÚnameÚindexesr    r    r    r!   ÚSettings'   s   úr&   )r   r   r   Úexpires_in_daysr   r   Úreturnc              	   Ã   s‚   |   | j|k| j|k| jdk¡I dH }|r8td|› ƒ‚d}d}	|rZt ¡ t|d }d}	| |||||	||d}
|
 ¡ I dH  |
S )zAssign a role to a userTNzUser already has role: ©ÚdaysF)r   r   r   r   r   r   r   )	Úfind_oner   r   r   Ú
ValueErrorr	   Úutcnowr
   Úsave)Úclsr   r   r   r'   r   r   Úexistingr   r   Ú	user_roler    r    r!   Úassign_role2   s.    ý
ù
zUserRole.assign_role)r   r   r   Úreasonr(   c                 Ã   sf   |   | j|k| j|k| jdk¡I dH }|s.dS d|_t ¡ |_||_||_t ¡ |_	| 
¡ I dH  dS )zRevoke a role from a userTNF)r+   r   r   r   r	   r-   r   r   r   r   r.   )r/   r   r   r   r3   r1   r    r    r!   Úrevoke_role\   s    	ý


zUserRole.revoke_role)r   Úactive_onlyr(   c                 Ã   sD   |r&|   | j|k| jdk¡ ¡ I dH S |   | j|k¡ ¡ I dH S dS )zGet all roles for a userTN)Úfindr   r   Úto_list)r/   r   r5   r    r    r!   Úget_user_rolesw   s    þzUserRole.get_user_roles)r   r5   r(   c                 Ã   sD   |r&|   | j|k| jdk¡ ¡ I dH S |   | j|k¡ ¡ I dH S dS )z"Get all users with a specific roleTN)r6   r   r   r7   )r/   r   r5   r    r    r!   Úget_role_users‚   s    þzUserRole.get_role_users)r(   c                 C   s   | j s
dS t ¡ | j kS )z#Check if role assignment is expiredF)r   r	   r-   ©Úselfr    r    r!   Ú
is_expired   s    zUserRole.is_expiredc                 C   s   | j o|  ¡  S )z!Check if role assignment is valid)r   r<   r:   r    r    r!   Úis_valid“   s    zUserRole.is_validr)   c                 Ã   sR   | j r|  j t|d7  _ nt ¡ t|d | _ d| _t ¡ | _|  ¡ I dH  dS )zExtend role expirationr)   FN)r   r
   r	   r-   r   r   r.   )r;   r*   r    r    r!   Úextend_expiration—   s    
zUserRole.extend_expirationc                 Ã   s(   d| _ d| _t ¡ | _|  ¡ I dH  dS )zMake role assignment permanentNT)r   r   r	   r-   r   r.   r:   r    r    r!   Úmake_permanent¢   s    
zUserRole.make_permanentc                 Ã   sf   |   | jt ¡ k | jdk¡ ¡ I dH }|D ]2}d|_t ¡ |_d|_t ¡ |_| 	¡ I dH  q*t
|ƒS )z!Clean up expired role assignmentsTNFZexpired)r6   r   r	   r-   r   r7   r   r   r   r.   Úlen)r/   Zexpired_rolesÚroler    r    r!   Úcleanup_expired_roles©   s    þ

zUserRole.cleanup_expired_roles)r   r(   c                 Ã   sX   ddl m} | ¡ I dH }|s"dS z| j||jddI dH W S  tk
rR   Y dS X dS )z!Assign default role to a new userr   )ÚRoleNzDefault role assignment)r   r   r   )Úapp.models.rolerC   Úget_default_roler2   r$   r,   )r/   r   rC   Údefault_roler    r    r!   Úassign_default_roleº   s    ýzUserRole.assign_default_role)NNNN)NN)T)T)*r   r   r   r   Ú__annotations__Ústrr   r   r   r	   r-   r   r   Úboolr   r   r   Údictr   r   r   r   r   r   r   r   r   r"   r&   ÚclassmethodÚintr2   r4   r   r8   r9   r<   r=   r>   r?   rB   rG   r    r    r    r!   r      sj   
    ùø)  ûú


r   N)Úbeanier   r   Úpydanticr   Útypingr   r   r   r   r	   r
   r   r    r    r    r!   Ú<module>   s   