o
    kFj\                     @  s   d dl m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
 d dlmZmZmZ d dlmZ d d	lmZ d=ddZd>ddZd>ddZd?ddZd@d d!ZdAd$d%ZdBd'd(ZdCd+d,ZdDd0d1ZdEd2d3ZdFd6d7ZdGd9d:ZdFd;d<ZdS )H    )annotationsN)
HTTPStatusSimpleHTTPRequestHandler)Path)Any)parse_qsunquoteurlsplit)LocalPetApi)StateTransitionErrorapir   web_rootr   returntype[SimpleHTTPRequestHandler]c                   s   G  fdddt }|S )Nc                      s   e Zd Zd% fddZd& fdd	Zd& fd
dZd&fddZd&fddZd'ddZd'ddZ	d'ddZ
d(ddZejdd)dd Zd*d#d$Z  ZS )+z%make_handler.<locals>.LocalApiHandlerargsr   kwargsr   Nonec                   s   t  j|dti| d S )N	directory)super__init__str)selfr   r   )	__class__r    9/opt/sixxie/releases/current/services/api/local_server.pyr      s   z.make_handler.<locals>.LocalApiHandler.__init__c                   s   |  dd t   d S )NzCache-Controlzno-store)send_headerr   end_headers)r   r   r   r   r      s   z1make_handler.<locals>.LocalApiHandler.end_headersc              
     s   z(t | jjdr!td| ji d\}}| j|t|d W d S t   W d S  ty@ } z| 	| W Y d }~d S d }~ww )Nz/api/GETr   methodpathpayloadstatus)
r
   r"   
startswithdispatch_api_request
_send_jsonr   r   do_GET	Exception_send_error_json)r   r%   r#   exc)r   r   r   r   r)      s   z,make_handler.<locals>.LocalApiHandler.do_GETc              
     s   z't | jjdkr|  n|  }t d| j|d\}}| j|t|d W d S  ty? } z| | W Y d }~d S d }~ww )Nz/api/cloud/webhooks/stripePOSTr    r$   )	r
   r"   _read_stripe_webhook_payload_read_payloadr'   r(   r   r*   r+   r   r#   r%   response_payloadr,   r   r   r   do_POST!   s    z-make_handler.<locals>.LocalApiHandler.do_POSTc              
     sh   z|   }t d| j|d\}}| j|t|d W d S  ty3 } z| | W Y d }~d S d }~ww )NDELETEr    r$   )r/   r'   r"   r(   r   r*   r+   r0   r2   r   r   	do_DELETE)   s   z/make_handler.<locals>.LocalApiHandler.do_DELETEdict[str, Any]c                 S  s,   | j dpd}|dr| |S |  S )NContent-Type zmultipart/form-data)headersgetr&   _read_multipart
_read_json)r   content_typer   r   r   r/   1   s   

z3make_handler.<locals>.LocalApiHandler._read_payloadc              
   S  s|   t | jdpd}|dkri S | j|}z
t|d}W n tjy2 } zt	d|d }~ww t
|ts<t	d|S )NContent-Lengthr   utf-8zrequest body must be valid JSONz"request body must be a JSON object)intr9   r:   rfilereadjsonloadsdecodeJSONDecodeError
ValueError
isinstancedict)r   lengthrawr#   r,   r   r   r   r<   7   s   

z0make_handler.<locals>.LocalApiHandler._read_jsonc                 S  sH   t | jdpd}|dkr| j|nd}|d| jdp!ddS )Nr>   r       r?   zStripe-Signaturer8   raw_bodystripe_signature)r@   r9   r:   rA   rB   rE   )r   rJ   rK   r   r   r   r.   D   s
   zBmake_handler.<locals>.LocalApiHandler._read_stripe_webhook_payloadr=   r   c                 S  s   t |}t| jdpd}| j|}i }d| }||D ]V}|d}|r,|dkr-q|dr;|d d d}|	d\}}	}
t
|}|dd}t|d	}|sUqt|d
}|
d}
|rn||dd|
d|d< q|
d||< q|S )Nr>   r   s   --s   
s   

