
    ghO                        d dl mZmZmZ d dlmZmZmZm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 d dlmZmZmZ d dlmZmZmZmZ d d	lmZ d d
lmZmZ d dlm Z   ejB                  e"      Z#d dl$m%Z%  e%       Z&e#jO                  d        ejP                  ddg      e d               Z)d5de*de+de,fdZ- ejP                  ddg      d        Z. ejP                  ddg      d        Z/ ejP                  dddg      d        Z0 ejP                  ddg      e d               Z1 ejP                  dd g      e d!               Z2 ejP                  d"d g      e d#               Z3 ejP                  d$dg      e d%               Z4 ejP                  d&ddg      e d'               Z5 ejP                  d(d dg      e d)               Z6 ejP                  d*ddg      e d+               Z7 ejP                  d,g d-      e d.               Z8 ejP                  d/ddg      e d0               Z9 ejP                  d1dg      e d2               Z: ejP                  d3dg      e d4               Z;y)6    )requestjsonifycurrent_app)login_requiredcurrent_user
login_userlogout_userNdatetime)db)api_bp)DatabaseConnectionDatabaseSchemaQueryHistory)SubscriptionUserSubscriptionPlan
QueryUsage)AIModelFactory)encrypt_passworddecrypt_password)token_required)DatabaseConnectorz9Database connector initialized successfully in API routesz/models/availableGET)methodsc                  @   t         j                  } ddddg}t        j                  j	                  | j
                        j                         }|st        d|d      S t        j                  j	                  |j                        j                         }|r|j                  st        d|d      S |j                  }|j                  d	      d
k(  r|j                  dddd       |j                  d      d
k(  r|j                  dddd       t        d|d      S )z9Get available AI models based on user's subscription plandeepseekzDeepSeek R1z-DeepSeek SQL model for general SQL generation)idnamedescriptionuser_idT)successmodelsplan_idopenai_modelsYesopenaizOpenAI GPT-4z0OpenAI's GPT-4 model for advanced SQL generationclaude_modelsclaudezClaude 3z6Anthropic's Claude 3 model for advanced SQL generation)r   r   r   query	filter_byr   firstr   r   r&   featuresgetappend)r   available_modelssubscriptionplanr/   s        /var/www/html/app/api/routes.pyget_available_modelsr6      s8   
 ''L
 !J	
  %%///HNNPL&
  	 !!++L4H4H+IOOQDt}}&
  	 }}H ||O$-"M!
 	 ||O$-S!
 	 "      messagestatus_codereturnc                 H    d| d}|j                  |       t        |      |fS )a  Helper function to create standardized error responses
    
    Args:
        message: Error message
        status_code: HTTP status code
        **kwargs: Additional key-value pairs to include in the response
        
    Returns:
        Tuple with JSON response and status code
    Fr#   r8   )updater   )r8   r9   kwargsresponses       r5   error_responser@   T   s/     H OOF8k))r7   z/auth/logoutPOSTc                     t         j                  j                  d      } | rz| j                  d      ri| j	                  d      d   }t
        j                  j                  |      j                         }|r%d|_	        t        j                  j                          t        j                  r
t                t!        ddd	      S )
zAPI endpoint for user logoutAuthorizationzBearer     )
auth_tokenNTzLogged out successfullyr<   )r   headersr0   
startswithsplitr   r,   r-   r.   rF   r   sessioncommitr   is_authenticatedr	   r   )auth_headertokenusers      r5   
api_logoutrP   l   s     //%%o6K{--i8!!#&q)zz##u#5;;="DOJJ $$,  r7   z/auth/registerc                     ddl m}  t        j                         }|st	        d      S g d}|D ]  }||vst        dd| d      dfc S  | j                  j                  |d	   
      j                         rt        ddd      dfS | j                  j                  |d         j                         rt        ddd      dfS  | |d	   |d   |j                  dd      |j                  dd      |j                  dd      |j                  dd            }|j                  |d          t        j                  j                  |       t        j                  j                          t        ddd      S )zRegister a new userr   r   No data provided)emailusernamepasswordFMissing required field: r<     rT   rT   zEmail already registeredrU   )rU   zUsername already taken
