Ë
    zëjž  ã                   ó¬  — d dl m Z mZ d dlmZmZ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mZmZmZ d dlmZmZ d d	lmZmZ d d
lmZm Z   eddg¬«      Z!dZ"dZ#e!jI                  de¬«       ee
«      fdedefd„«       Z%e!jI                  de¬«       ee«      fdefd„«       Z&dededefd„Z'e!jI                  de¬«       ee
«      fdedefd„«       Z(e!jI                  ded¬«       ee
«      fdedefd„«       Z)e!jI                  d e¬«       ee
«      fdedefd!„«       Z*e!jI                  d"e¬«       ee
«      fdedefd#„«       Z+y$)%é    )ÚdatetimeÚtimezone)Ú	APIRouterÚDependsÚHTTPExceptionÚstatus)ÚSession)Úget_db)Úrequire_admin_token)ÚPasswordResetTokenÚUserÚUserRole)ÚForgotPasswordRequestÚLoginRequestÚMessageÚResetPasswordRequestÚTokenÚVerifyOTPRequest)Úhash_passwordÚverify_password)ÚauthenticateÚissue_token_for)Úfind_user_by_emailÚsend_password_reset_otpz/authz
admin-auth)ÚprefixÚtagszOIf an admin account exists for this email, a password reset code has been sent.z=Password reset code sent. Check your inbox (and spam folder).z/login)Úresponse_modelÚbodyÚdbc                 ó0  — t        || j                  | j                  «      }|r|j                  t        j
                  k7  rt        t        j                  d¬«      ‚|j                  st        t        j                  d¬«      ‚t        t        |«      ¬«      S )NzInvalid admin credentials©Ústatus_codeÚdetailzInactive account)Úaccess_token)r   ÚemailÚpasswordÚroler   Úadminr   r   ÚHTTP_401_UNAUTHORIZEDÚ	is_activeÚHTTP_403_FORBIDDENr   r   )r   r   Úusers      ú;/var/www/html/kelly/kelly-backend/app/routers/admin/auth.pyÚadmin_loginr.      si   € ä˜˜DŸJ™J¨¯©Ó6€DÙ�4—9‘9¤§¡Ò.Ü¬×(DÑ(DÐMhÔiÐiØ�>Š>Ü¬×(AÑ(AÐJ\Ô]Ð]Üœo¨dÓ3Ô4Ð4ó    z/logoutÚ_c                 ó   — t        d¬«      S )zQJWT is stateless: discard the token on the client. This endpoint is for symmetry.z
Logged out©Úmessage)r   )r0   s    r-   Úadmin_logoutr4      s   € ô ˜<Ô(Ð(r/   Úreturnc              ƒ   ó\  K  — t        |t        | j                  «      t        j                  ¬«      }|st        t        j                  d¬«      ‚	 t        ||«      ƒ d {  –—†  t        t        ¬«      S 7 Œ# t        $ r*}t        t        j                  t        |«      ¬«      |‚d }~ww xY w­w)N©r'   zEmail is not registeredr!   r2   )r   Ústrr%   r   r(   r   r   ÚHTTP_404_NOT_FOUNDr   ÚRuntimeErrorÚHTTP_503_SERVICE_UNAVAILABLEr   Ú_ADMIN_FORGOT_SENT_MSG)r   r   r,   Úexcs       r-   Úadmin_forgot_password_handlerr>   $   s•   è ø€ Ü˜b¤# d§j¡j£/¼¿¹ÔG€DÙÜÜ×1Ñ1Ø,ô
ð 	
ðÜ% b¨$Ó/×/Ð/ô Ô1Ô2Ð2ð 	0ùÜò ÜÜ×;Ñ;Ü�s“8ô
ð ð	ûðüs<   ‚AB,ÁA6 ÁA4Á A6 Á$B,Á4A6 Á6	B)Á?%B$Â$B)Â)B,z/forgot-passwordc              ƒ   ó6   K  — t        | |«      ƒ d {  –—† S 7 Œ­w©N©r>   ©r   r   s     r-   Úadmin_forgot_passwordrC   5   ó   è ø€ ä.¨t°RÓ8×8Ð8Ð8úó   ‚’“z	/send-otpz Resend admin password reset code)r   Úsummaryc              ƒ   ó6   K  — t        | |«      ƒ d {  –—† S 7 Œ­wr@   rA   rB   s     r-   Úadmin_send_reset_otprH   :   rD   rE   z/reset-passwordc                 óÞ  — t        |t        | j                  «      t        j                  ¬«      }|st        t        j                  d¬«      ‚|j                  t        «      j                  t        j                  |j                  k(  t        j                  j                  d«      «      j                  t        j                   j#                  «       «      j%                  «       }t        | j&                  «      j)                  «       }|rt+        ||j,                  «      st        t        j                  d¬«      ‚|j.                  }|j0                  € |j3                  t4        j6                  ¬«      }|t9        j:                  t4        j6                  «      k  rt        t        j                  d¬«      ‚t=        | j>                  «      |_         d|_        |jC                  «        tE        d	¬
«      S )Nr7   úInvalid requestr!   FzInvalid or expired OTP©ÚtzinfoúOTP expiredTzPassword updatedr2   )#r   r8   r%   r   r(   r   r   ÚHTTP_400_BAD_REQUESTÚqueryr   ÚfilterÚuser_idÚidÚusedÚis_Úorder_byÚ
created_atÚdescÚfirstÚotpÚstripr   Úotp_hashÚ
expires_atrL   Úreplacer   Úutcr   Únowr   Únew_passwordÚhashed_passwordÚcommitr   )r   r   r,   Ú	token_rowrY   Úexpiress         r-   Úadmin_reset_passwordre   ?   sX  € ä˜b¤# d§j¡j£/¼¿¹ÔG€DÙÜ¬×(CÑ(CÐL]Ô^Ð^ð 	�‰Ô#Ó$ß	‰Ü×&Ñ&¨$¯'©'Ñ1Ü×#Ñ#×'Ñ'¨Ó.ó

