
    8h                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ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 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$ 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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5  e,       Z6ede	fd       Z7 e	e*jp                  e*jr                  e*jt                  e7d      Z;e;jy                  d      dededefd       Z=e;j}                  edgddgdgdg        e;j                  ed!d"g#       e;j                  ed!d$g#       e;j                  ed!d%g#       e;j                  e d!d&g#       e;j                  e"d!d'g#       e;j                  e$d!d(g#       e;j                  e&d!d)g#       e;j                  e(d!d*g#       e;j                  e
      ded+e
defd,       Z@e;j                  e      ded+edefd-       ZAe;j                  eB      ded+eBdefd.       ZCe;j                  e-      ded+e-de
fd/       ZDe;j                  eE      ded+eEde
fd0       ZFe;j                  d1d2      d3eHde5fd4       ZIy)5    N)Callable)asynccontextmanager)FastAPIHTTPExceptionQueryRequestResponse)CORSMiddleware)FileResponseHTMLResponseJSONResponseStreamingResponse)StaticFiles)ProgrammingError)auth_router)admin_router)company_list_router)vessel_router)seafarer_router)tiket_router)course_list_router)company_mapping_router)settings)MongoDBSingleton)OperationalError) handle_generic_exception_handlerhandle_programming_errorhttp_exception_error_handler handel_operational_error_handlerhandel_attribute_error_handler)CustomResponse_appc                "   K   t         }d yw)zInitialize the application.N)mongodb_instance)r"   _s     $/var/www/html/beacon-api/app/main.pylifespanr'   '   s      	A	   T)titleversiondescriptionr'   debughttprequest	call_nextreturnc                    K   t        j                          } ||        d{   }t        j                          |z
  }t        |      |j                  d<   |S 7 5w)a  
    Add process time header to the response.

    Args:
        request (Request): The incoming request.
        call_next (Callable): The next callable in the middleware chain.

    Returns:
        Response: The response with added process time header.
    NzX-Process-Time)timestrheaders)r.   r/   
start_timeresponseprocess_times        r&   add_process_time_headerr8   9   sP      Jw''H99;+L),\):H%&O (s    AA6A*)allow_originsallow_credentialsallow_methodsallow_headersexpose_headersz/FASTAPIAUTH)prefixtagsADMINzCOMPANY LISTzVESSEL LISTzSEAFARERS LISTTIKETzCOURSE LISTzCOMPANY MAPPINGexcc                 "   K   t        | |      S w)zHandle HTTP exceptions.)r   r.   rD   s     r&   exception_handlerrG   `   s      (55r(   c                 6   K   t        | |       d{   S 7 w)z)Handle MySQL ProgrammingError exceptions.N)r   rF   s     r&   programming_error_handlerrI   f   s      *'37777   c                 6   K   t        | |       d{   S 7 w)zHandle generic exceptions.N)r   rF   s     r&   generic_exception_handlerrL   l   s      2'3????rJ   c                 6   K   t        | |       d {   7 wN)r   rF   s     r&   operational_error_handlerrO   r   s     0#>
>>
>rJ   c                 6   K   t        | |       d {   S 7 wrN   )r    rF   s     r&   attribute_error_handlerrQ   w   s     /====rJ   z/migrate)response_model_exclude_nonemessagec           	      L  K   	 t        j                  dddddj                  |       g       t        j                  g d       t        dd	      S # t         j                  $ r}t        d
t        |            d }~wt        $ r}t        d
t        |            d }~ww xY ww)Nalembicrevisionz--autogeneratez-mz"{}")rU   upgradehead1zMigration successful)statusrS   i  )status_codedetail)
subprocessrunformatr!   CalledProcessErrorr   r3   	Exception)rS   es     r&   run_migrationsrc   |   s     < 		:/?v}}U\G]^_*	
 S2HII(( <CF;; <CF;;<s5   B$AA B$B!$A::B!BB!!B$)Jioosr]   r2   collections.abcr   
contextlibr   fastapir   r   r   r   r	   fastapi.middleware.corsr
   fastapi.responsesr   r   r   r   fastapi.staticfilesr   sqlalchemy.excr   app.api.auth.routerr   app.api.admin.routerr   app.api.company_list.routerr   app.api.vessel_list.routerr   app.api.seafarer.routerr   app.api.tiket.routerr   app.api.course_list.routerr   app.api.company_mapping.routerr   
app.configr   app.database.main.mongor   r   app.exceptionsr   r   r   r   r    app.utils.schemas_utilsr!   r$   r'   PROJECT_NAMEAPI_VERSIONDESCRIPTIONapp
middlewarer8   add_middlewareinclude_routerrG   rI   ra   rL   rO   AttributeErrorrQ   getr3   rc        r&   <module>r      s   	 	   $ * D D 2 Y Y + + + - ; 4 3 - 9 A  ,  3#%  
 
 
 


  $$ 
 7 x H  $   %%%5     ;z  A   <
'  C   &j?O  P   =
-  I   ?*<L;M  N   <z	  B   %Z}o  N   )CTBU  V }%6W 6= 6\ 6 &6
 '(8W 8;K 8P\ 8 )8
 y!@W @9 @ @ "@
 '(?W ?;K ?P] ? )? ~&>7 > >= > '> 5<# < < 6<r   