first_name 	last_namecompany	job_title)rT   rU   rZ   r\   r]   r^   rV   TzRegistration successful)app.auth.modelsr   r   get_jsonr@   r   r,   r-   r.   r0   set_passwordr   rJ   addrK   )r   datarequired_fieldsfieldrO   s        r5   auth_registerrf      s    %D011 8O   5eW=    zz$w-06681
   	
 zzT*%56<<>/
   	 7mj!88L"-((;+B'((;+D 	d:&'JJNN4JJ,  r7   z/auth/loginOPTIONSc                     t         j                  dk(  ryddlm}  ddl}t        j
                         }|st        d      S ddg}|D ]  }||vst        d	d
| d      dfc S  | j                  j                  |d         j                         }|r|j                  |d         st        d	dd      dfS |j                  st        d	dd      dfS |j                  d      }||_        t        j                          |_        t$        j&                  j)                          t+        ||j-                  dd	             t.        j1                  d|j2                   d|j4                   dt6        j8                          ddlm} |j                  j                  |j2                        j                         }t        dd||j2                  |j4                  |j<                  |j>                  xs d|j@                  xs d|jB                  xs d|jD                  xs d|jF                  |r|jH                  nd|r|jJ                  nd|r|jL                  nddd	d      }	|	S )zLogin a userrg   r[      r   rR   NrS   rT   rV   FrW   r<   rX   rY   zInvalid email or password  z1Your account is inactive. Please contact support.    remember)rm   zUser z (z') logged in successfully. Auth status: )r   r!   TzLogin successfulr[   r&   status	is_annual)	r   rT   rU   rZ   r\   r]   r^   is_adminr3   )r#   r8   rN   rO   )'r   methodr_   r   secretsr`   r@   r   r,   r-   r.   check_password	is_active	token_hexrF   r   utcnow
last_loginr   rJ   rK   r   r0   loggerinfor   rT   r   rL   r   rU   rZ   r\   r]   r^   rq   r&   ro   rp   )
r   rs   rc   rd   re   rO   rN   r   r3   r?   s
             r5   
auth_loginr{      sU    ~~"$D011 
+O   5eW=    ::d7m4::<D t**4
+;<2
   	 >>J
   	 b!EDO oo'DOJJ tdhhz59: KK%y4::,.UVbVsVsUtuv -%%///@FFHL%''ZZ///R-2||)r-23?<//T1=,--47C\33
	 H, Or7   c                      ddl m}  t        j                  r)dt        _        t
        j                  j                          t                t        ddd      S )zLogout the current userr   rR   NTzLogout successfulr<   )
r_   r   r   rL   rF   r   rJ   rK   r	   r   rR   s    r5   auth_logoutr}   	  sI     % $$"&


 M&  r7   z/auth/profilePUTc                  @   t        j                         } | st        d      S d| v r| d   t        _        d| v r| d   t        _        d| v r| d   t        _        d| v r| d   t        _        t        j                  j                          t        ddt        j                  t        j                  t        j                  t        j                  xs dt        j
                  xs dt        j                  xs dt        j                  xs dt        j                  d	d
      S )Update user profilerS   rZ   r\   r]   r^   TProfile updated successfullyr[   )r   rT   rU   rZ   r\   r]   r^   rq   r#   r8   rO   )r   r`   r@   r   rZ   r\   r]   r^   r   rJ   rK   r   r   rT   rU   rq   )rc   s    r5   update_profiler     s     D011 t"&|"4d!%k!2D#Id!%k!2JJ1//!''$--&117R%//52#++1r%//52$--	
  r7   z/auth/passwordc                     t        j                         } | st        d      S g d}|D ]  }|| vst        dd| d      dfc S  t	        j
                  | d         st        ddd      dfS | d	   | d
   k7  rt        ddd      dfS t	        j                  | d	          t        j                  j                          t        ddd      S )zChange user passwordrS   )current_passwordnew_passwordconfirm_passwordFrW   r<   rX   r   Current password is incorrectr   r   zNew passwords do not matchTzPassword changed successfully)