÷ 
‰Ô$×/Ñ/×4Ñ4Ó6Ó	7ß	‰‹ð ô ˆd�h‰h‹-×
Ñ
Ó
€CÙœO¨C°×1CÑ1CÔDÜ¬×(CÑ(CÐLdÔeÐeà×"Ñ"€GØ‡~�~ÐØ—/‘/¬¯©�/Ó6ˆØ”—‘œhŸl™lÓ+Ò+Ü¬×(CÑ(CÈMÔZÐZä(¨×):Ñ):Ó;€DÔØ€I„NØ‡I�I„KÜÐ-Ô.Ð.r/   z/verify-otpc                 ó¦  — t        |t        | j                  «      t        j                  ¬«      }|st        t        j                  d¬«      ‚|j                  r'|j                  | j                  j                  «       k7  rt        t        j                  d¬«      ‚|j                  t        «      j                  t        j                  |j                  k(  t        j                  j!                  d«      «      j#                  t        j$                  j'                  «       «      j)                  «       }|st        t        j                  d¬«      ‚|j*                  }|j,                  € |j/                  t0        j2                  ¬«      }|t5        j6                  t0        j2                  «      k  rt        t        j                  d¬«      ‚t9        d¬	«      S )
Nr7   rJ   r!   zinsert the correct otpFrK   rM   zOTP verified successfullyr2   )r   r8   r%   r   r(   r   r   rN   rY   rZ   rO   r   rP   rQ   rR   rS   rT   rU   rV   rW   rX   r\   rL   r]   r   r^   r   r_   r   )r   r   r,   rc   rd   s        r-   Úadmin_verify_otprg   ^   sA  € ä˜b¤# d§j¡j£/¼¿¹ÔG€DÙÜ¬×(CÑ(CÐL]Ô^Ð^à�8Š8�t—x‘x 4§8¡8§>¡>Ó#3Ò3Ü¬×(CÑ(CÐLdÔeÐeð 	�‰Ô#Ó$ß	‰Ü×&Ñ&¨$¯'©'Ñ1Ü×#Ñ#×'Ñ'¨Ó.ó

÷ 
‰Ô$×/Ñ/×4Ñ4Ó6Ó	7ß	‰‹ð ñ Ü¬×(CÑ(CÐLdÔeÐeà×"Ñ"€GØ‡~�~ÐØ—/‘/¬¯©�/Ó6ˆØ”—‘œhŸl™lÓ+Ò+Ü¬×(CÑ(CÈMÔZÐZäÐ6Ô7Ð7r/   N),r   r   Úfastapir   r   r   r   Úsqlalchemy.ormr	   Úapp.databaser
   Úapp.dependenciesr   Ú
app.modelsr   r   r   Úapp.schemasr   r   r   r   r   r   Úapp.securityr   r   Úapp.services.auth_servicer   r   Ú#app.services.password_reset_servicer   r   ÚrouterÚ_ADMIN_FORGOT_MSGr<   Úpostr.   r4   r>   rC   rH   re   rg   © r/   r-   Ú<module>ru      s­  ðß 'ç =Ó =Ý "å Ý 0ß 9Ñ 9ß s× sß 7ß Cß [á	˜'¨¨Ô	7€àeÐ ØXÐ ð ‡�ˆX e€Ó,Ù29¸&³/ñ 5�lð 5¨ò 5ó -ð5ð ‡�ˆY w€Ó/Ù"Ð#6Ó7ñ )�Dò )ó 0ð)ð
3Ð.Cð 3Èð 3ÐU\ó 3ð" ‡�Ð°€Ó8ÙKRÐSYË?ñ 9Ð&;ð 9Àò 9ó 9ð9ð ‡�ˆ[¨Ð:\€Ó]ÙJQÐRXË/ñ 9Ð%:ð 9Àò 9ó ^ð9ð ‡�Ð¨w€Ó7ÙCJÈ6Ã?ñ /Ð3ð /¸ò /ó 8ð/ð< ‡�ˆ]¨7€Ó3Ù;BÀ6»?ñ 8Ð+ð 8°ò 8ó 4ñ8r/   