U
    t;h1                     @   sr   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
 d dlmZ G dd deeZG dd	 d	eZd
S )    )DocumentPydanticObjectId)Field)OptionalListDictAny)datetime)Enumc                   @   s   e Zd ZdZdZdZdZdS )RoleTypesystemZcustomZ
departmentprojectN)__name__
__module____qualname__SYSTEMCUSTOMZ
DEPARTMENTZPROJECT r   r   B/var/www/html/Mana-Pige/backend/account-service/app/models/role.pyr      s   r   c                   @   s  e Zd ZU eddddZeed< eed< dZee ed< e	j
Ze	ed	< d
Zeed< dZeed< dZeed< eedZee ed< dZee ed< eedZee ed< dZee 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d< ee dZ!e"ee#f ed< G dd dZ$G dd dZ%e&d d! Z'ee d"d#d$Z(ed%d&d'Z)ed%d(d)Z*ed"d*d+Z+ed"d,d-Z,eed.d/d0Z-ed  d"d1d2Z.ed  d"d3d4Z/e&ed  d"d5d6Z0dS )7Role.   2   )
min_length
max_lengthnamedisplay_nameNdescription	role_typeT	is_activeF
is_defaultis_system_role)default_factorypermissionsparent_rolechild_roles	max_users
expires_at
created_at
updated_at
created_bycolorr   prioritycustom_propertiesc                   @   s   e Zd ZdZdS )zRole.ConfigTN)r   r   r   arbitrary_types_allowedr   r   r   r   Config.   s   r.   c                   @   s"   e Zd ZdZdddddddgZd	S )
zRole.SettingsZrolesr   r   r   r   r    r'   r+   N)r   r   r   r   indexesr   r   r   r   Settings1   s   r0   c                    s   dddt jdddddd	d
dddgddddt jdddddd	d
dgddddt jddddd	gddddt jddddd d!gd"	d#d$d%t jdd&d'g dg}|D ]:}| | j|d( kI d)H }|s| f |}| I d)H  qd)S )*zCreate default system rolesZsuper_adminzSuper Administratorz'Full system access with all permissionsTi  z#FF0000zsystem.adminz
user.adminzprofile.read.allzprofile.write.allzanalytics.readzsystem.settings.readzsystem.settings.write)r   r   r   r   r    r+   r*   r"   adminAdministratorz(Administrative access to user managementi  z#FFA500z	user.readz
user.writeZ	moderatorZ	Moderatorz&Content moderation and user managementi   z#00FF00userzRegular Userz$Standard user with basic permissionsd   z#0000FFzprofile.read.ownzprofile.write.own)	r   r   r   r   r    r   r+   r*   r"   ZguestZGuestzLimited access for guest usersr   z#808080r   N)r   r   find_oner   save)clsZsystem_rolesZ	role_dataexistingroler   r   r   create_system_roles=   s    J
zRole.create_system_roles)returnc                    sL   t | j}| jrDttj| jkI dH }|rD| I dH }|| t|S )z9Get all permissions including inherited from parent rolesN)	setr"   r#   r   r5   r   get_all_permissionsupdatelist)selfZall_permissionsparentZparent_permissionsr   r   r   r=      s    

zRole.get_all_permissions)permission_namec                    s2   || j kr.| j | t | _|  I dH  dS )zAdd a permission to this roleN)r"   appendr	   utcnowr(   r6   r@   rB   r   r   r   add_permission   s    

zRole.add_permissionc                    s2   || j kr.| j | t | _|  I dH  dS )z"Remove a permission from this roleN)r"   remover	   rD   r(   r6   rE   r   r   r   remove_permission   s    

zRole.remove_permissionc                    s0   ddl m} ||j| jk|jdk I dH S )z"Get number of users with this roler   )UserRoleTN)app.models.user_rolerI   find	role_namer   r   count)r@   rI   r   r   r   get_user_count   s
    
zRole.get_user_countc                    s"   | j s
dS |  I dH }|| j k S )z+Check if role can be assigned to more usersTN)r%   rN   )r@   Zcurrent_countr   r   r   can_assign_to_user   s    zRole.can_assign_to_user)rB   r;   c                 C   s
   || j kS )z'Check if role has a specific permission)r"   rE   r   r   r   has_permission   s    zRole.has_permissionc                    s0   | j s
g S tdd| j iitjdk I dH S )zGet all child rolesr   z$inTN)r$   r   rK   r   to_listr@   r   r   r   get_child_roles   s    zRole.get_child_rolesc                    s"   | j s
dS ttj| j kI dH S )zGet parent role if existsN)r#   r   r5   r   rR   r   r   r   get_parent_role   s    zRole.get_parent_rolec                    s   |  | jdk| jdkI dH S )z"Get the default role for new usersTN)r5   r   r   )r7   r   r   r   get_default_role   s    zRole.get_default_role)1r   r   r   r   r   str__annotations__r   r   r   r   r   r   boolr   r    r?   r"   r   r#   r$   r%   intr&   r	   rD   r'   r(   r)   r   r*   r+   dictr,   r   r   r.   r0   classmethodr:   r=   rF   rH   rN   rO   rP   rS   rT   rU   r   r   r   r   r      s@   

R
r   N)beanier   r   pydanticr   typingr   r   r   r   r	   enumr
   rV   r   r   r   r   r   r   <module>   s   