Ë
    ä°ùi–'  ã            	       ó  — d dl mZmZmZ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  e«       Z eee	d¬«      Zded	efd
„Zdeded	efd„Zdee   d	ee   fd„Zded	ee   fd„Zded	efd„Zej3                  d«      ddedefd„«       Zej3                  d«      dedefd„«       Zej9                  d ee«       e ed«      «      g¬«      dedefd„«       Zej=                  d ee«       e ed«      «      g¬«      defd„«       Zy)é    )Ú	APIRouterÚHTTPExceptionÚRequestÚDepends)ÚProductDatabaseModel)Ú	MONGO_URIÚDB_NAMEÚcategories_collection)Úrequires_permission)Úverify_turnstileÚproducts)Údb_uriÚdb_nameÚcollection_nameÚrequestÚreturnc                 óz   — t        | j                  «      j                  d«      }|j                  d«      r|dd }|S )uó   
    request.base_url cÃ³ thá»ƒ lÃ :
    - https://05factory.com/pod-api/
    - https://05factory.com/pod-api/api/

    Static file Ä‘ang public dÆ°á»›i /pod-api/uploads,
    nÃªn náº¿u base_url káº¿t thÃºc báº±ng /api thÃ¬ bá»� /api Ä‘i.
    ú/z/apiNéüÿÿÿ)ÚstrÚbase_urlÚrstripÚendswith)r   Úroots     úK/var/www/pod-logistic/pod-api-clone/controller/public/product_controller.pyÚ_public_root_urlr      s;   € ô ˆw×ÑÓ ×'Ñ'¨Ó,€Dà‡}�}�VÔØ�C�Rˆyˆà€Kó    Úvaluec                 óâ  — t        |xs d«      j                  «       }|sy|j                  d«      r|S |j                  dd«      j                  «       }|j                  d«      s|j                  d«      r|S |j	                  d«      }|j                  d«      rd|› �S |j                  d«      rt        | «      › d|› �S |j                  d	«      rt        | «      › d|› �S t        | «      › d
|› �S )NÚ Úhttpú\r   z/pod-api/uploads/z	/uploads/zpod-api/uploads/zuploads/zupload_img/z/uploads/upload_img/)r   ÚstripÚ
startswithÚreplaceÚlstripr   )r   r   Úraws      r   Ú_format_upload_urlr(   !   sî   € Ü
ˆeŠk�rÓ
×
 Ñ
 Ó
"€CÙØà
‡~�~�fÔØˆ
à
�+‰+�d˜CÓ
 ×
&Ñ
&Ó
(€Cð ‡~�~Ð)Ô*¨c¯n©n¸[Ô.IØˆ
à
�*‰*�S‹/€Cà
‡~�~Ð(Ô)Ø�3�%ˆyÐà
‡~�~�jÔ!Ü" 7Ó+Ð,¨A¨c¨UÐ3Ð3à
‡~�~�mÔ$Ü" 7Ó+Ð,¨I°c°UÐ;Ð;ô ˜wÓ'Ð(Ð(<¸S¸EÐBÐBr   Úvaluesc                 óÚ   — g }t        «       }| D ]Y  }t        |xs d«      j                  «       }|sŒ#|j                  «       }||v rŒ8|j	                  |«       |j                  |«       Œ[ |S )Nr    )Úsetr   r#   ÚlowerÚaddÚappend)r)   ÚresultÚseenr   ÚcleanedÚkeys         r   Ú_unique_valuesr3   >   sm   € Ø€FÜ‹5€Dàò 
ˆÜ�e’k˜rÓ"×(Ñ(Ó*ˆÙØà�m‰m‹oˆØ�$‰;Øà�‰�ŒØ�‰�gÕð
ð €Mr   Úcategory_idc                 ó,  — t        | xs d«      j                  «       }|sg S |g}t        j                  dd|id|id|igi«      }|rD|j	                  |j                  dd«      |j                  dd«      |j                  dd«      g«       t        |«      S )uô   
    Frontend cÃ³ thá»ƒ gá»­i:
    - slug/_id: craft-handmade
    - name: Craft / Handmade

    Product trong DB hiá»‡n lÆ°u:
    - categoryName: Craft / Handmade

    VÃ¬ váº­y cáº§n resolve slug/_id vá»� name trÆ°á»›c khi query products.
    r    z$orÚ_idÚslugÚname)r   r#   r
   Úfind_oneÚextendÚgetr3   )r4   r'   Ú
candidatesÚcategory_docs       r   Ú_resolve_category_namesr>   Q   s²   € ô ˆkÒ˜RÓ
 ×
