o
    ð�j  ã                   @  sÚ   d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ej ej ej e¡¡¡Zej de¡ eej ed¡ƒ ddlmZ ddlmZ dd	lmZ G d
d„ dƒZddd„Zedkrkeeƒ ƒ‚dS )uS   Safe API Push verification â€” does not enable any live business for outbound push.é    )ÚannotationsN)ÚBaseHTTPRequestHandlerÚ
HTTPServer)Úload_dotenvz.env)ÚApiPushService)ÚConfig)ÚDatabaseHandlerc                   @  s&   e Zd Zdd„ Zddd„Zdd„ ZdS )	ÚConfigWrapperc                 C  s
   || _ d S ©N)Ú_config)ÚselfÚconfig© r   úscripts/verify_api_push_safe.pyÚ__init__   s   
zConfigWrapper.__init__Nc                 C  s   t | j||ƒS r
   ©Úgetattrr   )r   ÚkeyÚdefaultr   r   r   Úget   s   zConfigWrapper.getc                 C  s   t | j|ƒS r
   r   )r   r   r   r   r   Ú__getattr__   s   zConfigWrapper.__getattr__r
   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r	      s    
r	   ÚreturnÚintc                    s2  t ttƒ ƒƒ} |  ¡  t| ƒ}|  ¡ �}| ¡ }| d¡ t| 	¡ p#g ƒ}W d   ƒ n1 s/w   Y  dd„ |D ƒ}t
dt|ƒ› dt|ƒ› �ƒ |D ]}t
d|d › d|d	 › �ƒ qKd
D ]&}|j|ddd�}| d¡swJ d|› d|› �ƒ‚t
d|› d| d¡› �ƒ q^g ‰ G ‡ fdd„dtƒ}	td|	ƒ}
|
jd }tj|
jdd�}| ¡  i |  ¡ ¥dd|› d�dddg d¢dd d!d"dœd#d$d%œ	¥}d&d'd(d)d*d+d,d-d.d/œ	}| ||¡}| ||d0 d(¡\}}|d1 dkríd(||d2 < d3d l}|j|||d4d5�}|
 ¡  |jd6k�s	J |jƒ‚ˆ �sJ d7ƒ‚ˆ d3 d }| d¡d(k�s J ‚| d!¡d)k�s*J ‚| d"¡d*k�s4J ‚t
d8|j› d9t| ¡ ƒ› �ƒ |  ¡ �}| ¡ }| d:¡ | ¡ }W d   ƒ n	1 �s`w   Y  |�r�|d; }|  d<|¡}t
d=| d>¡› d?| d@¡› d| dA¡› dB| d¡› �ƒ nt
dCƒ t
dDƒ d3S )ENz^SELECT bid, is_enabled, LEFT(IFNULL(endpoint_url,''), 80) AS url FROM business_api_push_configc                 S  s&   g | ]}t | d ¡pdƒdkr|‘qS )Ú
is_enabledr   é   )r   r   )Ú.0Úrr   r   r   Ú
<listcomp>/   s   & zmain.<locals>.<listcomp>zconfig_rows=z	 enabled=z  ENABLED bid=Úbidz url=Úurl)Ú8837Ú1001Ú9999Ú__verify_skip__F)ÚforceÚskippedzExpected skip for bid=z, got zskip_ok bid=z	 message=Úmessagec                      s    e Zd Z‡ fdd„Zdd„ ZdS )zmain.<locals>.Handlerc                   sn   t | j d¡pdƒ}| j |¡}ˆ  | jt | 	d¡pd¡| j d¡dœ¡ |  
d¡ |  ¡  | j d¡ d S )	NzContent-Lengthr   zutf-8z{}zContent-Type)ÚpathÚbodyÚcontent_typeéÈ   s   {"ok":true})r   Úheadersr   ÚrfileÚreadÚappendr*   ÚjsonÚloadsÚdecodeÚsend_responseÚend_headersÚwfileÚwrite)r   Úlengthr+   ©Úreceivedr   r   Údo_POST>   s   
ýÿ
zmain.<locals>.Handler.do_POSTc                 W  s   d S r
   r   )r   Ú_argsr   r   r   Úlog_messageL   s   z!main.<locals>.Handler.log_messageN)r   r   r   r<   r>   r   r:   r   r   ÚHandler=   s    r?   )z	127.0.0.1r   r   T)ÚtargetÚdaemonzhttp://127.0.0.1:z/hookÚphoner+   Úphone_number)rC   Úcall_idÚsummaryÚquality_scorerD   rE   rF   ÚPOSTÚnone)	r   Úendpoint_urlÚmapping_keyÚmapping_locationÚmapping_nameÚselected_fieldsÚfield_mappingsÚhttp_methodÚ	auth_typeÚselftestzselftest-call-1Ú919876543210zVerification summaryéX   ÚpositiveÚAgenté*   z2026-08-27 12:00:00)	r!   rD   rC   rE   rF   Ú	sentimentÚ	agentnameÚdurationÚcall_starttimerI   rK   rL   r   é   )r2   r.   Útimeoutr-   zLocal webhook received nothingzlocal_webhook_ok status=z payload_keys=zYSELECT callid FROM `8837_raw_calls` WHERE status = 3 ORDER BY call_starttime DESC LIMIT 1Úcallidr#   zdry_run_8837 success=Úsuccessz would_send=Ú
would_sendr   z msg=z-dry_run_8837 skipped (no analyzed call found)ÚALL_CHECKS_PASSED)!r   r	   r   Úensure_api_push_tablesr   Úget_connectionÚcursorÚexecuteÚlistÚfetchallÚprintÚlenÚpush_call_updater   r   r   Úserver_addressÚ	threadingÚThreadÚserve_foreverÚstartÚ_api_push_config_defaultsÚ_build_payloadÚ_build_requestÚrequestsÚpostÚshutdownÚstatus_codeÚtextÚsortedÚkeysÚfetchoneÚpreview_call_update)ÚdbÚsvcÚconnÚcurÚrowsÚenabledr   r!   Úresultr?   ÚserverÚportÚthreadÚfake_cfgÚmergedÚpayloadr"   r.   rr   Úrespr+   Úrowr]   Úpreviewr   r:   r   Úmain"   s®   
ÿú

ÿ
üñ÷
ÿ
ûÿþýÿr‹   Ú__main__)r   r   )Ú__doc__Ú
__future__r   r2   ÚosÚsysrk   Úhttp.serverr   r   Údotenvr   r*   ÚdirnameÚabspathÚ__file__ÚBASE_DIRÚinsertÚjoinÚapi_push_servicer   r   r   Ú
db_handlerr   r	   r‹   r   Ú
SystemExitr   r   r   r   Ú<module>   s&   
w
ÿ