Ë
    »dj  ã                   ó’   — d Z ddlZddlZddlmZ ddlZddlmZ  ej                  e	«      Z
dZdZdZ G d„ d	e«      Z G d
„ d«      Zy)z>Upload blog images to Shopify Files via GraphQL staged upload.é    N)ÚAny)ÚShopifyAdminClientzã
mutation stagedUploadsCreate($input: [StagedUploadInput!]!) {
  stagedUploadsCreate(input: $input) {
    stagedTargets {
      url
      resourceUrl
      parameters { name value }
    }
    userErrors { field message }
  }
}
a  
mutation fileCreate($files: [FileCreateInput!]!) {
  fileCreate(files: $files) {
    files {
      id
      fileStatus
      ... on MediaImage {
        image { url }
      }
      ... on GenericFile {
        url
      }
    }
    userErrors { field message }
  }
}
zŽ
query fileUrl($id: ID!) {
  node(id: $id) {
    ... on MediaImage {
      image { url }
    }
    ... on GenericFile {
      url
    }
  }
}
c                   ó   — e Zd ZdZy)ÚShopifyFileAccessErrorz7Raised when the Shopify token lacks file-upload scopes.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úI/var/www/html/shopify_to_digistore/blogs/services/shopify_file_service.pyr   r   :   s   „ ÚAr   r   c                   ó  — e Zd Zeddedeeef   dz  deeef   fd„«       Zedeeeef      deddfd„«       Z	ed	eeef   d
e
dededdf
d„«       Zedeeef   defd„«       Zeddededefd„«       Zedd
e
dededefd„«       Zy)ÚShopifyFileServiceNÚqueryÚ	variablesÚreturnc                 ó˜   — 	 t        j                  ||«      S # t        $ r(}dt        |«      v rt	        t        |«      «      |‚‚ d }~ww xY w)NÚACCESS_DENIED)r   ÚgraphqlÚRuntimeErrorÚstrr   )Úclsr   r   Úexcs       r   Ú_graphqlzShopifyFileService._graphql?   sJ   € ð	Ü%×-Ñ-¨e°YÓ?Ð?øÜò 	Ø¤# c£(Ñ*Ü,¬S°«XÓ6¸CÐ?Øûð	ús   ‚ ˜	A	¡#AÁA	ÚerrorsÚcontextc                 óZ   — |sy dj                  d„ |D «       «      }t        d|› d|› �«      ‚)Nz; c              3   óˆ   K  — | ]:  }|j                  d d«      › d|j                  dd«      › �j                  d«      –— Œ< y­w)ÚfieldÚ z: ÚmessageN©ÚgetÚstrip)Ú.0Úes     r   Ú	<genexpr>z8ShopifyFileService._raise_user_errors.<locals>.<genexpr>L   sF   è ø€ ð 
á�ð �u‰u�W˜bÓ!Ð" " Q§U¡U¨9°bÓ%9Ð$:Ð;×AÑAÀ$×GÙùs   ‚A AzShopify z	 failed: )Újoinr   )r   r   r   Úmessagess       r   Ú_raise_user_errorsz%ShopifyFileService._raise_user_errorsH   s=   € áØØ—9‘9ñ 
áó
ó 
ˆô ˜X g Y¨i¸°zÐBÓCÐCr   ÚtargetÚimage_bytesÚfilenameÚ	mime_typec                 ó>  — |j                  d«      xs g D �ci c]  }|d   |d   “Œ }}t        j                  |d   |d|||fid¬«      }|j                  dk\  r?t        j                  d	|j                  |j                  d d
 «       |j                  «        y y c c}w )NÚ
