Ë
    ó'j[  ã                  ó  — 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mZmZ ddlmZmZmZ ddlmZmZ h d£Zh d£Zdd„Z dd„Z!dd„Z"dd„Z#dd„Z$dd„Z%d d„Z&d!d„Z'd"d„Z(d#d„Z)d$d„Z*y)%zBCRUD for the `admin` profile table (linked to users.id for login).é    )ÚannotationsN)ÚPath)ÚHTTPExceptionÚ
UploadFileÚstatus)ÚinspectÚtext)ÚEngine)ÚSession)Úget_settings)ÚAdminÚUserÚUserRole)ÚAdminProfilePublicÚAdminProfileUpdateÚRoleEnum)Úmedia_public_urlÚuploads_base_dir>   ú.gifú.jpgú.pngú.jpegú.webp>   ú	image/gifú	image/jpgú	image/pngú
image/jpegú
image/webpúimage/pjpegúimage/x-pngc           	     ó&  — ddl m} ddlm} |j                  j                  | |j                  g¬«       	 t        | «      }d|j                  «       vry|j                  d«      D �ch c]  }|d   ’Œ	 }}g }d|vr|j                  d	«       d
|vr|j                  d«       |sy| j                  j                  dk(  }| j                  «       5 }|D ]S  }	|	j                  «       d   }
|r|j!                  t#        d|	› �«      «       Œ6	 |j!                  t#        d|	› �«      «       ŒU 	 ddd«       yc c}w # t        $ r Y yw xY w# t        $ r7 |
t        | «      j                  d«      D �ch c]  }|d   ’Œ	 nc c}w c}vr‚ Y Œ³w xY w# 1 sw Y   yxY w)zQEnsure `admin` table exists (create_all also runs; this adds columns on old DBs).r   )ÚBase)r   )ÚbindÚtablesÚadminNÚnameÚphone_numberzphone_number VARCHAR(32)Úprofile_imagezprofile_image VARCHAR(512)Ú
postgresqlz+ALTER TABLE admin ADD COLUMN IF NOT EXISTS zALTER TABLE admin ADD COLUMN )Úapp.databaser"   Ú
app.modelsr   ÚmetadataÚ
create_allÚ	__table__r   Úget_table_namesÚget_columnsÚ	ExceptionÚappendÚdialectr&   ÚbeginÚsplitÚexecuter	   )Úenginer"   r   ÚinspÚcÚcolsÚaltersÚis_pgÚconnÚcol_defÚcol_names              úG/var/www/html/kelly/kelly-backend/app/services/admin_profile_service.pyÚsync_admin_tablerA      s„  € å!Ý à‡M�M×Ñ &°%·/±/Ð1BÐÔCðÜ�v‹ˆØ˜$×.Ñ.Ó0Ñ0ØØ#'×#3Ñ#3°GÔ#<Ó=Ñ#<˜a��&“	Ð#<ˆÐ=ð €FØ˜TÑ!Ø�‰Ð0Ô1Ø˜dÑ"Ø�‰Ð2Ô3áØà�N‰N×Ñ <Ñ/€EØ	�‰Œ˜4ÛˆGØ—}‘}“ qÑ)ˆHÙØ—‘œTÐ$OÐPWÈyÐ"YÓZÕ[ðØ—L‘L¤Ð(EÀgÀYÐ&OÓ!PÕQñ ÷ 
ˆùò >øÜò Ùðûô* !ò Ø¼7À6»?×;VÑ;VÐW^Ô;_Ó'`Ñ;_°a¨¨&«	Ñ;_ùÔ'`Ñ`Øñ aðú÷ 
ˆúse   ¶D5 ÁD5 Á'D0Á3D5 Ã9FÄEÄ$FÄ0D5 Ä5	EÅ EÅ&FÅ*E7Å6FÆFÆFÆFÆFc                óŽ   — | xs dj                  «       j                  d d«      }|syt        |«      dk(  r|d   dfS |d   |d   fS )NÚ é   )rC   rC   r   )Ústripr5   Úlen)Ú	full_nameÚpartss     r@   Ú_split_full_namerI   D   sS   € ØŠ_˜"×#Ñ#Ó%×+Ñ+¨D°!Ó4€EÙØÜ
ˆ5ƒz�Q‚Ø�Q‰x˜ˆ|ÐØ�‰8�U˜1‘XÐÐó    c                ó†  — | j                  t        «      j                  t        j                  |j                  k(  «      j                  «       }|r|S t        |j                  «      \  }}t        |j                  ||d |j                  d ¬«      }| j                  |«       | j                  «        | j                  |«       |S )N)Úuser_idÚ
first_nameÚ	last_namer'   Úemailr(   )Úqueryr   ÚfilterrL   ÚidÚfirstrI   rG   rO   ÚaddÚcommitÚrefresh)ÚdbÚuserÚrowrS   Úlasts        r@   Úensure_admin_profiler[   M   s”   € Ø
�(‰(”5‹/×
 Ñ
 ¤§¡°$·'±'Ñ!9Ó
:×
@Ñ
@Ó
B€CÙ
Øˆ
Ü" 4§>¡>Ó2�K€Eˆ4Ü
Ø—‘ØØØØ�j‰jØô€Cð ‡F�Fˆ3„KØ‡I�I„KØ‡J�Jˆs„OØ€JrJ   c                óÌ   — | j                  t        «      j                  t        j                  t        j
                  k(  «      j                  «       }|D ]  }t        | |«       Œ y ©N)rP   r   rQ   Úroler   r%   Úallr[   )rW   ÚadminsrX   s      r@   Úbackfill_admin_profilesra   `   sD   € Ø�X‰X”d‹^×"Ñ"¤4§9¡9´·±Ñ#>Ó?×CÑCÓE€FÛˆÜ˜R Õ&ñ rJ   c                ó¤  — | j                   › d| j                  › �j                  «       }t        | j                  «      }t        | j                  | j                  | j                   | j                  || j                  | j                  t        j                  | j                  |t        | j                  «      | j                  | j                  ¬«      S )NÚ )rR   rL   rM   rN   rG   r'   rO   r^   r(   Úprofile_image_urlÚhas_profile_imageÚ
created_atÚ
updated_at)rM   rN   rE   r   r(   r   rR   rL   r'   rO   r   r%   Úboolrf   rg   )r%   rG   Ú	image_urls      r@   Úserialize_admin_profilerj   f   s¨   € Ø×#Ñ#Ð$ A e§o¡oÐ%6Ð7×=Ñ=Ó?€IÜ  ×!4Ñ!4Ó5€IÜØ�8‰8Ø—‘Ø×#Ñ#Ø—/‘/ØØ×'Ñ'Ø�k‰kÜ�^‰^Ø×)Ñ)Ø#Ü˜u×2Ñ2Ó3Ø×#Ñ#Ø×#Ñ#ôð rJ   c                ó¦   — | j                   €| j                  �| j                   | j                  fS | j                  �t        | j                  «      S y)N)NN)rM   rN   rG   rI   )Úbodys    r@   Ú_resolve_namesrm   z   sD   € Ø‡�Ð" d§n¡nÐ&@Ø�‰ §¡Ð.Ð.Ø‡~�~Ð!Ü §¡Ó/Ð/ØrJ   c                ó:  — t        | |«      }t        |«      \  }}|�|j                  «       |_        |�|j                  «       |_        |j
                  �#|j
                  j                  «       xs d |_        |j                  �®t        |j                  «      }||j                  k7  rƒ| j                  t        «      j                  t        j                  |k(  t        j                  |j                  k7  «      j                  «       }|rt        t        j                  d¬«      ‚||_        ||_        |j                  › d|j                  › �j                  «       |_        | j#                  «        | j%                  |«       | j%                  |«       t'        |«      S )NzEmail already in use©Ústatus_codeÚdetailrc   )r[   rm   rE   rM   rN   r'   rO   ÚstrrP   r   rQ   rR   rS   r   r   ÚHTTP_409_CONFLICTrG   rU   rV   rj   )rW   rX   rl   r%   rS   rZ   Ú	new_emailÚexistss           r@   Úupdate_admin_profilerv   ‚   s?  € Ü   TÓ*€Eä  Ó&�K€Eˆ4ØÐØ Ÿ;™;›=ˆÔØÐØŸ*™*›,ˆŒà×ÑÐ$Ø!×.Ñ.×4Ñ4Ó6Ò>¸$ˆÔà‡z�zÐÜ˜Ÿ
™
“Oˆ	Ø˜Ÿ
™
Ò"Ø—X‘Xœd“^×*Ñ*¬4¯:©:¸Ñ+BÄDÇGÁGÈtÏwÉwÑDVÓW×]Ñ]Ó_ˆFÙÜ#´×0HÑ0HÐQgÔhÐhØ"ˆDŒJØˆŒà×(Ñ(Ð)¨¨5¯?©?Ð*;Ð<×BÑBÓD€D„NØ‡I�I„KØ‡J�JˆuÔØ‡J�JˆtÔÜ" 5Ó)Ð)rJ   c                 óF   — t        «       dz  } | j                  dd¬«       | S )Nr%   T)ÚparentsÚexist_ok)r   Úmkdir)Údests    r@   Úadmin_image_upload_dirr|   ž   s$   € ÜÓ Ñ'€DØ‡J�J�t d€JÔ+Ø€KrJ   c                óŒ   — | sy t        «       t        | «      j                  z  }|j                  «       r|j	                  «        y y r]   )r|   r   r&   Úis_fileÚunlink)Úrelative_pathÚpaths     r@   Údelete_admin_profile_imager‚   ¤   s7   € ÙØÜ!Ó#¤d¨=Ó&9×&>Ñ&>Ñ>€DØ‡|�|„~Ø�‰�ð rJ   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)NrC   Ú;r   zimage/Ú.Ú/rD   z!Unsupported image type. Allowed: z, ro   zUnsupported image content typei   zImage too large (max z MB)zEmpty image filezadmin/)r   Úcontent_typer5   rE   ÚlowerÚfilenamer   ÚsuffixÚ
startswithÚALLOWED_ADMIN_IMAGE_EXTENSIONSr   r   ÚHTTP_400_BAD_REQUESTÚjoinÚsortedÚ!ALLOWED_ADMIN_IMAGE_CONTENT_TYPESÚreadÚcommunity_max_upload_mbrF   ÚuuidÚuuid4Úhexr|   Úwrite_bytes)	ÚmediaÚsettingsr‡   r‰   ÚextÚdataÚ	max_bytesÚstored_namer{   s	            r@   Úsave_admin_profile_imager�   ¬   s³  è ø€ Ü‹~€HØ×&Ñ&Ò,¨"×3Ñ3°CÓ8¸Ñ;×AÑAÓC×IÑIÓK€LØ�~‰~Ò# €HÜ
ˆx‹.×
Ñ
×
%Ñ
%Ó
'€CÙ�<×*Ñ*¨8Ô4Ø�L×&Ñ& s¨AÓ.¨qÑ1Ñ1ˆØ
Ô0Ñ0ÜÜ×3Ñ3Ø6°t·y±yÄÔHfÓAgÓ7hÐ6iÐjô
ð 	
ñ
 	ØÔ AÑAØ×'Ñ'¨Ô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Ü!Ó# kÑ1€DØ×Ñ�TÔØ�K�=Ð!Ð!ð ús   ‚D2G&Ä4G$Ä5B0G&c                óª   — t        | |«      }t        |j                  «       ||_        | j                  «        | j	                  |«       t        |«      S r]   )r[   r‚   r(   rU   rV   rj   )rW   rX   Ú
image_pathr%   s       r@   Úset_admin_profile_imager    Ï   sD   € Ü   TÓ*€EÜ˜u×2Ñ2Ô3Ø$€EÔØ‡I�I„KØ‡J�JˆuÔÜ" 5Ó)Ð)rJ   )r7   r
   ÚreturnÚNone)rG   rr   r¡   ztuple[str, str])rW   r   rX   r   r¡   r   )rW   r   r¡   r¢   )r%   r   r¡   r   )rl   r   r¡   ztuple[str | None, str | None])rW   r   rX   r   rl   r   r¡   r   )r¡   r   )r€   z
str | Noner¡   r¢   )r—   r   r¡   rr   )rW   r   rX   r   rŸ   rr   r¡   r   )+Ú__doc__Ú
__future__r   r“   Úpathlibr   Úfastapir   r   r   Ú
sqlalchemyr   r	   Úsqlalchemy.enginer
   Úsqlalchemy.ormr   Ú
app.configr   r+   r   r   r   Úapp.schemasr   r   r   Úapp.services.admin_servicer   r   rŒ   r�   rA   rI   r[   ra   rj   rm   rv   r|   r‚   r�   r    © rJ   r@   Ú<module>r®      sy   ðÙ Hå "ã Ý ç 5Ñ 5ß $Ý $Ý "å #ß ,Ñ ,ß HÑ Hß Iâ!KÐ ò%Ð !ó#óLóó&'óó(ó*ó8óó "ôF*rJ   