r   r`   r@   r   r   rt   ra   r   rJ   rK   )rc   rd   re   s      r5   change_passwordr   @  s    D011 OO   5eW=    &&t,>'?@6
   	 Nt$6773
   	 d>23JJ2  r7   z/history/countc                      t        t        dt              } t        j                  j                  | j                        j                         }t        d|d      S )z/Get total count of queries for the current userr   r!   T)r#   count)	getattrr   r   r   r,   r-   r   r   r   )rO   r   s     r5   get_query_countr   k  sR    
 7NL9D (((9??AE  r7   z/historyc                     t         j                  dk(  ryt        t         dt              } | rt	        | d      st        ddd      dfS t         j                  j                  d	d
t              }t         j                  j                  ddt              }t         j                  j                  dt              }t         j                  j                  dt              }t         j                  j                  dd      }t        j                  j                  | j                        }|r|j                  |      }||j                  |      }|red| d}|j                  t        j                   t        j"                  j%                  |      t        j&                  j%                  |                  }|j)                  t        j*                  j-                               }|j/                         }|dkD  r||z   d
z
  |z  nd
}	||	kD  rt        dg |||||	dd      S 	 |j1                  ||      }
g }|
j:                  D ]  }|j=                  |j                  |j>                  |j"                  |j&                  |j@                  |jB                  |jD                  |jF                  |jH                  |jJ                  |j*                  jM                         d        t        d||
jN                  |
jP                  |
jR                  |
jN                  |
jT                  dd      S # t2        $ r@}t4        j7                  dt9        |              t        dg |d
|||	dd      cY d}~S d}~ww xY w)z"Get query history for current userrg   ri   r   r   FAuthentication requiredr<   rk   pagerE   )typeper_page
   connection_idis_favoritesearchr[   r!   )r   N)r   %r   T)r   r   totalpages)r#   historytotal_count
pagination)r   r   zPagination error: )r   r   natural_language_querygenerated_sqlexecution_timeis_successfulerror_messager   
model_typecredit_consumed
created_at)+r   rr   r   r   hasattrr   argsr0   intboolr   r,   r-   r   filterr   or_r   iliker   order_byr   descr   paginate	Exceptionry   errorstritemsr1   r   r   r   r   r   r   r   	isoformatr   r   r   r   )rO   r   r   r   r   r   r,   search_termr   total_pagesr   er   items                 r5   get_query_historyr   z  s>   
 ~~" 7NL9D wtT*0
   	 <<FAC0D||
BS9H LL$$_3$?M,,""=t"<K\\h+F (((9Em<K8 &mFF3399+F**00=
 NN<22779:E ++-K ?JAo;)A-(:STK k&$$$		

 
 
	^^^A
$ G   ''!//&*&A&A!//"11!//!//++//#33//335
 	 !''OO"++%%%%	
	
 
 
C  )#a&23&$$$		

 
 
		s   !L' '	M005M+%M0+M0z/profilec                     t         j                  dk(  ryt        t         dt              } | rt	        | d      st        ddd      dfS t        d	t        t         j                               t        d
t         j                         t        dt         j                         t        dt         j                         	 t        j                         }t        d|       |st        d       t        ddd      dfS t        d| j                   d| j                          t        d| j                    d| j"                   d| j$                   d| j&                   d	       t        d|        t        d       t        d| j                          t        d| j                    d       t        d| j"                   d       t        d| j$                   d       t        d| j&                   d       d |v rc|d    j)                  d!d"      }|r|d#   nd$| _        t+        |      d"kD  r|d"   nd$| _        t        d%| j                    d| j"                   d       d&|v r#|d&   | _        t        d'| j$                   d       d(|v r#|d(   | _        t        d)| j&                   d       t        d*       t        d| j                          t        d| j                    d       t        d| j"                   d       t        d| j$                   d       t        d| j&                   d       d+|v r<d,|v r8| j-                  |d+         st        dd-d      dfS | j/                  |d,          	 d#d.lm} d#d/lm} t        d0       t8        j:                  j=                  |        d#d1lm }  || d2        || d3        || d&        || d(       t        d4       t8        j:                  jC                          t        d5       t        d6       t8        jD                  }|jG                         5 } |d7      }	|jI                  |	| j                   | j"                  | j$                  | j&                  | j                  d8      }
|jC                          t        d9|
jJ                   d:       ddd       t        d;       t8        j:                  jM                          t        d<| j                          tN        jP                  jS                  | j                        }|rAt        d=|j                    d|j"                   d|j$                   d|j&                   d	       nt        d>       |} t        dBdC| j                  | j                   | j"                  | j                  | j                  | j$                  | j&                  | jV                  ddddDdE	dF      S # t        $ r$}t        dt        |              d}Y d}~&d}~ww xY w# 1 sw Y   axY w# t        $ r[}t        d?t        |              t8        j:                  jU                          t        dd@t        |       d      dAfcY d}~S d}~ww xY w)Gr   rg   ri   r   r   Fr   r<   rk   zRequest headers:zRequest method:zRequest content type:zRequest data:zParsed JSON data:zError parsing JSON: Nz No data provided or invalid JSONrX   zUpdating profile for user ID: z	, email: zCurrent user data: first_name='z', last_name='z', company='z', job_title=''zUpdate data received: z&Before update - User data in database:z  ID: z  First name: 'z  Last name: 'z  Company: 'z  Job title: 'r   rD   rE   r   r[   zUpdated name to: first_name='r]   zUpdated company to: 'r^   zUpdated job_title to: 'z%After update - User data to be saved:currentPasswordnewPasswordr   )r   )textzMarking user object as modified)flag_modifiedrZ   r\   zCommitting changes to databasezDatabase commit successfulz)Executing direct SQL update as a fallbackzUPDATE user SET first_name = :first_name, last_name = :last_name, company = :company, job_title = :job_title WHERE id = :user_id)rZ   r\   r]   r^   r"   zDirect SQL update affected z rowszExpiring all objects in sessionzReloading user with ID: z'After commit (fresh user): first_name='z+ERROR: Could not reload user from database!z&Error committing changes to database: zDatabase error:   Tr   rn   )	r   rZ   r\   rT   rU   r]   r^   rq   r3   r   ),r   rr   r   r   r   r   printdictrG   content_typerc   r`   r   r   r   rT   rZ   r\   r]   r^   rI   lenrt   ra   flaskr   
sqlalchemyr   r   rJ   rb   sqlalchemy.orm.attributesr   rK   engineconnectexecuterowcount
expire_allr   r,   r0   rollbackrq   )rO   rc   r   
name_partsr   r   r   r   
connectionsqlresult
fresh_users               r5   update_user_profiler     s\   
 ~~" 7NL9D wtT*0
   	 

