Ë
    ó'jl  ã                  óÀ   — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZm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 h d£Zh d£Zdd„Zdd„Zdd„Zdd„Zdd„Zy)z"User profile image upload helpers.é    )ÚannotationsN)ÚPath)ÚHTTPExceptionÚ
UploadFileÚstatus)ÚinspectÚtext)ÚEngine)ÚSession)Úget_settings)ÚUser)Úuploads_base_dir>   ú.gifú.jpgú.pngú.jpegú.webp>   ú	image/gifú	image/jpgú	image/pngú
image/jpegú
image/webpúimage/pjpegúimage/x-pngc                óÀ  — 	 t        | «      }d|j                  «       vry|j                  d«      D �ch c]  }|d   ’Œ	 }}d|v ry| j                  j
                  dk(  }| j                  «       5 }|r|j                  t        d«      «       n	 |j                  t        d«      «       ddd«       yc c}w # t        $ r Y yw xY w# t        $ r Y Œ(w xY w# 1 sw Y   yxY w)z3Ensure `users.profile_image` exists for legacy DBs.ÚusersNÚnameÚprofile_imageÚ
postgresqlzEALTER TABLE users ADD COLUMN IF NOT EXISTS profile_image VARCHAR(512)z7ALTER TABLE users ADD COLUMN profile_image VARCHAR(512))	r   Úget_table_namesÚget_columnsÚ	ExceptionÚdialectr   ÚbeginÚexecuter	   )ÚengineÚinspÚcÚcolsÚis_pgÚconns         úL/var/www/html/kelly/kelly-backend/app/services/user_profile_image_service.pyÚsync_users_profile_image_columnr-      sÚ   € ðÜ�v‹ˆØ˜$×.Ñ.Ó0Ñ0ØØ#'×#3Ñ#3°GÔ#<Ó=Ñ#<˜a��&“	Ð#<ˆÐ=ð ˜$ÑØà�N‰N×Ñ <Ñ/€EØ	�‰Œ˜4ÙØ�L‰LœÐeÓfÕgðØ—‘œTÐ"[Ó\Ô]÷ 
ˆùò >øÜò Ùðûô ò Ùðú÷ 
ˆúsP   ‚B6  B6 ³B1¿B6 Á/CÂCÂ1B6 Â6	CÃCÃ	CÃCÃCÃCÃCc                 óF   — t        «       dz  } | j                  dd¬«       | S )Nzuser-profileT)ÚparentsÚexist_ok)r   Úmkdir)Údests    r,   Úuser_image_upload_dirr3   5   s$   € ÜÓ Ñ.€DØ‡J�J�t d€JÔ+Ø€Kó    c                óŒ   — | sy t        «       t        | «      j                  z  }|j                  «       r|j	                  «        y y )N)r3   r   r   Úis_fileÚunlink)Úrelative_pathÚpaths     r,   Údelete_user_profile_imager:   ;   s7   € ÙØÜ Ó"¤T¨-Ó%8×%=Ñ%=Ñ=€DØ‡|�|„~Ø�‰�ð r4   c           	   ƒ  óÐ  K  — t        «       }| j                  xs dj                  d«      d   j                  «       j	                  «       }| j
                  xs d}t        |«      j                  j	                  «       }|s)|j                  d«      rd|j                  dd«      d   z   }|t        vr:t        t        j                  dd	j                  t        t        «      «      › �¬
«      ‚|r4|t        vr,|j                  d«      st        t        j                  d¬
«      ‚| j!                  «       ƒ d {  –—† }|j"                  dz  dz  }t%        |«      |kD  r)t        t        j                  d|j"                  › d�¬
«      ‚|st        t        j                  d¬
«      ‚t'        j(                  «       j*                  › |› �}t-        «       |z  }|j/                  |«       d|› �S 7 Œ¯­w)NÚ Ú;r   zimage/Ú.Ú/é   z!Unsupported image type. Allowed: z, )Ústatus_codeÚdetailzUnsupported image content typei   zImage too large (max z MB)zEmpty image filezuser-profile/)r   Úcontent_typeÚsplitÚstripÚlowerÚfilenamer   ÚsuffixÚ
startswithÚALLOWED_USER_IMAGE_EXTENSIONSr   r   ÚHTTP_400_BAD_REQUESTÚjoinÚsortedÚ ALLOWED_USER_IMAGE_CONTENT_TYPESÚreadÚcommunity_max_upload_mbÚlenÚuuidÚuuid4Úhexr3   Úwrite_bytes)	ÚmediaÚsettingsrC   rG   ÚextÚdataÚ	max_bytesÚstored_namer2   s	            r,   Úsave_user_profile_imager\   C   s³  è ø€ Ü‹~€HØ×&Ñ&Ò,¨"×3Ñ3°CÓ8¸Ñ;×AÑAÓC×IÑIÓK€LØ�~‰~Ò# €HÜ
ˆx‹.×
Ñ
×
%Ñ
%Ó
'€CÙ�<×*Ñ*¨8Ô4Ø�L×&Ñ& s¨AÓ.¨qÑ1Ñ1ˆà
Ô/Ñ/ÜÜ×3Ñ3Ø6°t·y±yÄÔHeÓAfÓ7gÐ6hÐiô
ð 	
ñ
 	ØÔ @Ñ@Ø×'Ñ'¨Ô1ä¬×(CÑ(CÐLlÔmÐmà—‘“×€DØ×0Ñ0°4Ñ7¸$Ñ>€IÜ
ˆ4ƒy�9ÒÜÜ×3Ñ3Ø*¨8×+KÑ+KÐ*LÈDÐQô
ð 	
ñ Ü¬×(CÑ(CÐL^Ô_Ð_ä—Z‘Z“\×%Ñ%Ð& s eÐ,€KÜ Ó" [Ñ0€DØ×Ñ�TÔØ˜;˜-Ð(Ð(ð ús   ‚D2G&Ä4G$Ä5B0G&c                ó‚   — t        t        |dd «      «       ||_        | j                  «        | j	                  |«       |S )Nr   )r:   Úgetattrr   ÚcommitÚrefresh)ÚdbÚuserÚ
image_paths      r,   Úset_user_profile_imagerd   g   s5   € Üœg d¨O¸TÓBÔCØ#€DÔØ‡I�I„KØ‡J�JˆtÔØ€Kr4   )r&   r
   ÚreturnÚNone)re   r   )r8   z
str | Nonere   rf   )rV   r   re   Ústr)ra   r   rb   r   rc   rg   re   r   )Ú__doc__Ú
__future__r   rR   Úpathlibr   Úfastapir   r   r   Ú
sqlalchemyr   r	   Úsqlalchemy.enginer
   Úsqlalchemy.ormr   Ú
app.configr   Ú
app.modelsr   Úapp.services.admin_servicer   rJ   rN   r-   r3   r:   r\   rd   © r4   r,   Ú<module>rs      sQ   ðÙ (å "ã Ý ç 5Ñ 5ß $Ý $Ý "å #Ý Ý 7â JÐ ò$Ð  óó0óó!)ôHr4   