Ë
    jqjd  ã                   óò  — 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 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 e jC                  de¬«       ee
«      fdedefd„«       Z"e jC                  de¬«       ee«      fdefd„«       Z#e jC                  de¬«       ee
«      fdedefd„«       Z$e jC                  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)Úhash_passwordÚverify_password)ÚauthenticateÚissue_token_for)Úcreate_password_reset_flowÚsend_otp_emailz/authz
admin-auth)ÚprefixÚtagsz/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      ú5/var/www/html/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   )r/   s    r,   Úadmin_logoutr3      s   € ô ˜<Ô(Ð(r.   z/forgot-passwordc              ƒ   óX  K  — |j                  t        «      j                  t        j                  | j                  k(  t        j                  t
        j                  k(  «      j                  «       }|r*t        ||«      }t        |j                  |«      ƒ d {  –—†  t        d¬«      S 7 Œ­w)Nz@If an admin account exists for this email, an OTP has been sent.r1   )Úqueryr   Úfilterr$   r&   r   r'   Úfirstr   r   r   )r   r   r+   Úotps       r,   Úadmin_forgot_passwordr9   !   sw   è ø€ à�8‰8”D‹>× Ñ ¤§¡¨t¯z©zÑ!9¼4¿9¹9ÌÏÉÑ;VÓW×]Ñ]Ó_€DÙÜ(¨¨TÓ2ˆÜ˜TŸZ™Z¨Ó-×-Ð-ÜÐ]Ô^Ð^ð 	.ús   ‚BB*ÂB(ÂB*z/reset-passwordc                 óÌ  — |j                  t        «      j                  t        j                  | j                  k(  t        j                  t
        j                  k(  «      j                  «       }|st        t        j                  d¬«      ‚|j                  t        «      j                  t        j                  |j                  k(  t        j                  j                  d«      «      j!                  t        j"                  j%                  «       «      j                  «       }|r t'        | j(                  |j*                  «      st        t        j                  d¬«      ‚|j,                  t/        j0                  t2        j4                  «      k  rt        t        j                  d¬«      ‚t7        | j8                  «      |_        d|_        |j=                  «        t?        d¬«      S )	NzInvalid requestr    FzInvalid or expired OTPzOTP expiredTzPassword updatedr1   ) r5   r   r6   r$   r&   r   r'   r7   r   r   ÚHTTP_400_BAD_REQUESTr   Úuser_idÚidÚusedÚis_Úorder_byÚ
created_atÚdescr   r8   Úotp_hashÚ
expires_atr   Únowr   Úutcr   Únew_passwordÚhashed_passwordÚcommitr   )r   r   r+   Ú	token_rows       r,   Úadmin_reset_passwordrK   *   sF  € à�8‰8”D‹>× Ñ ¤§¡¨t¯z©zÑ!9¼4¿9¹9ÌÏÉÑ;VÓW×]Ñ]Ó_€DÙÜ¬×(CÑ(CÐL]Ô^Ð^ð 	�‰Ô#Ó$ß	‰Ü×&Ñ&¨$¯'©'Ñ1Ü×#Ñ#×'Ñ'¨Ó.ó

÷ 
‰Ô$×/Ñ/×4Ñ4Ó6Ó	7ß	‰‹ð ñ œO¨D¯H©H°i×6HÑ6HÔIÜ¬×(CÑ(CÐLdÔeÐeà×ÑœhŸl™l¬8¯<©<Ó8Ò8Ü¬×(CÑ(CÈMÔZÐZä(¨×):Ñ):Ó;€DÔØ€I„NØ‡I�I„KÜÐ-Ô.Ð.r.   N)&r   r   Úfastapir   r   r   r   Úsqlalchemy.ormr	   Úapp.databaser
   Úapp.dependenciesr   Ú
app.modelsr   r   r   Úapp.schemasr   r   r   r   r   Úapp.securityr   r   Úapp.services.auth_servicer   r   Úapp.services.email_otpr   r   ÚrouterÚpostr-   r3   r9   rK   © r.   r,   Ú<module>rX      s  ðß 'ç =Ó =Ý "å Ý 0ß 9Ñ 9ß aÕ aß 7ß Cß Má	˜'¨¨Ô	7€ð ‡�ˆX e€Ó,Ù29¸&³/ñ 5�lð 5¨ò 5ó -ð5ð ‡�ˆY w€Ó/Ù"Ð#6Ó7ñ )�Dò )ó 0ð)ð
 ‡�Ð°€Ó8ÙKRÐSYË?ñ _Ð&;ð _Àò _ó 9ð_ð ‡�Ð¨w€Ó7ÙCJÈ6Ã?ñ /Ð3ð /¸ò /ó 8ñ/r.   