o
    i                      @   s"  d 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
mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddl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m Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( e  e e)Z*edddej+re
nddZ,ee, ee,ej-d ej.dkrddl/m0Z0 e,1e0 e,j1edd ddl2m3Z3 e,1e3 ddl4m5Z5 e,1e5 ej6re,j1eej7d  e*8d!ej9  e,j1eej9d"ej:ej;d# e,<d$d%efd&d'Z=e,>e"d%ed(e"fd)d*Z?e,>ed%ed(efd+d,Z@e,>eAd%ed(eAfd-d.ZBe,>ed%ed(efd/d0ZCe,>eAd%ed(eAfd1d.ZBe,Dd2d3d4 ZEe,Fd5d6d7 ZGe,Fd8d9d: ZHe,Fd;d<d= ZIdd>lJmKZK e,jLeKejMd? dd@lNmOZP e,jLePdAdBgdC e)dDkrddlQZQeQjRe,dEdFdG dS dS )Hz!
FastAPI Application Entry Point
    )FastAPI)CORSMiddleware)GZipMiddleware)RequestValidationError)ORJSONResponseJSONResponse)jsonable_encoder)Request)SQLAlchemyErrorIntegrityError)datetimeNsettings)init_db)LanguageMiddleware)setup_rate_limiting) setup_network_traffic_monitoring)setup_logging
get_logger)AppExceptionDatabaseError)ErrorResponseErrorDetail)RBACBootstrapServicezBase Platform API2.0.0z8Multi-tenant AI Platform with RAG and Agent capabilities)titleversiondescriptiondefault_response_class)enabled
production)CSRFMiddlewarezh_CN)default_locale)TenantContextMiddleware)ServiceGuardMiddleware)minimum_sizezCORS Origins: T)allow_originsallow_credentialsallow_methodsallow_headershttprequestc                    s2   t t }|| j_|| I dH }||jd< |S )u4   添加请求上下文（request_id）到每个请求NzX-Request-ID)struuiduuid4state
request_idheaders)r,   	call_nextr1   response r5   0/lsinfo/ai/hellotax_ai/base_platform/app/main.pyadd_request_contextL   s   
r7   excc                    sh   t | jdd}td| d|j d|j d| j d| j 
 t|j	|j|jd|t
  d	d
S )u   处理自定义应用异常r1   N[z] z:  -  codemessageerrorr1   	timestampstatus_codecontent)getattrr0   loggerr@   r=   r>   methodurlr   rC   r   utcnow	isoformatr,   r8   r1   r5   r5   r6   app_exception_handlerX   s   (
rL   c              
      s   t | jdd}td| dt| d| j d| j  t|tr)d}d}d	}nd
}d}d}t	|||d|t
  ddS )u   处理数据库异常r1   Nr9   z] Database error: r:   r;   i  CONSTRAINT_VIOLATIONu   数据库约束冲突  DATABASE_ERRORu   数据库操作失败r<   r?   rB   )rE   r0   rF   r@   r-   rG   rH   
isinstancer   r   r   rI   rJ   )r,   r8   r1   rC   r=   r>   r5   r5   r6   sqlalchemy_exception_handlern   s&   *

rQ   c              
      s\   t | jdd}td| dt| d| j d| j  tddd	d
|t	 
 ddS )u   处理未捕获的异常r1   Nr9   z] Unhandled exception: r:   r;   rN   INTERNAL_SERVER_ERRORu   服务器内部错误r<   r?   rB   )rE   r0   rF   	exceptionr-   rG   rH   r   r   rI   rJ   rK   r5   r5   r6   generic_exception_handler   s   *
rT   c                    sn   t d| j d| j  t d|   ddlm} |jdkr+tddd	id
S tddt	| id
S )zGLog detailed validation errors but return generic message in productionzValidation error for r;   zValidation errors: r   r   r    i  detailzInvalid request parametersrB   )
rF   r@   rG   rH   errors
app.configr   ENVIRONMENTr   r   r,   r8   r   r5   r5   r6   validation_exception_handler   s   
rZ   c                    sP   t jd| dd ddlm} |jdkrtddd	id
S tddt|id
S )zHandle unhandled exceptionszUnhandled exception: T)exc_infor   r   r    rN   rU   zInternal server errorrB   )rF   r@   rW   r   rX   r   r-   rY   r5   r5   r6   rT      s   

startupc               
      sj   ddl m} m} z|   |  W n ty& } z	td|   d}~ww t  t  t	d dS )zInitialize database on startupr   )validate_environmentprint_environment_infou#   ❌ Environment validation failed: Nu   ✅ Base Platform API started)
app.core.env_validatorr]   r^   	ExceptionrF   r@   r   r   bootstrap_legacy_rbac_stateinfo)r]   r^   er5   r5   r6   startup_event   s   
rd   /c                      s   ddddS )zRoot endpointBase Platform API is runningr   healthy)r>   r   statusr5   r5   r5   r5   r6   root   s
   ri   z/healthc                      s   dddS )z Health check endpoint for Dockerrg   rf   )rh   r>   r5   r5   r5   r5   r6   health_check   s   rj   z/metricsc                     sJ   zddl m} m} ddlm} ||  |dW S  ty$   ddi Y S w )zPrometheus metrics endpointr   )generate_latestCONTENT_TYPE_LATEST)Response)
media_typer@   zPrometheus client not installed)prometheus_clientrk   rl   starlette.responsesrm   ImportError)rk   rl   rm   r5   r5   r6   metrics   s   rr   )
api_router)prefix)routerz	/internalinternal)rt   tags__main__z0.0.0.0i@  )hostport)S__doc__fastapir   fastapi.middleware.corsr   starlette.middleware.gzipr   fastapi.exceptionsr   fastapi.responsesr   r   fastapi.encodersr   r	   sqlalchemy.excr
   r   r   r.   rW   r   app.db.init_dbr   app.core.i18n.middlewarer   app.middleware.rate_limitr   app.middleware.network_trafficr   app.core.loggingr   r   app.core.exceptionsr   r   app.schemas.commonr   r   *app.services.access.rbac_bootstrap_servicer   __name__rF   
USE_ORJSONappTRAFFIC_MONITORING_ENABLEDrX   app.core.security_utilsr!   add_middlewareapp.core.tenant_contextr$   app.middleware.service_guardr%   GZIP_COMPRESSION_ENABLEDGZIP_MINIMUM_SIZErb   CORS_ORIGINSCORS_METHODSCORS_HEADERS
middlewarer7   exception_handlerrL   rQ   r`   rT   rZ   on_eventrd   getri   rj   rr   
app.api.v1rs   include_router
API_V1_STRapp.api.internal.switch_moderu   internal_switch_routeruvicornrunr5   r5   r5   r6   <module>   s    






	