parametersÚnameÚvalueÚurlÚfileéx   )ÚdataÚfilesÚtimeouti�  zStaged upload failed %s: %siô  )r#   ÚrequestsÚpostÚstatus_codeÚloggerÚerrorÚtextÚraise_for_status)r   r+   r,   r-   r.   ÚpÚform_fieldsÚresps           r   Ú_upload_to_staged_targetz+ShopifyFileService._upload_to_staged_targetR   s­   € ð 7=·j±jÀÓ6NÒ6TÐRTÐ6TÓUÑ6T°�q˜‘y ! G¡*Ñ,Ð6TˆÐUÜ�}‰}Ø�5‰MØØ˜H k°9Ð=Ð>Øô	
ˆð ×Ñ˜sÒ"Ü�L‰LÐ6¸×8HÑ8HÈ$Ï)É)ÐTXÐUXÈ/ÔZØ×!Ñ!Õ#ð #ùò Vs   ˜BÚ	file_nodec                 ó˜   — |j                  d«      xs i }|j                  d«      xs |j                  d«      xs dj                  «       S )NÚimager3   r    r"   )r   rD   rF   s      r   Ú_file_cdn_urlz ShopifyFileService._file_cdn_urle   s@   € à—‘˜gÓ&Ò,¨"ˆØ—	‘	˜%Ó Ò> I§M¡M°%Ó$8Ò>¸B×EÑEÓGÐGr   Úfile_idÚattemptsc                 óì   — t        |«      D ]Y  }| j                  t        d|i«      j                  d«      xs i }| j	                  |«      }|r|c S t        j                  d«       Œ[ t        d|› �«      ‚)NÚidÚnodeg      ø?z%Shopify file not ready after upload: )Úranger   ÚFILE_URL_QUERYr#   rG   ÚtimeÚsleepr   )r   rH   rI   Ú_rL   r3   s         r   Ú_wait_for_file_urlz%ShopifyFileService._wait_for_file_urlj   sm   € ä�x–ˆAØ—<‘<¤°°w°Ó@×DÑDÀVÓLÒRÐPRˆDØ×#Ñ# DÓ)ˆCÙØ’
Ü�J‰J�s�Oð !ô ÐBÀ7À)ÐLÓMÐMr   Úaltc                 óâ  — d}| j                  t        d||ddt        t        |«      «      dœgi«      j	                  d«      xs i }| j                  |j	                  d«      xs g d«       |j	                  d«      xs g }|st        d	«      ‚|d
   }| j                  ||||«       | j                  t        d|xs |d d d|d   dœgi«      j	                  d«      xs i }| j                  |j	                  d«      xs g d«       |j	                  d«      xs g }	|	st        d«      ‚|	d
   }
| j                  |
«      }|r|S |
j	                  d«      }|st        d«      ‚| j                  |«      S )Nz	image/pngÚinputÚPOSTÚFILE)r-   ÚmimeTypeÚ
httpMethodÚresourceÚfileSizeÚstagedUploadsCreateÚ
userErrorsÚstagedTargetsz/Shopify stagedUploadsCreate returned no targetsr   r7   i   ÚIMAGEÚresourceUrl)rS   ÚcontentTypeÚoriginalSourceÚ
fileCreatez$Shopify fileCreate returned no filesrK   z&Shopify fileCreate returned no file id)r   ÚSTAGED_UPLOADS_CREATEr   Úlenr#   r*   r   rC   ÚFILE_CREATErG   rR   )r   r,   r-   rS   r.   ÚstagedÚtargetsr+   Úcreatedr7   rD   r3   rH   s                r   Úupload_imagezShopifyFileService.upload_imaget   s£  € àˆ	Ø—‘Ü!àà$,Ø$-Ø&,Ø$*Ü$'¬¨KÓ(8Ó$9ñðð
ó
÷ ‰#Ð#Ó
$ò+ð )+ð 	ð 	×Ñ˜vŸz™z¨,Ó7Ò=¸2Ð?TÔUà—*‘*˜_Ó-Ò3°ˆÙÜÐPÓQÐQà˜‘ˆØ×$Ñ$ V¨[¸(ÀIÔNà—,‘,Üàà #¢ x°°#Ð6Ø'.Ø*0°Ñ*?ñððó
÷ ‰#ˆlÓ
ò"ð  "ð 	ð 	×Ñ˜wŸ{™{¨<Ó8Ò>¸BÀÔMà—‘˜GÓ$Ò*¨ˆÙÜÐEÓFÐFà˜!‘Hˆ	Ø×Ñ 	Ó*ˆÙØˆJà—-‘- Ó%ˆÙÜÐGÓHÐHØ×%Ñ% gÓ.Ð.r   )N)é
   )r    )r   r   r	   Úclassmethodr   Údictr   r   Úlistr*   ÚbytesrC   rG   ÚintrR   rj   r   r   r   r   r   >   sT  „ Øñ˜Sð ¨T°#°s°(©^¸dÑ-Bð ÈdÐSVÐX[ÐS[Énò ó ðð ðD¨¨T°#°s°(©^Ñ(<ð DÀsð DÈtò Dó ðDð ð$à�S˜#�X‘ð$ð ð$ð ð	$ð
 ð$ð 
ò$ó ð$ð$ ðH d¨3°¨8¡nð H¸ò Hó ðHð ñN¨ð N¸ð NÀSò Nó ðNð ñ3/ uð 3/¸ð 3/À#ð 3/Èsò 3/ó ñ3/r   r   )r
   ÚloggingrO   Útypingr   r9   Ú#blogs.services.shopify_admin_clientr   Ú	getLoggerr   r<   rd   rf   rN   r   r   r   r   r   r   Ú<module>ru      sY   ðÙ Dã Û Ý ã å Bà	ˆ×	Ñ	˜8Ó	$€ðÐ ð€ð$€ôB˜\ô B÷j/ò j/r   