
    h]                     P   d dl mZm Z mZ d dlmZ d dl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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 d dl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(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3  eddg      Z4e4jk                  de0      de	de$fd       Z6e4jk                  de
jn                  e0      de$defd       Z8e4jk                  d e
jr                  e1      dede$fd!       Z:e4jk                  d"e
jr                  e1      dede$fd#       Z;e4jk                  d$e
jr                  e0      dede$fd%       Z<e4jk                  d&e
jr                  e1      dede$fd'       Z=e4j}                  d(e?      d)ede$fd*       Z@y)+    )	timedeltadatetimetimezone)	AnnotatedN)	APIRouterHTTPExceptionRequest)statusDepends)OAuth2PasswordRequestForm)	BaseModelEmailStr)OTPRepository)UserRepository)
UserCreateUserReadRecoverPasswordRequestVerifyOTPRequestUpdatePasswordRequest)send_signup_otp_emailsend_forgot_password_otp_email)user_dependency)OTPType
UserStatus)db_dependency)bcrypt_context)UnauthorizedExceptionInvalidExceptionNotFoundExceptionAuthorizationError)Message)ResponseLoginResponseModelObjectResponseModel)Usersz	/api/authAuthentication)prefixtagsz/login)response_modelrequestdbc                 :  K   	 | j                          d {   }|j                  d      }|j                  d      }|r|s:| j                          d {   }|j                  d      }|j                  d      }|r|st	        d      t        |      }|j                  ||       d {   }|st        |j                  t        j                  k(  s|j                  t        j                  k(  rt	        d      |j                  stt        |      }|j                  |j                  t        j                          d {   }	t#        |j                  |	j$                  |j&                         t)        d      |j+                  |j&                  |j,                  |j                  t/        d            }
t1        j2                  |r*|j                  |j&                  |j4                  d	|

      S d |

      S 7 # t        $ r d }d }Y w xY w7 7 k7 ׭w)NusernamepasswordzUsername and password requiredzUser is inactive or deletedto_emailotpnamezWAn Otp has been sent to your email for verification. Please verify your email to login.   daysemailr2   step)useraccess_token)formget	Exceptionjsonr   r   authenticater
   r   INACTIVEDELETEDis_email_verifiedr   
create_otpr7   r   SIGNUPr   r1   r2   r    create_access_tokenidr   r"   
login_userr8   )r*   r+   r;   r-   r.   data	user_repor9   otp_repootp_logtokens              A/var/www/html/phonemate/phone_mate_backend/app/api/auth_router.pylogin_for_access_tokenrN   %   s    \\^#88J'88J'
 8\\^#88J'88J'8#$DEEr"I''(;;D##{{j)))T[[J<N<N-N#$ABB!! $ ++DJJGGtzzw{{S e
 	
 ))		477DJJ	q(9E   jj$))TYYG    G $   $ < Hsj   HG? G<&G? HHAH+H,BHHB:H<G? ?HHHHHHz	/register)status_coder)   create_user_requestc           
      h  K   t        |       }t        |j                  |j                  t	        j
                  |j                        dt        j                  t        j                        t        j                  t        j                        d       }|j                  |       d {   }t        |       }|j                  |j                  t        j                         d {   }t!        |j                  |j"                  |j                         |j%                  |j                  |j&                  |j                  t)        d            }t+        j,                  t.        j0                  j2                  |r*|j                  |j                  |j4                  d|      S d |      S 7 7 ˭w)Nr3   )r2   r7   r.   r
   
created_at
updated_at
deleted_atr/   r4   r6   messager9   r:   )r   r   r2   r7   r   hashr.   r   nowr   utccreater   rC   r   rD   r   r1   rE   rF   r   r"   rG   r!   SuccessUSER_REGISTERr8   )r+   rP   rI   	user_datar9   rJ   rK   rL   s           rM   create_userr^   V   sJ     r"I %%!''$$%8%A%AB<<-<<-I !!),,DR H''

