
    hO                        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
 d dlm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mZmZ d d
lmZ d dlmZ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*  eddg      Z+e+jY                  d       e        ee      fdede
fd       Z-e+jY                  de       ee      fdede
fd       Z.e+jY                  de       ee      fdede
fd       Z/e+jY                  de       ee      fdede
fd       Z0e+jY                  de       ee      fdede
fd       Z1e+je                  d e       ee#      fd!efd"       Z3e+jY                  d#e       ee      fd$ede
fd%       Z4y&)'    )	timedelta)	APIRouterDependsHTTPExceptionstatus)OAuth2PasswordRequestForm)Session)get_db)ACCESS_TOKEN_EXPIRE_MINUTES
SECRET_KEY	ALGORITHM)jwtJWTError)User)TokenRefreshToken	OTPVerifyUserTokenResponse)AdminCreate)UserResponse
UserCreate)
authenticate_usercreate_access_tokenget_current_active_userget_password_hashcreate_usercreate_refresh_tokenupdate_refresh_tokenverify_registration_otpsend_login_otpverify_login_otpz/authAuthentication)prefixtagsz/login	form_datadbc                    K   t        || j                  | j                        }|st        t        j
                  dddi      t        ||       d{    ddiS 7 w)zAuthenticate user and send OTP.zIncorrect email or passwordzWWW-AuthenticateBearer)status_codedetailheadersNmessagezOTP sent to your email.)r   usernamepasswordr   r   HTTP_401_UNAUTHORIZEDr    )r%   r&   users      =/home/www/40-admission.kofcorporation.com/app/routers/auth.pyloginr2      si      R!3!3Y5G5GHD440'2
 	
 T
"""011 #s   AAA	Az/verify-login)response_modelotp_datac                 
  K   t        || j                  | j                        }t        t              }t        d|j                  i|      }t        d|j                  i      }t        ||j                  |       |d||dS w)zVerify OTP and return tokens.minutessubdataexpires_deltar:   beareraccess_token
token_typerefresh_tokenr0   )	r!   emailotpr   r   r   r   r   idr4   r&   r0   access_token_expiresr?   rA   s         r1   verify_loginrG   )   sy      B=D$-HI&TZZ 0DL )udjj.ABMTWWm4(S`jnoos   BBz/refreshrefresh_token_datac                 Z  K   | j                   }	 t        j                  |t        t        g      }|j                  d      }|t        dd      	 |j                  t              j                  t        j                  |k(        j                         }|r|j                   |k7  rt        dd      t        t              }t        d|j                  i|      }t!        d|j                  i      }t#        ||j$                  |       |d	|d
S # t        $ r t        dd      w xY ww)zRefresh access token)
algorithmsr8   i  zInvalid refresh tokenr)   r*   r6   r9   r<   r=   )r?   r@   rA   )rA   r   decoder   r   getr   r   queryr   filterrB   firstr   r   r   r   r   rD   )	rH   r&   rA   payloadrB   r0   rF   r?   new_refresh_tokens	            r1   refreshrS   7   s     '44MM**]JI;O[['=C8OPP 
 88D>  u!45;;=D4%%64KLL$-HI&TZZ 0DL
 -5$**2EFTWW&78(Sdee!  M4KLLMs   D+AD C D+D((D+z	/registerr0   c                 8   K   t        ||        d{   S 7 w)zRegister a new user.)r&   r0   N)r   )r0   r&   s     r1   register_userrU   R   s      ....s   z/verify-otpc                    t        || j                  | j                        }t        t              }t        d|j                  i|      }t        d|j                  i      }t        ||j                  |       |d||dS )z-Verify OTP, activate user, and return tokens.r6   r8   r9   r<   r=   r>   )	r   rB   rC   r   r   r   r   r   rD   rE   s         r1   verify_otp_endpointrW   W   su     #2x~~x||DD$-HI&TZZ 0DL )udjj.ABMTWWm4(S`jnoo    z/mecurrent_userc                    K   | S w)zGet current user info )rY   s    r1   read_users_mer\   e   s      s   z/first-adminadminc           	         |j                  t              j                  t        j                  dk(        j	                         }|dkD  rt        dd      |j                  t              j                  t        j                  | j                  k(        j                         }|rt        dd      t        | j                        }t        | j                  || j                  | j                  | j                  | j                  | j                        }|j                  |       |j                          |j!                  |       |S )	zeCreate the first admin account. This endpoint is only available if there are no other admin accounts.r]   r   i  z An admin account already exists.rK   i  zEmail already registered)rB   hashed_password	full_nameroleavataraddressphone)rN   r   rO   ra   countr   rB   rP   r   r.   r`   rb   rc   rd   addcommitrS   )r]   r&   admin_countdb_userr_   s        r1   create_first_adminrj   j   s     ((4.''		W(<=CCEKQ5
 	

 hhtn##DJJ%++$=>DDFG-
 	

 (7Okk'//ZZ||kkG FF7OIIKJJwNrX   N)5datetimer   fastapir   r   r   r   fastapi.securityr   sqlalchemy.ormr	   app.core.databaser
   app.core.configr   r   r   joser   r   
app.modelsr   app.schemas.authr   r   r   r   app.schemas.universityr   app.schemas.userr   r   app.services.authr   r   r   r   r   r   r   r   r    r!   routerpostr2   rG   rS   rU   rW   rM   r\   rj   r[   rX   r1   <module>ry      s    = = 6 " $ N N   N N . 5   
')9(:	;X7>yPWX^P_ 24 2g 2 2 _->?:A&/ p p p @p Z.BI&/ fl f f /f4 [68? /j /g / 7/ ]+<=;B6? p) p p >p E,/-45L-M d  0 ^L9 &/!!! :!rX   