
    9gEi8                     :   d Z ddlmZ ddlmZmZmZmZ ddl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mZmZmZmZmZmZmZ dd
lmZmZm Z m!Z! ddl"m#Z#  e       Z$e$jK                  de       ee      fdede	fd       Z&e$jK                  de       ee      fdede	fd       Z'e$jK                  de       ee      fdede	fd       Z(e$jK                  de       ee      fdede	fd       Z)e$jK                  d       ee      fdede	fd       Z*e$jK                  d       ee      fdede	fd       Z+e$jK                  d       ee      fdede	fd       Z,e$j[                  d       ee       ee      fdee.e.f   dede	fd        Z/y!)"z4
Endpoints d'authentification pour les utilisateurs
    )Dict)	APIRouterDependsHTTPExceptionstatus)Session)datetime	timedelta)get_db)User)OTP)
PhoneLoginRequestPhoneLoginResponseOTPVerifyRequestOTPVerifyResponseUserRegisterRequestUserLoginRequestAuthResponseResendOTPRequestPasswordResetRequestPasswordResetConfirm)create_access_tokenget_current_userget_password_hashverify_password)sms_servicez/check-phone)response_modelrequestdbc                   K   |j                  t              j                  t        j                  | j                  k(        j	                         }|rt        d| j                  dd      S t        j                  d      }|j                  t              j                  t        j                  | j                  k(  t        j                  dk(        j                          t        | j                  |dt        j                  d	      
      }|j                  |       |j                          	 t        j                  | j                  |       d{    t        d| j                  d| d      S 7  # t        $ rM}|j                  |       |j                          t!        t"        j$                  dt'        |             d}~ww xY ww)u~   
    Vérifie si un numéro de téléphone existe déjà
    Si le numéro n'existe pas, envoie un OTP pour l'inscription
    Tu4   Numéro trouvé. Veuillez entrer votre mot de passe.F)user_existsphonemessageotp_sent   lengthregistration
   minutesr"   codepurpose
expires_atNu;   Un code de vérification a été envoyé à votre numéro. Impossible d'envoyer le SMS: status_codedetail)queryr   filterr"   firstr   r   generate_otpr   r.   deletecreate_expiry_timeaddcommitsend_otp	Exceptionr   r   HTTP_500_INTERNAL_SERVER_ERRORstr)r   r   userotp_codenew_otpes         A/home/www/lebenam.kofcorporation.com/app/api/v1/endpoints/auth.pycheck_phone_numberrE      sw     88D>  w}}!<=CCED!--J	
 	
 ++15 	II&KK>)	
 &( --"--b9	
 	w
			&&w}}h???%!mmUV^U_`	  @  	IIgIIK"AA6s1vh? 		s=   D,G/#E5 E3E5 2G3E5 5	G>AGGGz/verify-otpc                   K   |j                  t              j                  t        j                  | j                  k(  t        j                  dk(  t        j
                  dk(        j                  t        j                  j                               j                         }|st        t        j                  d      |j                  rt        t        j                  d      |j                  dk\  rt        t        j                  d      |xj                  dz  c_        |j                   | j"                  k7  r>|j%                          d|j                  z
  }t        t        j                  d	| d
      d|_        t'        j(                         |_        |j%                          t-        dd| j                        S w)u.   
    Vérifie un code OTP envoyé par SMS
    r(   Fu&   Aucun code OTP trouvé pour ce numéror1   u9   Le code OTP a expiré. Veuillez demander un nouveau code.   z6Trop de tentatives. Veuillez demander un nouveau code.   zCode incorrect. Il vous reste z tentative(s).TuK   Numéro vérifié avec succès. Vous pouvez maintenant créer votre compte.)verifiedr#   r"   )r4   r   r5   r"   r.   is_verifiedorder_by
created_atdescr6   r   r   HTTP_404_NOT_FOUND
is_expiredHTTP_400_BAD_REQUESTattemptsr-   rA   r;   r	   utcnowverified_atr   )r   r   otpremaining_attemptss       rD   verify_otp_coderV   W   sk     ((3-

		W]]"~%5  hs~~""$%eeg	  11;
 	
 ~~33N
 	
 ||q33K
 	
 LLAL xx7###
		-3334F3G~V
 	
 COoo'COIIK]mm s   F?Gz	/registerc           
        K   |j                  t              j                  t        j                  | j                  k(        j	                         }|rt        t        j                  d      |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(  t        j                  dk(  t        j                  dk(        j                  t        j                  j                               j	                         }|st        t        j                  d      t!        j"                         |j$                  t'        d      z   kD  rt        t        j                  d      | j(                  rj|j                  t              j                  t        j(                  | j(                  k(        j	                         }|rt        t        j                  d	      t        | j                  | j*                  | j,                  | j(                  t/        | j0                        dd
      }|j3                  |       |j5                          |j7                  |       	 t9        j:                  | j                  | j*                         d{    |j=                  |       |j5                          t?        tA        |jB                        dd      }tE        ||jB                  |j                  |j(                  |j*                  |j,                  |jF                  d      S 7 #  Y xY ww)u>   
    Crée un compte utilisateur après vérification OTP
    u!   Ce numéro est déjà enregistrér1   r(   TuA   Code OTP non vérifié. Veuillez d'abord vérifier votre numéro.   r*   u1   La vérification a expiré. Veuillez recommencer.u   Cet email est déjà utilisé)r"   
first_name	last_nameemailpasswordphone_verified	is_activeNr@   subtypedataidr"   r[   rY   rZ   r]   access_tokenr@   )$r4   r   r5   r"   r6   r   r   rP   r   r-   rA   r.   rJ   rK   rL   rM   r	   rR   rS   r
   r[   rY   rZ   r   r\   r:   r;   refreshr   send_welcome_smsr8   r   r?   re   r   r]   )r   r   existing_userrT   existing_emailnew_userrg   s          rD   register_userrm      s     HHTN))$***EFLLNM336
 	
 ((3-

		W]]"G$$$~%4	
 hs~~""$%eeg  33V
 	
 3??Yr-BBB33F
 	
 }}$..tzzW]]/JKQQS"776  mm%%##mm"7#3#34H FF8IIKJJx**7==':L:LMMM
 IIcNIIK '%v6L !++^^^^"--!++&55

 
 	Ns1   I>M-M .M/M 3BMM M
Mz/loginc           
        K   |j                  t              j                  t        j                  | j                  k(        j	                         }|st        t        j                  d      t        | j                  |j                        st        t        j                  d      |j                  st        t        j                  d      t        t        |j                        dd      }t!        ||j                  |j                  |j"                  |j$                  |j&                  |j(                  d	      S w)
u?   
    Connexion avec numéro de téléphone et mot de passe
    u   Numéro non enregistrér1   zMot de passe incorrectu   Compte désactivér@   r_   rb   rd   rf   )r4   r   r5   r"   r6   r   r   rN   r   r\   HTTP_401_UNAUTHORIZEDr^   HTTP_403_FORBIDDENr   r?   re   r   r[   rY   rZ   r]   )r   r   r@   rg   s       rD   
login_userrq      s     88D>  w}}!<=CCED11,
 	
 7++T]];44+
 	
 >>11'
 	
 '\62L !''ZZZZ//"11

 
s   D?Ez/resend-otpc           	        K   |j                  t              j                  t        j                  | j                  k(  t        j                  dk(  t        j
                  t        j                         t        d      z
  kD        j                         }|rt        t        j                  d      t        j                  d      }|j                  t              j                  t        j                  | j                  k(  t        j                  dk(        j                          t        | j                  |dt        j                   d      	      }|j#                  |       |j%                          	 t        j&                  | j                  |       d
{    ddiS 7 # t(        $ rM}|j                  |       |j%                          t        t        j*                  dt-        |             d
}~ww xY ww)z%
    Renvoie un nouveau code OTP
    r(   rH   r*   z<Veuillez attendre 1 minute avant de demander un nouveau coder1   r%   r&   r)   r,   Nr#   u!   Nouveau code envoyé avec succèsr0   )r4   r   r5   r"   r.   rL   r	   rR   r
   r6   r   r   HTTP_429_TOO_MANY_REQUESTSr   r7   r8   r9   r:   r;   r<   r=   r>   r?   )r   r   
recent_otprA   rB   rC   s         rD   resend_otp_coderu     s     #%%		W]]"~%*Yq-AAA eg	  99Q
 	
 ''q1H HHSM		W]]"~% fh mm))"5	G FF7OIIK	
""7==(;;;>?? 	< 

		'
		==23q6(;
 	

s=   E1G;4#F" F F" G; F" "	G8+AG33G88G;z/forgot-passwordc                   K   |j                  t              j                  t        j                  | j                  k(        j	                         }|st        t        j                  d      t        j                  d      }|j                  t              j                  t        j                  | j                  k(  t        j                  dk(        j                          t        | j                  |dt        j                  d            }|j                  |       |j                          	 d	| d
}t        j                   | j                  |       d{    ddiS 7 # t"        $ rM}|j                  |       |j                          t        t        j$                  dt'        |             d}~ww xY ww)uF   
    Demande de réinitialisation de mot de passe - envoie un OTP
    u#   Aucun compte associé à ce numéror1   r%   r&   password_resetr)   r*   r,   z(Votre code de reinitialisation Lebenam: z. Valide 10 minutes.Nr#   u!   Code de réinitialisation envoyér0   )r4   r   r5   r"   r6   r   r   rN   r   r7   r   r.   r8   r9   r:   r;   send_smsr=   r>   r?   )r   r   r@   rA   rB   r#   rC   s          rD   forgot_passwordry   U  sf     88D>  w}}!<=CCED118
 	
 ''q1H HHSM		W]]"'' fh mm ))"5	G FF7OIIK

<XJFZ[""7==':::>?? 	; 

		'
		==23q6(;
 	

s=   D.F>1)E% E#E% "F>#E% %	F;.AF66F;;F>z/reset-passwordc                   K   |j                  t              j                  t        j                  | j                  k(  t        j                  | j
                  k(  t        j                  dk(  t        j                  dk(        j                  t        j                  j                               j                         }|st        t        j                  d      |j                  rt        t        j                  d      |j                   dk\  rt        t        j                  d      |xj                   dz  c_        |j#                          |j                  t$              j                  t$        j                  | j                  k(        j                         }|st        t        j&                  d	      t)        | j*                        |_        d
|_        t/        j0                         |_        |j#                          ddiS w)uE   
    Réinitialise le mot de passe après vérification de l'OTP
    rw   FzCode OTP invalider1   u   Le code a expirérG   zTrop de tentativesrH   u   Utilisateur non trouvéTr#   u(   Mot de passe réinitialisé avec succès)r4   r   r5   r"   r-   rA   r.   rJ   rK   rL   rM   r6   r   r   rP   rO   rQ   r;   r   rN   r   new_passwordr\   r	   rR   rS   )r   r   rT   r@   s       rD   reset_passwordr|     s     ((3-

		W]]"G$$$''5 	
 hs~~""$%eeg  33&
 	

 ~~33&
 	

 ||q33'
 	

 LLALIIK 88D>  w}}!<=CCED11,
 	
 &g&:&:;DM COoo'COIIKABBs   HHz/set-fcm-token
token_datacurrent_userc                    K   d| vrt        t        j                  d      | d   |_        |j	                          dddS w)zA
    Enregistrement du token FCM pour les notifications push
    device_tokenz Le champ device_token est requisr1   Tu"   Token FCM enregistré avec succès)r   r#   )r   r   HTTP_422_UNPROCESSABLE_ENTITYr   r;   )r}   r~   r   s      rD   set_fcm_tokenr     sS      Z'<<5
 	

 !+> :LIIK 7 s   ?AN)0__doc__typingr   fastapir   r   r   r   sqlalchemy.ormr   r	   r
   app.db.sessionr   app.models.userr   app.models.otpr   app.schemas.authr   r   r   r   r   r   r   r   r   r   app.core.securityr   r   r   r   app.services.sms_servicer   routerpostrE   rV   rm   rq   ru   ry   r|   putr?   r        rD   <module>r      s6    = = " ( !      h g 0	 ^,>? &/999 @9z ]+<= &/777 >7v [6 &/U UU 7Ur Xl3 &/--- 4-b ] &/1
1
1
 1
j   &/-
!-
-
 !-
^  &/5C!5C5C  5Cp  !!12&/S#X 	 r   