d7??34	
W^^,	
!7#7#78	/7<<(!!4(
 019
   	 
*477)9TZZL
IJ	+DOO+<N4>>JZZfgkgsgsft  uC  DH  DR  DR  CS  ST  U  V	"4&
)* 

23	F477)
	ODOO,A
./	N4>>*!
,-	La
()	N4>>*!
,-~&\''Q/
+5*Q-2*-j/A*=A2-doo->nT^^L\\]^_DI%dll^156dk*''7q9:	
12	F477)
	ODOO,A
./	N4>>*!
,-	La
()	N4>>*!
,- D ]d%:""4(9#:; :    	$}-.A%# 	/0


t 	<dL)dK(dI&dK(./


*+ 	9:^^ 	HQC  ''"&//!%#||!%#ww	F //@FG)	H. 	/0


 	(	23ZZ^^DGG,
;J<Q<Q;RR`akauau`v  wC  DN  DV  DV  CW  We  fp  fz  fz  e{  {|  }  ~?@  1''//ZZ

||!
    $SVH-.d	H 	HH  6s1vh?@


)#a&2
   	sR   : W .B?X -A<X)CX 	X!X  XXX 	Y9AY4.Y94Y9z/history/<int:query_id>c                 &   t         j                  dk(  ryt        t         dt              }|rt	        |d      st        ddd      dfS t        j                  j                  | |j                  	      j                         }|st        dd
d      dfS t        d|j                  |j                  |j                  |j                  |j                  |j                  |j                   |j"                  |j$                  j'                         d	d      S )zGet a specific query by IDrg   ri   r   r   Fr   r<   rk   r   r"   Query not found  T)	r   r   r   r   r   r   r   r   r   )r#   r,   )r   rr   r   r   r   r   r   r,   r-   r   r.   r   r   r   r   r   r   r   r   r   query_idrO   r,   s      r5   get_query_by_idr     s   
 ~~" 7NL9D wtT*0
   	 ((Hdgg(FLLNE(
   	
 (("00&+&B&B"00#22"00"00 ,,**446

  r7   z/history/<int:query_id>/delete)rA   DELETErg   c                    t         j                  dk(  ryt        t         dt              }|rt	        |d      st        ddd      dfS t        j                  j                  | |j                  	      j                         }|st        dd
d      dfS 	 t        j                  j                  |       t        j                  j                          t        ddd      S # t        $ re}t        j                  j!                          t"        j%                  dt'        |              t        ddt'        |       d      dfcY d}~S d}~ww xY w)z!Delete a query history item by IDrg   ri   r   r   Fr   r<   rk   r   r   r   TzQuery deleted successfullyzError deleting query: zFailed to delete query: r   N)r   rr   r   r   r   r   r   r,   r-   r   r.   r   rJ   deleterK   r   r   ry   r   r   )r   rO   r,   r   s       r5   delete_query_by_idr     sH   
 ~~" 7NL9D wtT*0
   	 ((Hdgg(FLLNE(
   	



% 


3
  	  


-c!fX671#a&:
   	s    A
C 	E(AEEEz /history/<int:query_id>/favoritec                    t         j                  dk(  ryt        t         dt              }|rt	        |d      st        ddd      dfS t        j                  j                  | |j                  	      j                         }|st        dd
d      dfS |j                   |_        t        j                  j                          t        d|j                  d      S )z"Toggle favorite status for a queryrg   ri   r   r   Fr   r<   rk   r   r   r   T)r#   r   )r   rr   r   r   r   r   r   r,   r-   r   r.   r   r   rJ   rK   r   s      r5   toggle_favoriter     s    
 ~~" 7NL9D wtT*0
   	 ((TWW ) eg 
 (
   	 "---EJJ((  r7   z/explainc                  t	   t        j                         } | st        d      S | j                  d      }| j                  d      }| j                  dd      }t	        d|        t        ||g      st        d      S t        j                  j                  |t        j                        j                         }|st        d	d
      S t        |j                        }|j                  ||j                   d|j                    |j"                  d}|j$                  j'                         dk(  r@t)        |d      r4|j*                  r(|j*                  |d<   t	        d|j*                   d       |t,        j.                  d<   ddlm}m}m}	 ddlm}
m}  |
j<                          |d      z
  }|j                  j?                  |j@                  t        j                  k(  |jB                  |k(  |jD                  dk(  |jF                  |k\        j                         }|sm|j                  j                  t        j                  d      j                         } |
j<                         } |
|jH                  |jJ                  d      }|j                  j?                  |j@                  t        j                  k(  |jF                  |k\        jM                         }d}|r|	j                  j                  |jN                        j                         }|r[|jP                  }tS        |tT              r
d|v r|d   }n5|jN                  dk(  rd}n#|jN                  d k(  rd!}n|jN                  d"k(  rd#}|d#k7  r||k\  rtW        d$d%| d&d'      d(fS 	 tX        j[                  |j$                  |||)      }|sud*|v rq|d*   rl |t        j                   |
j<                         |d+d! |dd$,      }t\        j^                  ja                  |       t\        j^                  jc                          n6|r4 |
j<                         |_#        t\        j^                  jc                          tW        |      S # td        $ rG}tf        ji                  d-tk        |              tW        d$d-tk        |       d.      d!fcY d+}~S d+}~ww xY w)/z9Get the explain plan for a SQL query without executing itrS   r   	sql_querymodelr)   z+[API] Getting explain plan with model_type=Missing required parametersr   Database connection not foundr   :rU   rV   hostPortdatabaseNameoracleservice_nameserviceName*
[API ROUTES] Adding Oracle service_name: z for explain query
LAST_CONNECTION_CONFIGr   )r   r   r   )r   	timedeltarE   )hoursexplainactive)r"   ro   r   r%   query_limitbasicd   professionalr   
enterpriseFz-You have reached your monthly query limit of z3. Please upgrade your plan to execute more queries.r<   i  )db_typeconnection_configr   r   performance_analysisNr"   r   
query_textr   
query_type	is_cachedzError getting explain plan: )r#   r   )6r   r`   r@   r0   r   allr   r,   r-   r   r   r.   r   rV   rU   hostportdatabase_namer   lowerr   r   r   configr_   r   r   r   r   r   rw   r   r"   r   r   r   yearmonthr   r&   r/   
isinstancer   r   	connectorexplain_queryr   rJ   rb   rK   r   ry   r   r   )rc   r   r   r   r   rV   r   r   r   r   r   r   one_hour_agocached_queryr3   todaymonth_startquery_countr   r4   plan_featuresexplain_resultquery_usager   s                           r5   r	  r	    st    D011 HH_-M%I '8,J	7
|
DEy)*;<< $))33,// 4 eg  =sCC  
 3 34H ''!'q(9:"00	 !X-'*n2UZdZqZq+5+B+B-(;J<S<S;TThij 4EK/0 KJ, #8??$yq'99L##**loo-**!!\1	
 eg  #))33LOOT\3]cce  !uzz5;;: !&&--,//1%%4
 %' 	 #))33L<P<P3QWWYD $mT2}7U"/">K ||w.&)7&)5&( "!; J;-  XK  L   !"00&&/!	 1 
  6. H^\rMs$$.x0$Tc?+$K JJNN;'JJ*9(//*;L'JJ~&& 3CF8<=3CF8<
   	s   CQ' '	R70<R2,R72R7z/executec                     t        j                         } | st        d      S | j                  d      }| j                  d      }| j                  dd      }ddlm} ddlm} 	 | j                  d	d
      }| j                  dd      }t        |t              rd	|v r|j                  d	d
      }|t        |      nd
}t        |t              rd|v r|j                  dd      }|t        |      nd}|d
k  rd
}|d
k  s|dkD  rd}|d
z
  |z  }t        ||g      st        d      S t        j                  j                  |t         j"                        j%                         }	|	st        dd      S t'        |	j(                        }
