o
    ͿSi&                     @   s  d dl Z d dlZd dlZd dlmZ e sed ed 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mZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ d dl)m,Z, d dl)m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dl4mDZD d dlEmFZF eedZGg dZHeGIejJ eGjIeeHd d!gd!gd" eGIe eedZKeKjIed d!gd!gd# eGLe eGjMd$ed%d&d%d' eGjNejOd(d)gd* eGjNe jOd+d,gd* eGjNejOd-d.gd* eGjNejOd/d0gd* eGjNe#jOd1d2gd* eGjNe&jOd3d2gd* eGjNe$jOd4d5gd* eGjNe%jOd6d7gd* eGjNe"jOd8d9gd* eGjNe!jOd:d;gd* eGjNejOd<d=gd* eGjNe'jOd>d?gd* eGjNejOd@dAgd* eGjNejOdBdCgd* eGjNe1jOdDdEgd* eGjNe/jOdFdGgd* eGjNe,jOdHdIgd* eGjNe(jOdJdKgd* eGjNe+jOdHdLgd* eGjNe*jOdHdMgd* eGjNe-jOdHdNgd* dZdPdQZPeP  eGQdRdZdSdTZRdUgZSeGTdVdWe	fdXdYZUdS )[    N)load_dotenvz(Could not load .env file or it is empty.   )FastAPIRequestHTTPException)RedirectResponse)CORSMiddleware)StaticFiles)r   )InputSanitizationMiddleware)auth)SanitizedJSONResponse)accountssubscriptionssupportsupportcustomerusersroleslogin	dashboardauditrbacappflowpartnerscommoninvoiceszerodha)alertsteGPT)teGPT_hooks)market_intelligence)crud)crm)movers_refresh_loop)global_intraday_loop)paper_eod_loop)paper_intraday_exit_loop)market_intelligence_loop)stocks_master_refresh_loop)stock_history_refresh_loop)early_movers_refresh_loop)get_mongo_db)_get_global_zerodha_client)refresh_stocks_master)default_response_class)zhttps://localhost:3004z$https://cabf1e352845.ngrok-free.app/zhttps://dev.movex.aiT*)allow_originsallow_credentialsallow_methodsallow_headers)r0   r1   r2   z/publicpublic)	directorynamez/v1/accountsAccounts)prefixtagsz/v1/authLoginz	/v1/usersUsersz	/v1/rolesRolesz/v1/rbacRBACz
/v1/commonz/v1/appflowAppsz/v1/partnersPartnersz	/v1/auditAuditz/v1/dashboard	Dashboardz/v1/subscriptionsSubscriptionsz/v1/saasinvoiceszSaaS Invoicesz/v1/supportSupportz/v1/supportcustomerzCustomer Supportz
/v1/cx/crmCRMz/v1/crudCRUDz/v1/tradecozZerodha Trade Enginez/v1/settings/zerodhazZerodha SettingszChatGPT Trading EngineAlertszMarket Intelligencereturnc               	   C   s|   t ddpd  } | dv}|sdS dD ]%}zt|}|tj d|_|j	s1|
t  W q ty;   Y qw dS )zhReduce noisy INFO logs from third-party libraries.

    Controlled via `QUIET_LOGS` (default true).
    
QUIET_LOGStrue0falsenooffN)httpxhttpcoreopenaiurllib3F)osgetenvstriplowerlogging	getLoggersetLevelWARNING	propagatehandlers
addHandlerNullHandler	Exception)rawenabledr6   
lib_logger rc   "/var/www/html/Trade-python/main.py#_configure_quiet_dependency_loggersk   s    
re   startupc            
         sN  t ddpd  } | dv}|std dS t ddp d }|r/dd	 |d
D nt   r>tdt   ntd t  dt	dt
f fdd}|dr|drt ddp_d  dv}|rz=t D ]7}t|}|sztd  n*td t||dgdd}td|d d|d d|d d |d!   W n ty   td" Y nw |d#rtt d$d%}tt|d& |d'rtt d(d)pd)}	tt|	d& |d*rttd+d& |d,rttd+d& |d-rttd.d& |drtt  |drtt  |d/r%tt  dS dS )0zStart background tasks when the FastAPI app boots.

    Currently this kicks off a periodic ET movers refresh loop, which
    scrapes Economic Times top gainers/losers and keeps the `movers`
    collection up to date during IST market hours.
    ENABLE_BACKGROUND_JOBSrI   rJ   zG[Startup] ENABLE_BACKGROUND_JOBS=false -> background loops are DISABLEDNBACKGROUND_JOBS_ONLY c                 S   s    h | ]}|  r|   qS rc   rU   rV   ).0src   rc   rd   	<setcomp>   s     z!startup_events.<locals>.<setcomp>,zI[Startup] ENABLE_BACKGROUND_JOBS=true -> starting ONLY background loops: zB[Startup] ENABLE_BACKGROUND_JOBS=true -> starting background loopsr6   rG   c                    s     p
|     v S )Nrj   r5   onlyrc   rd   _enabled   s   z startup_events.<locals>._enabledstocks_masterstock_history&BOOTSTRAP_STOCKS_MASTER_BEFORE_HISTORY1zE[Startup] Stocks bootstrap skipped: global Zerodha client unavailablez?[Startup] Bootstrapping stocks master (one-time) before historyNSET)dbzerodha_client	exchangesallow_cache_writez2[Startup] Stocks master bootstrap done | inserted=insertedz	 updated=updatedz kept=keptz instruments=instrumentsz@[Startup] Stocks master bootstrap failed (continuing with loops)movers_refreshMOVERS_REFRESH_INTERVAL_SECONDS600)interval_secondsglobal_intraday GLOBAL_INTRADAY_INTERVAL_SECONDS900paper_intraday_exit<   	paper_eodr   i  early_movers)rS   rT   rU   rV   printsplitsetsortedre   strboolr*   r+   r,   getr_   intasynciocreate_taskr"   r#   r%   r$   r&   r'   r(   r)   )
raw_flagenable_background_jobsonly_rawrq   	bootstraprw   r   resmovers_refresh_intervalglobal_intraday_intervalrc   ro   rd   startup_events   sf   
2



r   z	127.0.0.1httprequestc                    sH   | j j}| jjds| jjdr|tvrtddd|| I d H S )Nz/docsz/redoci  	Forbidden)status_codedetail)clienthosturlpath
startswithallowed_ipsr   )r   	call_next	client_iprc   rc   rd   restrict_access   s   r   )rG   N)VrS   r   rW   dotenvr   r   exitfastapir   r   r   fastapi.responsesr   fastapi.middleware.corsr   fastapi.staticfilesr	   starlette.exceptionsStarletteHTTPExceptionapp.middlewarer
   app.v1.dependenciesr   app.utils.responsesr   app.v1.routers.saasr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   app.v1.routers.platformr   r   r   r   app.v1.routersr    app.v1.routers.cxr!    app.v1.background.movers_refreshr"   !app.v1.background.global_intradayr#   app.v1.background.paper_eodr$   %app.v1.background.paper_intraday_exitr%   %app.v1.background.market_intelligencer&   'app.v1.background.stocks_master_refreshr'   'app.v1.background.stock_history_refreshr(   &app.v1.background.early_movers_refreshr)   app.db.databaser*   r+   app.v1.services.stocks_masterr,   apporiginsadd_middlewareAuthMiddlewareopen_cors_routerexception_handlermountinclude_routerrouterre   on_eventr   r   
middlewarer   rc   rc   rc   rd   <module>   s    D




U