o
    pj                     @  s   d Z ddlmZ ddlZddlmZ ddlmZmZ ddlm	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dlmZ ddlmZ eegdf Zd*d+ddZd,ddZd-ddZd,ddZd.d!d"Z	d*d/d(d)Z dS )0z3Application factory for the Flask platform runtime.    )annotationsN)Callable)datetimetimezone)Any)Flaskjsonifyrequest)text)Config)get_control_plane_engine)init_db_app)
APIGateway)platform_apitest_configdict[str, Any] | Nonereturnr   c                 C  s   t t}|jt |jjttddd d tddttdddd	d	d
 | r2|j|  t	| i |j
d< |t t|dd	 t| t| |S )zGBuild the complete platform application and record startup diagnostics.MAX_UPLOAD_MB20i   WP_INVOICES_UPLOAD_DIRz3/var/www/html/flask_server/data/wp_invoices/uploadsWP_INVOICES_DEFAULT_DPI220)wp_invoicesleave_form_appT)MAX_CONTENT_LENGTHr   r   REQUIRED_APPSCHECK_CONTROL_DB_READINESSREGISTER_BOOTSTRAP_SITESstartup_componentsr   )r   __name__configfrom_objectr   updateintosgetenvr   
extensionsregister_blueprintr   _record_component_register_business_apps_register_runtime_routes)r   app r,   &bridge_platform/runtime/app_factory.py
create_app   s,   

r.   r+   Nonec                 C  s   ddd fddd fddd ff}|D ]4\}}z| |  W n" t y@ } zt| |dt| | jd	| W Y d }~qd }~ww t| |d
 qd S )N
qr_servicec                   S  
   t ddS )Nzapps.qr_serviceregister_qr_service_import_registrarr,   r,   r,   r-   <lambda>7      
 z)_register_business_apps.<locals>.<lambda>r   c                   S  r1   )Nzapps.wp_invoicesregister_blueprintsr3   r,   r,   r,   r-   r5   ;   r6   r   c                   S  r1   )Nzapps.leave_form_appregister_leave_form_appr3   r,   r,   r,   r-   r5   ?   r6   Fz$Required app registration failed: %sT)	Exceptionr(   strlogger	exception)r+   registrationsapp_idregistrar_loaderexcr,   r,   r-   r)   3   s(   r)   module_pathr:   	attributeAppRegistrarc                 C  s"   ddl m} || }t||}|S )Nr   )import_module)	importlibrD   getattr)rA   rB   rD   module	registrarr,   r,   r-   r4   L   s   
r4   c                   sR   t   jdddgddfdd	} d
dd } d fdd}d S )Nz /api/v1/<app_name>/<path:action>GETPOST)methodsapp_namer:   actionc                   s     t| |S N)handler	   )rL   rM   )gatewayr,   r-   handle_gateway_requestW   s   z8_register_runtime_routes.<locals>.handle_gateway_requestz/healthc                   S  s   ddddS )z.Liveness: the WSGI process can serve requests.okflask_serverliveness)statusservicecheckr,   r,   r,   r,   r-   health[   s   z(_register_runtime_routes.<locals>.healthz/readyc                    s   t jdpi  tjdpd}  fdd| D }t}| o'|d }|r,dndd	d
ttj	
  |d}t||rCdfS dfS )z:Readiness: required apps and infrastructure are available.r   r   r,   c                   s$   g | ]}  |i  d ds|qS )readyF)get).0r>   
componentsr,   r-   
<listcomp>i   s    z;_register_runtime_routes.<locals>.ready.<locals>.<listcomp>rY   rR   	not_readyrS   	readiness)rU   rV   rW   
checked_atr]   control_database   i  )dictr&   rZ   tupler    _control_database_statusr   nowr   utc	isoformatr   )required_appsmissing_appsdatabaseready_statepayload)r+   r\   r-   rY   d   s   

z'_register_runtime_routes.<locals>.ready)rL   r:   rM   r:   )r   routerZ   )r+   rQ   rX   rY   r,   )r+   rP   r-   r*   T   s   
r*   dict[str, Any]c              
   C  s   | j ddsdddS z&t  }|td W d    n1 s$w   Y  W ddiS W ddiS  tyL } zdt|jdW  Y d }~S d }~ww )	Nr   Tdisabled)rY   rW   zSELECT 1F)rY   errorrY   )	r    rZ   r   connectexecuter
   r9   typer   )r+   
connectionr@   r,   r,   r-   rf   |   s   
rf   	componentrY   boolrr   
str | Nonec                 C  s&   d|i}|r
||d< || j d |< d S )NrY   rr   r   )r&   )r+   rw   rY   rr   stater,   r,   r-   r(      s   r(   rN   )r   r   r   r   )r+   r   r   r/   )rA   r:   rB   r:   r   rC   )r+   r   r   rp   )
r+   r   rw   r:   rY   rx   rr   ry   r   r/   )!__doc__
__future__r   r$   collections.abcr   r   r   typingr   flaskr   r   r	   
sqlalchemyr
   config.baser   config.control_planer   	config.dbr   #bridge_platform.gateway.api_gatewayr   $bridge_platform.gateway.platform_apir   rC   r.   r)   r4   r*   rf   r(   r,   r,   r,   r-   <module>   s*    



(