
    /il              
          d dl mZmZmZmZ d dlmZ d dlZd dlZ	d dl
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mZmZ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" 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/ d dl0m1Z1 d dl2m3Z3  e3         e       Z4e4jk                  de"       ee      fdedefd       Z6e4jk                  de       ee      fdededefd       Z7e4jq                  d      d ee      fde9dz  dedefd       Z:e4jk                  de       ee      fdededefd       Z;e4jk                  de       ee      fdededefd       Z<e4jq                  d e"       ee      fde"fd!       Z=e4jk                  d"e       ee      fdededefd#       Z>e4jk                  d$e       ee      fd%e9dededefd&       Z?y)'    )	APIRouterDependsHTTPExceptionstatus)RedirectResponseN)	timedelta)AsyncSession)get_current_user)get_db)ForgotPasswordRequestForgotPasswordResponseLoginRequestLoginResponseLogoutRequestMessageResponseRefreshRequestRefreshResponseResetPasswordRequestResetPasswordResponseSignupRequestSignupResponse	TokenPair)UserOut)auth_service)settings)create_tokenhash_passwordhash_refresh_tokenutcnow)User)RefreshToken)select)load_dotenvz/signup)response_modelpayloaddbc                    K   t        j                  || j                  | j                  | j                         d {   }t        j                  |      S 7 w)N)emailpasswordconfirm_password)r   signupr(   r)   r*   r   model_validate)r%   r&   users      9/var/www/html/marco-python-backend/app/api/routes/auth.pyr+   r+   &   sO     $$
mm!! 11	 D !!$''s   ;AAAz/loginreturnc                    K   t        j                  || j                  | j                         d {   \  }}t	        t        ||            S 7 w)N)r(   r)   access_tokenrefresh_tokentokens)r   loginr(   r)   r   r   r%   r&   r2   r3   s       r.   r6   r6   0   sF     (4(:(:2W]]]d]m]m(n"nL-	|S` abb #os   0AAAz	/callbackcodec           
        K   | st        t        j                  d      t        j                  r t        j
                  rt        j                  st        t        j                  d      t        j                  rt        j                  st        t        j                  d      t        j                  }t        j                  }t        j                         4 d {   }|j                  || t        j                  t        j
                  t        j                  ddddid	
       d {   }|j                  dk7  rt        t        j                  d      |j                         }|j                  d      }|st        t        j                  d      |j                  |d|id	       d {   }|j                  dk7  rt        t        j                  d      |j                         }	d d d       d {    	j                  d      }
