o
    "i                     @   s   d 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 ddlmZ deded	efd
dZded	efddZded	efddZded	efddZded	efddZded	efddZded	efddZd	efddZd	efddZd	efddZdS )z4
Permission checking dependencies for API endpoints
    )DependsHTTPExceptionstatus)User)get_current_user)check_permission)Callableresourceactionreturnc                    s$   t tfdtdtf fdd}|S )a  
    Create a dependency that requires specific permission

    Args:
        resource: Resource name (e.g., "knowledge_bases", "agents")
        action: Action name (e.g., "read", "create", "update", "delete")

    Returns:
        Dependency function

    Example:
        @router.post("/knowledge-bases")
        async def create_kb(
            kb: KBCreate,
            current_user: User = Depends(require_permission("knowledge_bases", "create"))
        ):
            ...
    current_userr   c                    s   | j }|s+ddlm} || jd}dd |D }tdd |D s)ttjddd}t| j| d	}|sCttjd
  d d| S )z%Check if user has required permissionr   get_user_rolesc                 S      g | ]}|d  qS 	role_code .0roler   r   ;/lsinfo/ai/hellotax_ai/base_platform/app/api/permissions.py
<listcomp>+       zBrequire_permission.<locals>.permission_checker.<locals>.<listcomp>c                 s       | ]}|d v V  qdS ))platform_adminplatform_userNr   r   coder   r   r   	<genexpr>-       zArequire_permission.<locals>.permission_checker.<locals>.<genexpr>z(Non-platform users must have a tenant_idstatus_codedetail)user_id	tenant_idr	   r
   zPermission denied: z on )	r$   app.core.permissionsr   idanyr   r   HTTP_403_FORBIDDENcasbin_check_permission)r   r$   r   
user_roles
role_codeshas_permissionr
   r	   r   r   permission_checker   s0   z.require_permission.<locals>.permission_checkerr   r   r   )r	   r
   r.   r   r-   r   require_permission   s   'r0   c                 C   
   t | dS )z#Require read permission on resourcereadr0   r	   r   r   r   require_readJ      
r5   c                 C   r1   )z%Require create permission on resourcecreater3   r4   r   r   r   require_createO   r6   r8   c                 C   r1   )z%Require update permission on resourceupdater3   r4   r   r   r   require_updateT   r6   r:   c                 C   r1   )z%Require delete permission on resourcedeleter3   r4   r   r   r   require_deleteY   r6   r<   c                 C   r1   )z&Require execute permission on resourceexecuter3   r4   r   r   r   require_execute^   r6   r>   c                 C   r1   )z7Require write permission on resource (alias for update)r9   r3   r4   r   r   r   require_writec   r6   r?   c                  C      t tfdtdtfdd} | S )z
    Require platform_admin or customer_admin role
    Uses Casbin role checking instead of deprecated user.role field

    Use this to replace: if current_user.role not in ["platform_admin", "customer_admin"]
    r   r   c                    sV   ddl m} | jpd}|| j|}dd |D }tdd |D s)ttjdd| S )	Nr   r   c                 S   r   r   r   r   r   r   r   r   u   r   z8require_admin.<locals>.admin_checker.<locals>.<listcomp>c                 s   r   ))r   customer_adminNr   r   r   r   r   r   w   r   z7require_admin.<locals>.admin_checker.<locals>.<genexpr>zAdmin access requiredr    )r%   r   r$   r&   r'   r   r   r(   r   r   r$   r*   r+   r   r   r   admin_checkerp   s   
z$require_admin.<locals>.admin_checkerr/   )rC   r   r   r   require_admini      rD   c                  C   r@   )z
    Require platform_admin role only
    Uses Casbin role checking instead of deprecated user.role field

    Use this to replace: if current_user.role != "platform_admin"
    r   r   c                    L   ddl m} | jpd}|| j|}dd |D }d|vr$ttjdd| S )Nr   r   c                 S   r   r   r   r   r   r   r   r      r   zJrequire_platform_admin.<locals>.platform_admin_checker.<locals>.<listcomp>r   zPlatform admin access requiredr    r%   r   r$   r&   r   r   r(   rB   r   r   r   platform_admin_checker      
z6require_platform_admin.<locals>.platform_admin_checkerr/   )rH   r   r   r   require_platform_admin   rE   rJ   c                  C   r@   )z
    Require customer_admin role
    Uses Casbin role checking instead of deprecated user.role field

    Use this to replace: if current_user.role != "customer_admin"
    r   r   c                    rF   )Nr   r   c                 S   r   r   r   r   r   r   r   r      r   zFrequire_tenant_admin.<locals>.tenant_admin_checker.<locals>.<listcomp>rA   zTenant admin access requiredr    rG   rB   r   r   r   tenant_admin_checker   rI   z2require_tenant_admin.<locals>.tenant_admin_checkerr/   )rK   r   r   r   require_tenant_admin   rE   rL   N)__doc__fastapir   r   r   app.models.userr   app.api.depsr   r%   r   r)   typingr   strr0   r5   r8   r:   r<   r>   r?   rD   rJ   rL   r   r   r   r   <module>   s     ?