|	j*                  |
|	j,                   d|	j.                   |	j0                  d}|	j2                  j5                         dk(  r@t7        |	d      r4|	j8                  r(|	j8                  |d<   t;        d|	j8                   d       t=        j<                         }t>        jA                  |	j2                  |      }|j                  dd      r>|j                  di       }d|v r(tB        jE                  d|j                  dd              t>        jG                  |	j2                  ||||      }t=        j<                         }||z
  }tI        t         j"                  |d|||d   |d   s|j                  d d      nd!      }tJ        jL                  jO                  |       |d   rN	  |t         j"                   |jP                         |dd" |d#d$      }tJ        jL                  jO                  |       tJ        jL                  jY                          ||d&<   t[        |      S # t        t        f$ r d
}d}Y w xY w# tR        $ r+}tB        jU                  d%tW        |              Y d}~wd}~ww xY w)'z#Execute a SQL query on the databaserS   r   r   analyze_performanceFr   )r   r
   r   rE   	page_sizer   Ni  r   r   r   r   r   r   r   r   r   r   z for execute query
r#   r  sql_modezDatabase SQL Mode: r[   )r   r   r   limitoffsetr   )r"   r   r   r   r   r   r   r   r   r   zError tracking query usage: r   ).r   r`   r@   r0   r_   r   r   r  r   r   
ValueError	TypeErrorr   r   r,   r-   r   r   r.   r   rV   rU   r   r  r  r   r  r   r   r   timer  get_db_configry   rz   execute_queryr   r   rJ   rb   rw   r   r   r   rK   r   )rc   r   r   r  r   r   r   r  r  r   rV   r   
start_timedb_config_result	db_configr   end_timer   query_historyr  r   s                        r5   r  r    s    D011 HH_-M%I((#8%@ +!xx"HH[#.	 dD!fn88FA&D ,s4y!i&;)+C!k37I&/&;C	N	 ax1}	D(	 Qh)#Fy)*;<< $))33,// 4 eg  =sCC  
 3 34H ''!'q(9:"00	 !X-'*n2UZdZqZq+5+B+B-(;J<S<S;TThij J !..z/A/ACTU Iu-$((26	"KK-immJ.K-LMN $$""+ % F yy{H
*N !#!%Y'5;I5Ffjj"-BM JJNN=! i	B$$.x0$Tc?+$K JJNN;'
 JJ  .F6?K 	" 	x  	BLL7Ax@AA	Bs,   #BN0 5AO
 0OO
	O>!O99O>)rX   )<r   r   r   r   flask_loginr   r   r   r	   jsonr  loggingr   app.extensionsr   app.apir   app.database.modelsr   r   r   r_   r   r   r   r   
app.modelsr   app.utils.encryptionr   r   app.utils.authr   	getLogger__name__ry   app.database.db_connectorr   r  rz   router6   r   r   tupler@   rP   rf   r{   r}   r   r   r   r   r   r   r   r   r	  r   r7   r5   <module>r1     s   / / M M       P P L L % C ) 
		8	$ 8 	 G H!E736  46r*C *c *e *0 nvh/ 0, 10 20d mfi%89P :Pd nvh/  0" ow/   0 D 0%  1%R 0  1 j5)"45s  6sj j5)"45j  6jX '%1CD&  E&P .8UV(  W(T 069:MN"  O"H j6(+G  ,GR j6(+C  ,Cr7   