&Ñ
&Ó
(€CÙØˆ	à�€Jä(×1Ñ1ØØ�CˆLØ�SˆMØ�SˆMð
ð3ó €Lñ Ø×ÑØ×Ñ˜V RÓ(Ø×Ñ˜V RÓ(Ø×Ñ˜U BÓ'ð
ô 	ô ˜*Ó%Ð%r   Úupdate_datac                 óâ  — t        | «      }t        |j                  dd«      xs d«      j                  «       }|r||d<   |j	                  dd«      xs d|d<   |j	                  dd«      xs d|d<   |j	                  dg «      xs g |d<   |j	                  dg «      xs g |d<   |j	                  dg «      xs g |d<   |j	                  d	g «      xs g |d	<   |j	                  d
g «      xs g |d
<   |S )NÚidr    Ú	productIdÚdescriptionÚadditionalNoteÚ	materialsÚstylesÚvariantsÚshippingRatesÚ	sizeGuide)Údictr   Úpopr#   r;   )r?   Ú
normalizedÚnew_product_ids      r   Ú_normalize_update_payloadrN   t   sú   € Ü�kÓ"€Jä˜Ÿ™¨¨bÓ1Ò7°RÓ8×>Ñ>Ó@€NÙØ"0ˆ
�;Ñà *§¡¨}¸bÓ AÒ GÀR€Jˆ}ÑØ#-§>¡>Ð2BÀBÓ#GÒ#MÈ2€JÐÑ Ø(Ÿn™n¨[¸"Ó=ÒCÀ€Jˆ{ÑØ%Ÿ>™>¨(°BÓ7Ò=¸2€JˆxÑØ'Ÿ^™^¨J¸Ó;ÒA¸r€JˆzÑØ",§.¡.°À"Ó"EÒ"KÈ€JˆÑØ(Ÿn™n¨[¸"Ó=ÒCÀ€Jˆ{ÑàÐr   z	/productsNÚ
categoryIdc              ƒ   óˆ  K  — 	 i }|rt        |«      }|rd|i|d<   n||d<   t        j                  j                  |«      }g }|D �]P  }|j	                  dg «      xs g }t        |«      dkD  r|d   nd}|rt        | |«      nd}	|j	                  dg «      xs g }
g }|
D ]@  }|j                  |j	                  dd«      t        | |j	                  dd«      «      d	œ«       ŒB |j	                  d
d«      |j	                  dd«      |j	                  dd«      j                  «       |j	                  dd«      |j	                  dd«      t        |j	                  dd«      «      |j	                  dd«      |j	                  dd«      |	|dœ
}|j                  |«       �ŒS d|dœS # t        $ r}dt        |«      dœcY d }~S d }~ww xY w­w)Nz$inÚcategoryNameÚimagesr   r    rE   r8   Ú	thumbnail©r8   rS   rB   ÚtitleÚsubCategoryÚpriceÚbadgeÚ
badgeColorú#3b82f6)
rA   rU   rO   rQ   rV   rW   rX   rY   ÚimagerE   F©ÚerrorÚdataT©r]   Úmessage)r>   Údb_modelÚ
collectionÚfindr;   Úlenr(   r.   r,   ÚfloatÚ	Exceptionr   )r   rO   ÚqueryÚcategory_namesÚproducts_cursorÚresult_listÚprR   Úimg_nameÚ	image_urlÚraw_materialsÚformatted_materialsÚmaterialÚitemÚes                  r   Úget_public_productsrs   †   sÎ  è ø€ ð/2ØˆáÜ4°ZÓ@ˆNáØ).°Ð(?��nÒ%à(2��nÑ%ä"×-Ñ-×2Ñ2°5Ó9ˆàˆØ ó 	%ˆAØ—U‘U˜8 RÓ(Ò.¨BˆFÜ$'¨£K°!¢O�v˜a’y¸ˆHÙAIÔ*¨7°HÔ=ÈrˆIàŸE™E +¨rÓ2Ò8°bˆMØ"$ÐØ)ò �Ø#×*Ñ*Ø$ŸL™L¨°Ó4Ü!3°G¸X¿\¹\È+ÐWYÓ=ZÓ![ñ,õ ðð —e‘e˜K¨Ó,ØŸ™˜w¨Ó+ØŸe™e N°BÓ7×=Ñ=Ó?Ø !§¡ n°bÓ 9Ø Ÿu™u ]°BÓ7Ü˜qŸu™u W¨aÓ0Ó1ØŸ™˜w¨Ó+ØŸe™e L°)Ó<Ø"Ø0ñˆDð ×Ñ˜tÖ$ð5	%ð: Øñ
ð 	
øô ò 2Ø¬#¨a«&Ñ1Õ1ûð2üs5   ‚G„FF ÆGÆ	F?Æ'F:Æ4F?Æ5GÆ:F?Æ?Gz/products/{product_id}Ú
product_idc              ƒ   ó¢  K  — 	 t         j                  j                  d|i«      }|st        dd¬«      ‚|j	                  dg «      xs g }g }|D ]!  }|j                  |rt        | |«      nd«       Œ# |D �cg c]  }|sŒ|‘Œ	 }}|sdg}|j	                  dg «      xs g }g }|D ]@  }|j                  |j	                  d	d«      t        | |j	                  d
d«      «      dœ«       ŒB |j	                  dg «      xs g }	g }
|	D ]@  }|
j                  |j	                  d	d«      t        | |j	                  d
d«      «      dœ«       ŒB i d|j	                  dd«      “d|j	                  dd«      “d|j	                  dd«      j                  «       “d|j	                  dd«      “d|j	                  dd«      “dt        |j	                  dd«      «      “d|j	                  dd«      “d|j	                  dd«      “d|j	                  dd«      “d|j	                  dd«      “d|“d|j	                  dg «      “d|
“d|“d|j	                  dddddœ«      “d|j	                  dg «      xs g “d |j	                  d g «      xs g “d!|j	                  d!g «      xs g i¥}d"|d#œS c c}w # t        $ r}|‚d }~wt        $ r}d$t        |«      d%œcY d }~S d }~ww xY w­w)&NrB   é”  zProduct not found©Ústatus_codeÚdetailrR   r    zhttps://via.placeholder.com/500rF   r8   rS   rT   rE   rA   rU   rO   rQ   rV   rW   r   rC   rD   rX   rY   rZ   ÚsizesÚdesignTemplatei”  i  i,  )ÚwidthÚheightÚdpirG   rH   rI   Fr\   Tr_   )ra   rb   r9   r   r;   r.   r(   r,   re   rf   r   )r   rt   rk   Ú
raw_imagesÚformatted_imagesÚimgÚ
raw_stylesÚformatted_stylesÚstylern   ro   rp   rq   Úherr   s                  r   Úget_product_detailr†   º   s_  è ø€ ð@2Ü×Ñ×(Ñ(¨+°zÐ)BÓCˆáÜ¨CÐ8KÔLÐLà—U‘U˜8 RÓ(Ò.¨Bˆ
ØÐØò 	UˆCØ×#Ñ#ÉÔ$6°wÀÔ$DÐQSÕTð	Uð ,<ÖC CºsšCÐCÐÐCáØ AÐBÐà—U‘U˜8 RÓ(Ò.¨Bˆ
ØÐØò 	ˆEØ×#Ñ#ØŸ	™	 &¨"Ó-Ü/°¸¿¹À;ÐPRÓ9SÓTñ%õ ð	ð Ÿ™˜k¨2Ó.Ò4°"ˆØ ÐØ%ò 	ˆHØ×&Ñ&Ø Ÿ™ V¨RÓ0Ü/°¸¿¹ÀkÐSUÓ9VÓWñ(õ ð	ð
Ø�!—%‘%˜ RÓ(ð
à�Q—U‘U˜7 BÓ'ð
ð ˜!Ÿ%™% °Ó3×9Ñ9Ó;ð
ð ˜AŸE™E .°"Ó5ð	
ð
 ˜1Ÿ5™5 °Ó3ð
ð ”U˜1Ÿ5™5 ¨!Ó,Ó-ð
ð ˜1Ÿ5™5 °Ó3ð
ð ˜aŸe™eÐ$4°bÓ9ð
ð �Q—U‘U˜7 BÓ'ð
ð ˜!Ÿ%™% ¨iÓ8ð
ð Ð&ð
ð �Q—U‘U˜7 BÓ'ð
ð Ð,ð
ð Ð&ð
ð ˜aŸe™eÐ$4ØØØñ7ó ð
ð( ˜Ÿ™˜j¨"Ó-Ò3°ð)
ð* ˜QŸU™U ?°BÓ7Ò=¸2ð+
ð, ˜Ÿ™˜{¨BÓ/Ò5°2ñ-
ˆð4 Øñ
ð 	
ùò] Døôd ò ØˆûÜò 2Ø¬#¨a«&Ñ1Õ1ûð2üsZ   ‚K„A2J Á6JÁ>JÂHJ ÊKÊJ Ê	KÊ&J(Ê(KÊ4KËKËKËKËKÚproduct_management)Údependenciesc              ƒ   ó`  K  — 	 |j                  «       ƒ d {  –—† }t        j                  j                  d| i«      }|st	        dd¬«      ‚t        |«      }t        |j                  d«      xs d«      j                  «       }|r5|| k7  r0t        j                  j                  d|i«      }|rt	        dd¬«      ‚t        j                  j                  d| id|i«      }|j                  d	k(  rd
ddœS d
ddœS 7 Œß# t        $ r}|‚d }~wt        $ r}	ddt        |	«      › �dœcY d }	~	S d }	~	ww xY w­w)NrB   rv   u2   KhÃ´ng tÃ¬m tháº¥y sáº£n pháº©m Ä‘á»ƒ cáº­p nháº­trw   r    i�  u6   Product ID Ä‘Ã£ tá»“n táº¡i, vui lÃ²ng chá»�n ID khÃ¡cz$setr   Tu5   Dá»¯ liá»‡u khÃ´ng cÃ³ thay Ä‘á»•i so vá»›i báº£n cÅ©©Úsuccessr`   u'   Cáº­p nháº­t sáº£n pháº©m thÃ nh cÃ´ng!Fu   Lá»—i há»‡ thá»‘ng: )Újsonra   rb   r9   r   rN   r   r;   r#   Ú
update_oneÚmodified_countrf   )
rt   r   r?   Úexisting_productÚnormalized_update_datarM   Ú
duplicatedr/   r…   rr   s
             r   Úupdate_productr’   ÿ   sE  è ø€ ð
"NØ#ŸL™L›N×*ˆä#×.Ñ.×7Ñ7¸ÀjÐ8QÓRÐÙÜ¨CÐ8lÔmÐmä!:¸;Ó!GÐäÐ3×7Ñ7¸ÓDÒJÈÓK×QÑQÓSˆá˜n°
Ò:Ü!×,Ñ,×5Ñ5°{ÀNÐ6SÓTˆJÙÜ#Ø #ØSôð ô
 ×$Ñ$×/Ñ/Ø˜*Ð%ØÐ+Ð,ó
ˆð
 × Ñ  AÒ%Ø#Ð0gÑhÐhð Ø@ñ
ð 	
ð5 +ùô< ò ØˆûÜò NØ Ð/CÄCÈÃFÀ8Ð-LÑMÕMûðNüs]   ‚D.„C9 —C7˜CC9 Ã1D.Ã2C9 Ã6D.Ã7C9 Ã9	D+ÄDÄD+ÄD&Ä D+Ä!D.Ä&D+Ä+D.c              ƒ   ó  K  — 	 t         j                  j                  d| i«      }|j                  dk(  rt	        dd¬«      ‚dd| › d�d	œS # t        $ r}|‚d }~wt
        $ r}d
dt        |«      › �d	œcY d }~S d }~ww xY w­w)NrB   r   rv   uC   Sáº£n pháº©m khÃ´ng tá»“n táº¡i hoáº·c Ä‘Ã£ bá»‹ xÃ³a trÆ°á»›c Ä‘Ã³rw   Tu$   Ä�Ã£ xÃ³a vÄ©nh viá»…n sáº£n pháº©m ú!rŠ   Fu   Lá»—i khi xÃ³a: )ra   rb   Ú
delete_oneÚdeleted_countr   rf   r   )rt   r/   r…   rr   s       r   Údelete_productr—   )  s–   è ø€ ð
JÜ×$Ñ$×/Ñ/°¸jÐ0IÓJˆà×Ñ 1Ò$Ü¨CÐ8}Ô~Ð~ð Ø=¸j¸\ÈÐKñ
ð 	
øô ò ØˆûÜò JØ Ð/?ÄÀAÃ¸xÐ-HÑIÕIûðJüsA   ‚A?„AA
 Á	A?Á
	A<ÁAÁA<Á!A7Á1A<Á2A?Á7A<Á<A?)N) Úfastapir   r   r   r   Úmodel.productr   ÚMongoDBConnectionr   r	   r
   Úutils.auth_helperr   Úutils.turnstile_helperr   Úrouterra   r   r   r(   Úlistr3   r>   rJ   rN   r;   rs   r†   Úputr’   Údeleter—   © r   r   ú<module>r¢      s£  ðß >Ó >Ý .ß GÑ GÝ 1Ý 3á	‹€áØØØô€ð˜gð ¨#ó ð"C ð C°ð C¸ó Cð:˜4 ™9ð ¨¨c©ó ð& &¨ð  &°°c±ó  &ðF¨4ð °Dó ð$ ‡�ˆKÓñ02 wð 02¸Cò 02ó ð02ðf ‡�Ð$Ó%ðA2 gð A2¸3ò A2ó &ðA2ðH ‡�ØÙÐ*Ó+©WÑ5HÐI]Ó5^Ó-_Ð`ð ó ð#N Sð #N°7ò #Nó	ð#NðL ‡�ØÙÐ*Ó+©WÑ5HÐI]Ó5^Ó-_Ð`ð ó ðJ Sò Jó	ñJr   