
    Vh                        d dl Z d dl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 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m Z m!Z!m"Z" d dl#m$Z$  e       Z%edefd       Z& eejN                  ejP                  ejR                  e&d      Z*e*jW                  d      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ed!ed"efd#       Z/e*j_                  e      ded!ed"efd$       Z0e*j_                  e1      ded!e1d"efd%       Z2e*j_                  e      ded!ed"efd&       Z3e*j_                  e4      ded!e4d"efd'       Z5e*jm                  d(d)      d*e7d"e$fd+       Z8y),    N)asynccontextmanager)FastAPIHTTPExceptionRequest)CORSMiddleware)JSONResponse)ProgrammingError)auth_router)course_router)company_router)vessel_router)seafarer_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/beaconod-api/app/main.pylifespanr      s      	A	   T)titleversiondescriptionr   debughttprequestc                 ~  K   t        j                          }	  ||        d {   }t        j                          |z
  }t        |      |j                  d<   |S 7 5# t        $ r-}t        |j                  d|j                  i      cY d }~S d }~wt
        $ r"}t        ddt        |      i      cY d }~S d }~ww xY ww)Ndetail)status_codecontent  zX-Process-Time)timer   r   r'   r&   	Exceptionstrheaders)r$   	call_next
start_timeresponseexcprocess_times         r   add_process_time_headerr3   1   s     JK"7++ 99;+L),\):H%&O , Y(CJJAWXX KhC5IJJKs[   B=A AA 1B=A 	B:$"BB:B=B:B5/B:0B=5B::B=*)allow_originsallow_credentialsallow_methodsallow_headersexpose_headersz/FASTAPIAUTH)prefixtagsCourseCompanyVesselSeafarerr1   returnc                 "   K   t        | |      S w)zHandle HTTP exceptions.)r   r$   r1   s     r   exception_handlerrD   T   s      (55r   c                 6   K   t        | |       d{   S 7 w)z)Handle MySQL ProgrammingError exceptions.N)r   rC   s     r   programming_error_handlerrF   Z   s      *'37777   c                 6   K   t        | |       d{   S 7 w)zHandle generic exceptions.N)r   rC   s     r   generic_exception_handlerrI   `   s      2'3????rG   c                 6   K   t        | |       d {   7 wN)r   rC   s     r   operational_error_handlerrL   f   s     0#>
>>
>rG   c                 6   K   t        | |       d {   S 7 wrK   )r   rC   s     r   attribute_error_handlerrN   k   s     /====rG   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"{}")rR   upgradehead1zMigration successful)statusrP   r)   )r'   r&   )
subprocessrunformatr   CalledProcessErrorr   r,   r+   )rP   es     r   run_migrationsr]   p   s     < 		:/?v}}U\G]^_*	
 S2HII(( <CF;; <CF;;<s5   B$AA B$B!$A::B!BB!!B$)9rX   r*   
contextlibr   fastapir   r   r   fastapi.middleware.corsr   fastapi.responsesr   sqlalchemy.excr	   app.api.auth.routerr
   app.api.course.routerr   app.api.company.routerr   app.api.vessel.routerr   app.api.seafarer.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
middlewarer3   add_middlewareinclude_routerrD   rF   r+   rI   rL   AttributeErrorrN   getr,   r]        r   <module>rw      s     * 3 3 2 * + + / 1 / 3  ,  3#% 
 
 
 


  $$ 
 7      %%%5     ;z  A   =8*  E   >9+  F   =
(  D   ?*J<  H }%6W 6= 6\ 6 &6
 '(8W 8;K 8P\ 8 )8
 y!@W @9 @ @ "@
 '(?W ?;K ?P] ? )? ~&>7 > >= > '> 5<# < < 6<rv   