zcontent-dispositionr8   namefilenamezcontent-typeapplication/octet-stream)rR   r=   contentfiler?   )_multipart_boundaryr@   r9   r:   rA   rB   splitstripendswith	partition_parse_part_headers_disposition_valuerstriprE   )r   r=   boundaryrJ   rK   r#   	delimiterpartheader_blob_bodyr9   dispositionrQ   rR   r   r   r   r;   L   s4   





z5make_handler.<locals>.LocalApiHandler._read_multipartr$   r#   r%   r   c                S  sV   t j|ddd}| | | dd | dtt| |   | j	| d S )NF)ensure_asciir?   r7   zapplication/json; charset=utf-8r>   )
rC   dumpsencodesend_responser   r   lenr   wfilewrite)r   r#   r%   rc   r   r   r   r(   j   s   
z0make_handler.<locals>.LocalApiHandler._send_jsonr,   r*   c                 S  sd   t |ttfrtj}nt |ttfrtj}nt |trtj	}ntj
}| jt|t|d|d d S )Nerrormessager$   )rH   rG   r   r   BAD_REQUESTKeyErrorFileNotFoundError	NOT_FOUNDPermissionError	FORBIDDENINTERNAL_SERVER_ERRORr(   _safe_error_code_safe_error_message)r   r,   r%   r   r   r   r+   r   s   

z6make_handler.<locals>.LocalApiHandler._send_error_json)r   r   r   r   r   r   )r   r   )r   r6   )r=   r   r   r6   )r#   r6   r%   r   r   r   )r,   r*   r   r   )__name__
__module____qualname__r   r   r)   r3   r5   r/   r<   r.   r;   r   OKr(   r+   __classcell__r   r   r   r   r   LocalApiHandler   s    




r~   r   )r   r   r~   r   r}   r   make_handler   s   tr   r!   r   r"   r#   r6   tuple[int, dict[str, Any]]c              
   C  sV   zt | | ||dW S  ty* } zt|t|t|dfW  Y d }~S d }~ww )Nr    rl   )_dispatch_api_requestupperr*   _status_for_exceptionrv   rw   )r   r!   r"   r#   r,   r   r   r   r'      s   r'   c                 C  s  t |}t|}|dkr|ddgkrtj|  fS |g dkr>t| ds)tdtj| jt|	dp9|	dp9dd	fS t