GNNCCG4::7;;Y^^T))		477DJJ	q(9E -- 	 				     -Cs%   B%F2'F-(<F2$F0%C	F20F2z/recover-passwordc                    K   |j                  t              j                  t        j                  | j                  k(        j	                         }|s.t        j                  t        j                  j                        S t        |      }|j                  | j                  t        j                         d {   }t        | j                  |j                         t        j                  t        j                  j                         S 7 Sw)NrV   )r0   r1   )queryr%   filterr7   firstr"   postr!   r[   WRONG_EMAILr   rC   r   PASSWORD_RESETr   r1   FORGOT_PASSWORD)r*   r+   r9   rJ   rK   s        rM   recover_passwordrh   |   s      88E?!!%++">?EEGD}}OO//
 	
 R H''w7M7MNNG"GMMw{{K==!@!@AA Os   B6D8D9ADz/verify-password-otpc                   K   t        |      }|j                  | j                  t        j                         d {   }|r@|j
                  | j
                  k7  s'|j                  |j                  |j                        rt        d      t        j                  t        j                  j                        S 7 w)Notp_typeOtpr`   )r   get_latest_otpr7   r   rf   r1   used_atis_otp_expired
expired_atr   r"   rd   r!   r[   OTP_IS_VERIFIED)r*   r+   rJ   rK   s       rM   verify_password_otprr      s      R H++ 6 6 ,  G
 ;;'++%??&""7#5#56u%%==!@!@AAs   :B>B<B B>z/verify-signup-otpc                   K   t        |      }|j                  | j                  t        j                         d {   }|r@|j
                  | j
                  k7  s'|j                  |j                  |j                        rt        d      |j                  |       d {    t        |      }|j                  | j                         d {   }|j                  |j                  |j                  |j                  t!        d            }t#        j$                  t&        j(                  j*                  |r5|j                  |j                  |j,                  |j.                  d|      S d |      S 7 <7 7 w)Nrj   rl   r3   r4   )r7   r2   r8   rB   rU   )r   rm   r7   r   rD   r1   rn   ro   rp   r   mark_otp_usedr   verify_emailrE   r2   rF   r   r"   rG   r!   r[   rq   r8   rB   )r*   r+   rJ   rK   rI   r9   rL   s          rM   verify_signup_otprv      sB     R H++GMMGNN+SSG;;'++%??&""7#5#56u%%

 
 
)))r"I''66D))		477DJJ	q(9E //  				%)%;%;	    ! T * 7s5   :E?E8A%E?"E;#-E?E=B(E?;E?=E?z/update-passwordc                   K   t        |      }|j                  | j                  t        j                         d {   }t        j                  t        j                        }|r'|j                  |j                  |j                        rt        d      t        |      }|j                  | j                         d {   }|st        d      t!        j"                  | j$                        |_        |j)                  |j*                  |       d {    |j-                  |       d {    t/        j0                  t2        j4                  j6                  dz        S 7 )7 7 S7 <w)Nrj   rl   UserPasswordr`   )r   rm   r7   r   rf   r   rX   r   rY   rn   ro   rp   r   r   get_by_emailr   r   rW   new_passwordr.   updaterF   rt   r"   rd   r!   r[   OBJECT_UPDATED)r*   r+   rJ   rK   rX   rI   r9   s          rM   update_passwordr~      s%     R H++ 6 6 ,  G ,,x||
$C ??&""7#5#56u%%r"I''66D''"''(<(<=DM


477D
)))

 
 
)))==!?!?*!LMM/ 7
 *)sG   :E.E%BE.E(AE.E*E./E,06E.(E.*E.,E.z/mecurrent_userc                    K   t        |      }|j                  | j                  d      d       d {   }|r/|j                  |j                  |j
                  |j                  dS d S 7 7w)Nr7   F)convert_to_entity)r2   r7   r8   rB   )r   rz   r<   r2   r7   r8   rB   )r   r+   rI   r9   s       rM   get_current_user_infor      sx     r"I''!U (  D  IIZZII!%!7!7		
	 	s   1A-A+8A-)Ar   r   r   typingr   phonenumbersfastapir   r   r	   r
   r   fastapi.securityr   pydanticr   r   repositories.otp_repositoryr   repositories.user_repositoryr   schemas.authr   r   r   r   r   services.email_servicer   r   utils.auth_dependencyr   utils.constantsr   r   utils.databaser   utils.encryptionr   utils.exceptionsr   r   r   r    utils.messagesr!   utils.responser"   r#   r$   modelsr%   routerrd   rN   HTTP_201_CREATEDr^   HTTP_200_OKrh   rr   rv   r~   r<   dictr        rM   <module>r      s   2 2   5 5 # 6 ( 5 7  Y 1 / ( +  # L L 	+-=,>	? X&89-' -} - :-` V44EW  - j F ""&  
B$: B B
B ""&  
B'7 B] B
B  ""%  
%5 = 
D ""&  
N#8 Nm N
N8 E$'o =  (r   