
    h                         U d dl m Z mZ d dl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c mc 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mZ d dlmZ dZeed   df   ed<    G d d      Z y)    )datetime	timedeltaN)Literal)BackgroundTasksHTTPException)OAuth2PasswordRequestForm)Session)
JWTManagerJWTPayloadSchema)Messages)UserBaseTblUser)RESET_OTP_EXPIRE_MINUTESsend_otp_email)CustomResponse)studentadmin
superadmin.VALID_ROLESc                       e Zd ZdedefdZdej                  fdZe	de
defd       Zd Zd	 Zdej                  fd
Zdej                   defdZdej&                  fdZy)UserServicedbtokenc                      || _         || _        y )N)r   r   )selfr   r   s      //var/www/html/RetailAPI/app/api/user/service.py__init__zUserService.__init__   s    
    requestc                    K   t        j                  |      }t        j                  || j                         | j                  j                          t        dt        j                        S w)N1statusmessage)	r   model_validater   creater   commitr   r   
USER_CREAT)r   r   created_users      r   create_userzUserService.create_user   sI     ..w7|TWW-S(2E2EFFs   A+A-credentialsc                   K   d| j                   i}t        j                  ||      }|st        dt        j
                        | j                  |j                  k7  rt        dt        j                        |j                  j                         }|t        vrt        dd|       t        |j                  d|t        j                               }t        j                   |      }|d	|j"                  ||j                  d
S w)Nemail_id  status_codedetaili    zInvalid role: r   )user_id	user_type	user_roleexpbearer)access_token
token_typer-   roler3   )usernamer   get_by_user_filterr   r   USER_NOT_FOUNDpasswordINCORRECT_PASSWORDr:   stripr   r   r3   r   utcnowr
   create_access_tokenr-   )r+   r   user_filteruser_logr:   payloadr8   s          r   
user_loginzUserService.user_login   s     !;#7#78--k2>C8O8OPP8#4#44C8S8STT}}""${"C.8OPP"$$!	
 "55g>(" ))&&
 	
s   DDc                   K   | j                   j                  t        dt        j                        t        j                  | j                   j                  | j                        }|st        dt        j                        S |S w)Nr2   r/   -1r"   )
r   r3   r   r   USER_ID_MISSINGr   
get_usr_idr   r   r=   r   users     r   get_demo_userzUserService.get_demo_user5   sd     ::%C8P8PQQ!!$**"4"4dgg>!x7N7NOOs   BBc                   K   | j                   j                  t        dt        j                        | j
                  j                  t              j                  t        j                  | j                   j                  k(        j                         }|st        dt        j                        S | j
                  j                          t        dt        j                        S w)Nr2   r/   rH   r"   r!   )r   r3   r   r   rI   r   queryr   filterfirstr   r=   r'   USER_LOGOUTrK   s     r   logoutzUserService.logout=   s     ::%C8P8PQQww}}W%,,W__

@R@R-RSYY[!x7N7NOOS(2F2FGGs   C%C'c                   K   | j                   j                  }|st        dt        j                        S t
        j                  j                  |      }t        j                  || j                        }|st        dt        j                        S |j                  |j                  k7  rt        dt        j                        S |j                  |j                   k7  rt        dt        j"                        S |j                  |_        | j                  j%                          t        dt        j&                        S w)NrH   r"   r!   )r   r3   r   r   rI   schemasUserPassUpdater%   r   rJ   r   r=   current_passwordr>   CURRENT_PASSORD_INCORRECTnew_passwordconfirm_password%NEWPASSWORD_CONFIRMPASSWORD_NOT_MATCHr'   PASSWORD_UPDATED)r   r   r3   updated_userrL   s        r   update_passzUserService.update_passF   s     **$$!x7O7OPP--<<WE!!'4773!x7N7NOO((DMM9!x7Y7YZZ$$(E(EE!x7e7eff$11S(2K2KLLs   D>E background_tasksc                 t  K   | j                   j                  t              j                  t        j                  |j                  k(        j                         }|st        dt        j                        t        t        j                  dd            }||_        t        j                         t        t               z   |_        | j                   j%                  |       | j                   j'                          |j)                  t*        |j                  |       t-        dt        j.                        S w)z(Generates an OTP and sends it via email.r.   r/   i i?B )minutesr!   r"   )r   rO   r   rP   r-   rQ   r   r   r=   strrandomrandintotpr   rA   r   r   
otp_expiryaddr'   add_taskr   r   OTP_SEND)r   r   r_   rL   re   s        r   forgot_password_servicez#UserService.forgot_password_serviceW   s     ww}}W%,,W-=-=AQAQ-QRXXZCx7N7NOO&..01"//+i@X.YYD!!.'2B2BCHS(2C2CDDs   D6D8c                 |   | j                   j                  t              j                  t        j                  |j                  k(        j                         }|st        dt        j                        |j                  |j                  k7  s-|j                  !|j                  t        j                         k  rt        dt        j                        |j                  |_        d|_
        | j                   j!                  |       | j                   j#                          t%        dt        j&                        S )z'Verifies OTP and allows password reset.r.   r/   Nr2   r!   r"   )r   rO   r   rP   r-   rQ   r   r   r=   re   rf   r   rA   INVALID_OTPrY   r>   rg   r'   r   r\   )r   r   rL   s      r   reset_password_servicez"UserService.reset_password_serviced   s    ww}}W%,,W-=-=AQAQ-QRXXZC8O8OPPHH#t'>$//T\TcTcTeBeC8L8LMM,,DS(2K2KLLr   N)__name__
__module____qualname__r	   r   r   rU   
UserCreater*   staticmethodr   rF   rM   rS   rV   r^   ForgotPasswordRequestr   rj   VerifyOTPRequestrm    r   r   r   r      s    7 *: G);); G 
&? 
W 
 
2HM)?)? M"EW5R5R Efu EMg.F.F Mr   r   )!r   r   rc   typingr   fastapir   r   fastapi.securityr   sqlalchemy.ormr	   app.api.user.schemasapirL   rU   app.dependency.authanticationr
   r   app.locale.messagesr   app.models.main.userr   r   app.utils.emailr   r   app.utils.schemas_utilsr   r   tuple__annotations__r   ru   r   r   <module>r      sW    ( (   2 6 " & & F ( 2 D 2EgU7;<cAB gaM aMr   