|d
kru|d d g dkru|d dkrut| ds]tdtj| jt|	dpm|	dpmd|d dfS t
|dkr|d d g dkrt| dstdtj| jt|	dp|	dpd|d dfS |ddgkrtj| jt|	dp|	dpdt|	dt|	ddfS t
|dkr|d d ddgkrtj| |d fS t
|dkr
|d d ddgkr
|d dkr
tj| |d fS t
|d
krA|d d ddgkrA|dd  ddgkrAtj| j|d t|	dp<|	dp<dd fS t
|dkrt|d d dd!gkrt|d d"krttj| j|d t|	dpo|	dpodd fS t
|dkr|d d dd!gkr|d d#krtj| j|d t|	dp|	dpdd fS tjd$d%ifS |d&krt
|dkr|d d dd'gkrtj| j|d t|	dpdd fS t
|dkr|d d dd!gkrtj| j|d t|	dpdd fS tjd$d%ifS |d(krtjd$d)ifS |g d*krUt| d+s#tdtj| jt|	d,p/dt|	d-t|	d.p>dt|	d/pGdt|	d0pPd1d2fS |g d3krt| d4sftd5tj| jt|	dprdt|	d6p{dd7fS |g d8krt| d9std:tj| jt|	dpdt|	d;pd<t|	d=pdt|	d>pdt|	d?pd@dAfS |g dBkrt| dCstdDtj| jt|	dEpdt|	dFpddGfS |g dHkr[t| dIstdJtj| jt|	d,pdt|	d-t|	d.pdt|	d/p&dt|	d0p/d1t|	dKp8dt|	dLt|	dMt|	dNt|	dOt|	dPdQfS t
|dRkr|d d g dHkr|dd  d'dSgkrt| dTstdUtj| jt|	dpd|d t|	dVpdWt|	dXpdt|	dYpd@t|	dZpdt|	d[d\fS t
|d]kr|d d g dHkr|d d'kr|dR d^krt| d_stdUtj| j t|	dpd|d |d
 d`fS t
|d
krS|d d g dHkrS|d dkrSt| das$tdtj| j!t|	dp0d|d t"|	dbp<g t|	dcpEddt|	depNddffS t
|d
kr|d d g dkr|d dgkrt| dhsvtdtj| j#t|	dpd|d |	didju |	dkdju |	dldju t|	dmdndofS t
|d
kr|d d g dpkr|d dqkrt| drstdUtj| j$t|	dpd|d dsfS t
|d
kr|d d g dkr|d dqkrt| dtstdtj| j%t|	dp
d|d dfS t
|d
krI|d d g dkrI|d dukrIt| dvs5tdtj| j&t|	dpAd|d dfS |ddwgkrtj| j't|	dp\dt|	dKpedt|	dLt|	dMt|	dNt|	dOt|	dPdxfS |g dykrtj| j(t|	dpdt|	dpdt|	dzpd{d|fS |g d}krtj| j)t|	dpdt|	d~dfS t
|d
kr+|d d ddwgkr+|dd  d'dgkr+|	d}t*|t+stdtj| j,t|	dpd|d t|	dpdt|	dpdt-|	dp&ddfS t
|dkr~|d d ddwgkr~|d d'kr~tj| j.t|	dpPd|d t|	dVp\dWt|	dXpedt|	d[t|	dpyd|d  dfS t
|dkr|d d ddwgkr|d dkrtj| j/t|	dpd|d |	ddju t|	dpdt|	d|	ddju t|	ddfS t
|dkr|d d ddwgkr|d dkrtj| j0t|	dpd|d dd |	dbg D t|	dcpdt|	depddfS t
|dkrB|d d dd'gkrB|d dkrBtj| j1|d t|	dp=ddfS t
|dkre|d d ddgkre|d dkretj| 2|d fS t
|dkr|d d ddgkr|d dgkrtj| j3|d t|	dpdt4|dfS t
|dkr|d d ddgkr|d d"krtj| j5|d t|	dpdt|	ddfS tjd$d%ifS )Nr   r   health)r   cloudmeget_cloud_mez#cloud session API is not configured
session_idr8   )r         )r   r   packages   zdownload-url!create_cloud_package_download_urlz#cloud package API is not configured)r   
package_id)r   r   buildsget_cloud_buildz!cloud build API is not configured)r   build_idzprovider-metricsuser_id	usr_localproviderr   )r   r   r      r   previewzcontact-sheet)r   r   downloadbundlerm   	not_foundr4   mediar-   method_not_allowed)r   r   sessioncreate_cloud_sessionauth_uidemail	device_idapp_versionchannelbeta)r   r   r   r   r   )r   r   invitesredeemredeem_cloud_invitez"cloud invite API is not configuredinvite_code)r   r   )r   r   checkoutr   create_stripe_checkout_sessionz$cloud checkout API is not configuredclient_surfacedesktop_appsuccess_url
cancel_urlamount_total_centsr   )r   r   r   r   r   )r   r   webhooksstripehandle_stripe_webhookz*cloud stripe webhook API is not configuredrN   rO   rM   )r   r   petscreate_cloud_pet_draftzcloud pet API is not configuredpet_namespeciesbreedpersonality_notestypical_gesturesmemory_notes)r   r   r   r   r   r   r   r   r   r   r      uploadscreate_cloud_media_uploadz!cloud media API is not configured
media_typephoto	mime_type
size_bytessha256original_filename)r   pet_idr   r   r   r   r      completecomplete_cloud_media_upload)r   r   media_idcreate_cloud_build	media_idsimage_provideropenaiimage_model)r   r   r   r   r   approveapprove_cloud_buildlooks_like_petTfeels_comfortableactions_fit_long_termwritten_feedback)r   r   r   r   )r   r   approval_answers)r   r   r   deletedelete_cloud_media)r   r   delete_cloud_packagezruntime-checkcheck_cloud_package_runtimer   )r   r   r   r   r   r   r   )r   r   testproduct_codecustom_pet_build)r   r   r   )r   subscriptionsr   r   )r   r   uploadrU   zimage file is requiredrR   r=   rS   rT   rL   )r   r   rR   r=   rT   storage_refzlocal-private://pet-media/)r   r   r   r   r   r   consentboundary_acknowledgedconsent_versionzp0-localexternal_processor_nameexternal_processor_consent"external_processor_consent_version)r   r   r   r   r   r   r   c                 S  s   g | ]}t |qS r   )r   ).0itemr   r   r   
<listcomp>  s    z)_dispatch_api_request.<locals>.<listcomp>apimartzgpt-image-2)r   r   r   r   r   qualitysource_qualitypassed)r   process)r   r   entitlement_status)r   r   )6_path_parts_query_paramsr   r{   r   hasattrrG   r   r   r:   ri   r   r   get_provider_metrics_optional_text	get_buildget_build_previewget_build_preview_assetget_package_downloadget_package_bundlerr   delete_mediadelete_packageMETHOD_NOT_ALLOWEDCREATEDr   r   r   r@   r   r   r   r   r   listr   r   r   r   
create_petcreate_test_checkoutgrant_test_subscriptionrH   rI   upload_media_bytesbytescreate_media_recordgrant_consentcreate_buildmark_media_qualityprocess_buildapprove_build_approval_answers_from_payloadcreate_package_download)r   r!   r"   r#   partsqueryfile_payloadr   r   r   r      s  

,
 
 2:22
$$
:@	222
22	:
222	2222r   	list[str]c                 C  s,   t | jd}|sg S dd |dD S )N/c                 S  s   g | ]}|rt |qS r   )r	   )r   r`   r   r   r   r     s    z_path_parts.<locals>.<listcomp>)r
   r"   rX   rW   )r"   cleanr   r   r   r     s   r   dict[str, str]c                 C  s    t t| j}dd | D S )Nc                 S  s   i | ]\}}|r||d  qS )r   r   )r   keyvaluesr   r   r   
