o
    [g                     @   s   d dl mZmZ d dlm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 d dlmZ d d	lmZ d d
lmZ d dlmZ edZG dd dZdS )    )HTTPExceptionstatus)Session)	timedeltaN)ZoneInfo)verify_refresh_tokencreate_access_tokengenerate_verification_code)now)settings)PasswordReset)UserService)send_verification_email	adimsayarc                   @   s|   e Zd ZededefddZedededefddZededed	edefd
dZ	ededed	ededef
ddZ
dS )AuthServicerefresh_tokenreturnc                 C   s<   t | }|d u rtd ttjddt|d}|ddS )NzInvalid refresh tokenstatus_codedetail)subjectbearer)access_token
token_type)r   loggerwarningr   r   HTTP_401_UNAUTHORIZEDr   )r   r   Znew_access_token r   !/app/app/services/auth_service.pyr      s   


zAuthService.refresh_tokendbemailc                 C   sd   t | |}|sttjddt }t|j|d}| | | 	  t
||s.ttjddddiS )Nz"User with provided email not foundr   )user_id
reset_codez!Failed to send verification emailmessagez/Reset code has been sent to your email address.)r   get_user_by_emailr   r   HTTP_404_NOT_FOUNDr	   r   idaddcommitr   HTTP_500_INTERNAL_SERVER_ERROR)r   r    userr"   reset_recordr   r   r   forgot_password   s    

zAuthService.forgot_passwordr"   c                 C   s   t | |}|sttjdd| ttj|j	ktj
|ktj  }|s0ttjdd|j}|jd u rA|jttjd}|tdd7 }t }||kr]d|_|   ttjdd|jd	krittjd
dd|_|   ddiS )NUser not foundr   Invalid reset codetzinfo
   minutesr   zReset code expired   z Reset code has already been usedr#   z Reset code verified successfully)r   r$   r   r   r%   queryr   filterr!   r&   r"   order_by
created_atdescfirstHTTP_400_BAD_REQUESTr0   replacer   r   TIMEZONEr   r
   is_validr(   )r   r    r"   r*   r+   expiry_timecurrent_timer   r   r   verify_reset_code2   sN   
	

zAuthService.verify_reset_codenew_passwordc           	      C   s   t | |}|sttjdd| ttj|j	ktj
|ktj  }|s0ttjdd|jdkr<ttjddtdd}t }|jjd u rU|jjttjd}n|j}|| |krettjd	dt | || d
diS )Nr-   r   r.   r   z Reset code has not been verifiedr1   r2   r/   z@Password reset request expired. Please request a new reset code.r#   zPassword updated successfully.)r   r$   r   r   r%   r5   r   r6   r!   r&   r"   r7   r8   r9   r:   r;   r>   r   r
   r0   r<   r   r   r=   reset_password)	r   r    r"   rB   r*   r+   Zallowed_windowr@   Zrecord_timer   r   r   change_passwordd   sH   
	

zAuthService.change_passwordN)__name__
__module____qualname__staticmethodstrdictr   r   r,   rA   rD   r   r   r   r   r      s    1$r   )fastapir   r   sqlalchemy.ormr   datetimer   loggingzoneinfor   app.core.securityr   r   r	   app.core.timer
   app.core.configr   app.models.password_resetr   app.services.user_servicer   app.services.email_servicer   	getLoggerr   r   r   r   r   r   <module>   s    
