o
    #jP-                  	   @   s   d Z ddlmZ ddlmZmZmZmZ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 dd	ee d
efddZdd	ee d
efddZd d	ee d
efddZ				d!deee  deee  deee  d
efddZd"ded
efddZdS )#z
Flask route decorators for automatic request validation using Pydantic
Provides Laravel-style validation decorators for Flask routes
    wraps)TypeOptionalCallableAnyDict)requestjsonify)	BaseModelValidationError)ValidationException)ApiResponseThe given data was invalid.schemamessagec                       dt dt f fdd}|S )a  
    Decorator to validate JSON request body using Pydantic schema

    Args:
        schema: Pydantic BaseModel class for validation
        message: Custom error message for validation failures

    Usage:
        @validate_json(ActiveUsersRequest)
        def get_active_users(validated_data):
            # validated_data is now an ActiveUsersRequest instance
            pass
    freturnc                       t   fdd}|S )Nc               
      s   z$t jdd}|d u rtddgidd
i |} | d|i|W S  tyD } zt|}t|j|j	W  Y d }~S d }~w ty] } zt|j|j	W  Y d }~S d }~w t
yz } ztjdt| dd	W  Y d }~S d }~ww )NTsilentjsonz$Request must contain valid JSON datazInvalid JSON datavalidated_jsonzValidation failed:   status_code )r	   get_jsonr   from_custom_errorsr   from_pydantic_errorr   validation_errorerrorsr   	Exceptionerrorstr)argskwargs	json_datavalidated_dataevalidation_exceptionr   r   r   r   7/var/www/html/oms-prod-mcp/app/decorators/validation.pydecorated_function   s(   $z<validate_json.<locals>.decorator.<locals>.decorated_functionr   r   r.   r   r   r   r-   	decorator   s   z validate_json.<locals>.decoratorr   r   r   r2   r   r0   r-   validate_json   s   "r5   Invalid query parameters.c                    r   )ay  
    Decorator to validate query parameters using Pydantic schema

    Args:
        schema: Pydantic BaseModel class for validation
        message: Custom error message for validation failures

    Usage:
        @validate_query(PaginationRequest)
        def get_items(validated_query):
            # validated_query contains validated query parameters
            pass
    r   r   c                    r   )Nc               
      s"  z:t j }| D ]\}}| rt|||< q
| dv r'| dk||< q
di |} |g| R i |W S  tyZ } zt	|}t
|j|jW  Y d }~S d }~w tys } zt
|j|jW  Y d }~S d }~w ty } zt
jdt| ddW  Y d }~S d }~ww )Ntruefalser8   zQuery validation failed: r   r   r   )r	   r&   to_dictitemsisdigitintlowerr   r   r    r   r!   r"   r   r#   r$   r%   )r&   r'   
query_datakeyvaluer)   r*   r+   r,   r   r-   r.   P   s*   
$z=validate_query.<locals>.decorator.<locals>.decorated_functionr   r/   r0   r1   r-   r2   O   s   z!validate_query.<locals>.decoratorr3   r4   r   r0   r-   validate_queryA   s    rB   Invalid form data.c                    r   )ar  
    Decorator to validate form data using Pydantic schema

    Args:
        schema: Pydantic BaseModel class for validation
        message: Custom error message for validation failures

    Usage:
        @validate_form(UserRegistrationRequest)
        def register_user(validated_form):
            # validated_form contains validated form data
            pass
    r   r   c                    r   )Nc               
      s   z)t j }t jrt j D ]\}}|||< qdi |} |g| R i |W S  tyI } zt|}t	|j
|jW  Y d }~S d }~w tyb } zt	|j
|jW  Y d }~S d }~w ty } ztjdt| ddW  Y d }~S d }~ww )NzForm validation failed: r   r   r   )r	   formr:   filesr;   r   r   r    r   r!   r"   r   r#   r$   r%   )r&   r'   	form_datar@   filer)   r*   r+   r,   r   r-   r.      s$   