<dictcomp>  s    z!_query_params.<locals>.<dictcomp>)r   r
   r
  items)r"   parsedr   r   r   r     s   r   r=   r   c                 C  sL   |  dD ]}| }|dr!|dd}|r!|d  S qtd)N;z	boundary="r?   zmultipart boundary is required)rW   rX   r&   removeprefixrg   rG   )r=   segmentvaluer   r   r   rV     s   
rV   blobc                 C  sN   i }| j ddddD ]}|d\}}}|r$|r$| ||  < q|S )Nr?   replace)errorsz
:)rE   rW   rZ   rX   lower)r  r9   linerQ   rb   r  r   r   r   r[     s   r[   rd   r  c                 C  sN   | d}|  dD ]}| }||r$|dr$|t|d   S q
dS )Nz="r  r  r8   )rW   rX   r&   rY   ri   )rd   r  prefixr  r   r   r   r\     s   
r\   r  r   
str | Nonec                 C  s    | d u rd S t |  }|pd S N)r   rX   )r  textr   r   r   r     s   r   c                 C  sF   |  d}t|trt|S |  ddu |  ddu |  ddu dS )Nr   r   Tr   r   )r   r   r   )r:   rH   rI   )r#   nestedr   r   r   r    s   

r  r,   r*   c                 C  s<   t | trdS t | trdS t | trdS t | trdS dS )Ninvalid_state_transition	forbiddenr   invalid_requestinternal_error)rH   r   rs   rp   rG   r,   r   r   r   rv     s   



rv   r@   c                 C  sN   t | ttfrttjS t | trttjS t | tt	fr"ttj
S ttjS r#  )rH   rG   r   r@   r   ro   rs   rt   rp   rq   rr   ru   r*  r   r   r   r     s   




r   c                 C  s6   t | ttfrt| S t | trdS t | trdS dS )Nznot allowedzresource not foundzrequest failed)rH   r   rG   r   rs   rp   r*  r   r   r   rw     s   

rw   )r   r   r   r   r   r   )
r   r   r!   r   r"   r   r#   r6   r   r   )r"   r   r   r  )r"   r   r   r  )r=   r   r   r   )r  r   r   r  )rd   r   r  r   r   r   )r  r   r   r"  )r#   r6   r   r6   )r,   r*   r   r   )r,   r*   r   r@   ) 
__future__r   rC   httpr   http.serverr   pathlibr   typingr   urllib.parser   r	   r
   services.api.local_apir   services.api.state_guardsr   r   r'   r   r   r   rV   r[   r\   r   r  rv   r   rw   r   r   r   r   <module>   s0    

x
  





	
	