|
st        t        j                  d      |j!                  t#        t$              j'                  t$        j(                  |
k(               d {   }|j+                         }|smt-        j.                  d      }t%        |
t1        |            }|j3                  |       |j5                          d {    |j7                  |       d {    t9        t        j:                        }t9        t        j<                        }t?        tA        |jB                        |j(                  d|      }t?        tA        |jB                        |j(                  d|      }tE        |jB                  tG        |      tI               |z   d      }|j3                  |       |j5                          d {    t        jJ                  xs djM                  d      }tN        jP                  jS                  ||d      }| d| }tU        |       S 7 Q7 7 7 ;# 1 d {  7  sw Y   LxY w7 7 }7 g7 w)!NzMissing codestatus_codedetailzGoogle OAuth not configuredz"OAuth provider URIs not configuredauthorization_code)r8   	client_idclient_secretredirect_uri
grant_typeAcceptzapplication/jsong      $@)dataheaderstimeout   zFailed to exchange coder2   zNo access token from provider)paramsrE   zFailed to fetch user infor(   zProvider did not return email    )r(   password_hash)minutes)daysaccess)subr(   
token_typeexpires_deltarefreshF)user_id
token_hash
expires_atrevoked /r1   z/dashboard?)url)+r   r   HTTP_400_BAD_REQUESTr   GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETGOOGLE_REDIRECT_URIHTTP_500_INTERNAL_SERVER_ERROROAUTH_TOKEN_URIOAUTH_USER_INFO_URIhttpxAsyncClientpostr;   jsongetexecuter"   r    wherer(   scalar_one_or_nonesecretstoken_urlsafer   addcommitrP   r   ACCESS_TOKEN_EXPIRE_MINUTESREFRESH_TOKEN_EXPIRE_DAYSr   stridr!   r   r   FRONTEND_URLrstripurllibparse	urlencoder   )r8   r&   	token_urluserinfo_urlclientresp
token_datar2   ui_resp	user_infor(   resultr-   	random_pwaccess_expiresrefresh_expires
access_jwtrefresh_jwtrtfrontendqsredirect_urls                         r.   google_callbackr   7   sr    (C(CN[[$$H,I,IQYQmQm(M(MVstt##8+G+G(M(MVz{{((I//L  " # #f[[%66!)!>!> ( < <2 12 ! 
 
 s"F,G,GPijjYY[
!~~n5F,G,GPopp

<8V`d
ee#%F,G,GPkllLLN	3# #6 MM'"E(C(CLkll ::fTl00u1DEFFF$$&D))"-	%}Y/GH
tiikjj x'K'KLNX%G%GHO#dgg,djjXestJ3tww<tzzigvwK	%k28o-	
B FF2J
))+%%+33C8H			k Z	[BZ{2$/L--#
* f-# # # #@ G 	  s   CQP/Q"AP;-P2.BP;3P54>P;2Q=P8>A3Q1Q2A%QQQ0Q1C!QQAQ2P;5P;8Q;QQQ		QQQQz/refreshc                    K   t        j                  || j                         d {   \  }}t        t	        ||            S 7 w)Nr3   r1   r4   )r   rP   r3   r   r   r7   s       r.   rP   rP      s?     (4(<(<RwOdOd(e"eL-)Ub"cdd #fs   %AAAz/logoutc                 x   K   t        j                  || j                         d {    t        d      S 7 w)Nr   z
Logged outmessage)r   logoutr3   r   )r%   r&   s     r.   r   r      s3     


b0E0E
FFF<00 Gs   %:8:z/mec                 4   K   t        j                  |       S w)N)r   r,   )current_users    r.   mer      s     !!,//s   z/forgot-passwordc                    K   t        j                  || j                         d {   \  }}|st        dd      t	        d      S 7 "w)N)r(   i  uh   We couldn’t find an account associated with this email address. Please verify the email and try again.r:   z#A link has been sent to your email.r   )r   forgot_passwordr(   r   r   )r%   r&   found_tokens       r.   r   r      sM     &66rOOME6}
 	

 "*OPP Ps   %AA
#Az/reset-password/{token}tokenc                    K   t        j                  || |j                  |j                         d {    t	        d      S 7 w)N)r   new_passwordr*   z,Your password has been successfully updated.r   )r   reset_passwordr   r*   r   )r   r%   r&   s      r.   r   r      sI     

%
%
)) 11	   !)WXXs   1AAA)@fastapir   r   r   r   fastapi.responsesr   r_   urllib.parserq   rg   datetimer   sqlalchemy.ext.asyncior	   app.api.depsr
   app.db.sessionr   app.schemas.authr   r   r   r   r   r   r   r   r   r   r   r   r   app.schemas.userr   app.servicesr   app.core.configr   app.core.securityr   r   r   r   app.models.userr    app.models.refresh_tokenr!   
sqlalchemyr"   dotenvr#   routerra   r+   r6   rc   rm   r   rP   r   r   r   r        r.   <module>r      sm   = = .     / ) !    % % $ U U   1   	 Yw/<CFO (- (\ ( 0( Xm4:A&/ c c< cm c 5c K-1gfo L.d
 L.| L.Zj L. L.^ Z8>Efo e> e| eRa e 9e
 Y7<CFO 1- 1\ 1P_ 1 81
 E'*!"23 0 0 +0 0FGMTU[_ 	Q#8 	Ql 	Qaw 	Q H	Q &7LMW^_eWf Y Y.B Y Y  lA Y NYr   