$z<validate_form.<locals>.decorator.<locals>.decorated_functionr   r/   r0   r1   r-   r2      s   z validate_form.<locals>.decoratorr3   r4   r   r0   r-   validate_formr   s   rH   NValidation failed.json_schemaquery_schemaform_schemac                    s    dt dt f fdd}|S )a  
    Decorator to validate multiple data sources (JSON, query, form) using different schemas

    Args:
        json_schema: Pydantic schema for JSON body validation
        query_schema: Pydantic schema for query parameters validation
        form_schema: Pydantic schema for form data validation
        message: Custom error message for validation failures

    Usage:
        @validate_multiple(
            json_schema=ContentStatsRequest,
            query_schema=PaginationRequest
        )
        def get_content_stats(validated_json=None, validated_query=None, validated_form=None):
            # Each validated parameter contains the respective validated data
            pass
    r   r   c                    s    t   fdd}|S )Nc               
      s  zxd }d }d }rt jdd}|d urd	i |}rLt j }| D ]\}}| r4t|||< q%| dv rB| dk||< q%|rLd	i |}rmt j }	t j	rdt j	 D ]\}}
|
|	|< q[|	rmd	i |	} | |||d|W S  t
y } zt|}t|j|jW  Y d }~S d }~w ty } zt|j|jW  Y d }~S d }~w ty } ztjdt| ddW  Y d }~S d }~ww )
NTr   r7   r8   )r   validated_queryvalidated_formz Multi-source validation failed: r   r   r   )r	   r   r&   r:   r;   r<   r=   r>   rD   rE   r   r   r    r   r!   r"   r   r#   r$   r%   )r&   r'   r   rM   rN   r(   r?   r@   rA   rF   rG   r*   r+   )r   rL   rJ   r   rK   r   r-   r.      sX   


$z@validate_multiple.<locals>.decorator.<locals>.decorated_functionr   r/   rL   rJ   r   rK   r1   r-   r2      s   6z$validate_multiple.<locals>.decoratorr3   )rJ   rK   rL   r   r2   r   rO   r-   validate_multiple   s   9rP    Business rule validation failed.validator_funcc                    s   dt dt f fdd}|S )a  
    Decorator for custom business logic validation

    Args:
        validator_func: Function that takes request data and returns True if valid,
                       raises ValidationException if invalid
        message: Custom error message for validation failures

    Usage:
        def validate_user_permissions(data):
            if not user_has_permission(data.user_id, 'read_reports'):
                raise ValidationException.from_custom_errors(
                    {"user_id": ["User does not have permission to access reports"]},
                    "Permission denied"
                )
            return True

        @validate_business_rules(validate_user_permissions)
        def get_reports(validated_data):
            pass
    r   r   c                    s   t   fdd}|S )Nc               
      s   z,d }| rt | d dr| d }ntjddp tj p tj }|  | i |W S  tyF } zt|j	|j
W  Y d }~S d }~w tyc } ztjdt| ddW  Y d }~S d }~ww )Nr   __dict__Tr   z!Business rule validation failed: r   r   )hasattrr	   r   rD   r:   r&   r   r   r!   r"   r   r#   r$   r%   )r&   r'   r)   r*   )r   rR   r   r-   r.     s   
 $zFvalidate_business_rules.<locals>.decorator.<locals>.decorated_functionr   r/   rR   r1   r-   r2   
  s   z*validate_business_rules.<locals>.decoratorr3   )rR   r   r2   r   rU   r-   validate_business_rules   s   rV   )r   )r6   )rC   )NNNrI   )rQ   )__doc__	functoolsr   typingr   r   r   r   r   flaskr	   r
   pydanticr   r   #app.exceptions.validation_exceptionr   app.utils.response_helperr   r%   r5   rB   rH   rP   rV   r   r   r   r-   <module>   s0    31/



T