
    Xh                        d dl Z d dlZd dlZd dlmZmZmZ d dlmZmZ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 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! d dl"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- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 dede6fdZ7	 d$dedede!de6dede8defdZ9dededede	e6ef   fd Z:d$ded!e6d"e8dee6e8f   fd#Z;y)%    N)datedatetime	timedelta)DictListTuple)DependsHTTPExceptionstatus)jsonable_encoder)Session)Request)LoginRequest)SessionCreate)Role)UserPermissions)get_user_role_slugs)Users)UserReturnSchema
UserSchema)settings)APIException)UserAccessLevel)create_access_tokenverify_password)generate_secure_idget_password_hashget_site_settings_value)get_device_infoget_ipget_ipinfo_datadbusernamec                    K   | j                  t              j                  t        j                  |k(        j	                         S w)N)queryr   filterr#   first)r"   r#   s     ^/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/auth/services/auth_services.pyget_userr)       s1     88E?!!%..H"<=CCEEs   AArequestuseraccess_token
expires_atkeep_sessionreturnc           
        K   | j                   j                  dd      }t        |       }t        |      xs i }t	        |       xs i }	| j                   j                  dd      }
t        |t        dd      }t        t        di d|d	|j                  d
|d|dt        j                         dt        j                         d|d|d|d|
d|	j                  d      d|	j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|	j                  d      d|	j                  d      d      }t        di |}|j                  |       |j                          |j                  |       |S w)Nz
user-agent referer/se   )instanceprependlength
session_iduser_idtokenr-   refreshed_at
created_atpersistip_addr
user_agentdeviceoslocationloccityregioncountrypostaltimezonebrowser	is_mobileT)exclude_unset )headersgetr    r!   r   r   SessionModelr   r   idr   nowaddcommitrefresh)r*   r"   r+   r,   r-   r.   user_agent_string
ip_addressip_infodevice_infor2   r9   obj_in_dataresults                 r(   create_user_sessionr\   $   s      ++L"= J j)/RG!'*0bKoo!!)S1G#BtTVWJ" 	
!	
GG	
 	
 "		

 "	
  ||~	
 !	
 	
 )	
 	
 ??8,	
 t$	
 [['	
 V$	
 ;;x(	
  KK	*!	
" E"#	
$ ;;x(%	
& [[,'	
(  OOI.)	
* "ook2+	
. 1K6 (K(FFF6NIIKJJvMs   GGpayloadc                   K   |j                   }d|v ri| j                  t              j                  t        j                  |k(  t        j
                  d k(  t        j                  dk(        j                         }n|j                         s$|j                  d      r{|dd  j                         rh| j                  t              j                  t        j                  |k(  t        j
                  d k(  t        j                  dk(        j                         }ng| j                  t              j                  t        j                  |k(  t        j
                  d k(  t        j                  dk(        j                         }|s!t        t        i t        j                  d      t!        |j"                  |j"                        s!t        t        i t        j                  d      |j                  s!t        t        i t        j                  d      |j$                  s!t        t        i t        j                  d	      |j'                  d
      }t)        |j+                  d      t,              r|d   j/                         |d<   t1        di |j3                         }t5        d|it7        t9        t:        j<                                    \  }}t?        || ||||j@                         d {   }	||fS 7 w)N@T+   zInvalid credentialsmoduleerrorstatus_codemessagezInvalid passwordzAccount inactivezAccount is not verifiedF)include_propertiesdobr+   )minutes)dataexpires_delta)r*   r"   r+   r,   r-   r.   rM   )!
identifierr%   r   r&   email
deleted_at	is_activer'   isdigit
startswithphoner#   r   __name__r   HTTP_400_BAD_REQUESTr   passwordis_verified_asdict
isinstancerO   r   	isoformatr   dictr   r   intr   JWT_ACCESS_TOKEN_EXPIRE_MINUTESr\   r.   )
r"   r]   r*   rl   r+   	user_dictcurrent_userr,   r-   sessions
             r(   
login_userr   _   s    ##J jHHUOVz)  D(4'
 UW 	 
			*"7"7"<ABAWAWAY HHUOVz)  D(4'
 UW 	 HHUOV*,  D(4'
 UW 	 33)	
 	
 7++T]];33&	
 	
 >>33&	
 	
 33-	
 	
 6I)--&-$U+557	%*	*//1L  3l#9SIqIqEr3s L*
 (!)) G ##s   K,K9.K7/	K9r;   other_sessionsc                 T  K   |r,| j                  t              j                  t        j                  |k(        j	                         }|s!t        t        i t        j                  d      | j                  t              j                  t        j                  |j                  k(  t        j                  |j                  k7  t        j                  t        j                         kD        j                  t        j                  t        j                         id       | j                          ddiS | j                  t              j                  t        j                  |k(        j	                         }|sddiS t        j                         |_        | j                          ddiS w)z
    Log out a user by invalidating their session token

    Args:
        db: Database session
        token: The access token to invalidate

    Returns:
        Dict with success status
    zActive session not foundrb   F)synchronize_sessionsuccessT)r%   rP   r&   r;   r'   r   rs   r   rt   r:   rQ   r-   r   rR   updaterT   )r"   r;   r   active_sessionr   s        r(   logout_userr      sH     ,/66|7I7IU7RSYY["772	  	%%  N$:$::OO~000##hlln4	
 &,))8<<>:PU&
V
		 t ((<(//0B0Be0KLRRTt$$ &\\^ 			ts   F&F()F)<secretssocketuuidr   r   r   typingr   r   r   fastapir	   r
   r   fastapi.encodersr   sqlalchemy.ormr   starlette.requestsr   #src.apps.auth.models.sessions_modelrP   "src.apps.auth.schemas.auth_schemasr   %src.apps.auth.schemas.session_schemasr   *src.apps.role_permission.models.role_modelr   5src.apps.role_permission.models.user_permission_modelr   .src.apps.role_permission.services.role_servicer   src.apps.user.models.user_modelr   "src.apps.user.schemas.user_schemasr   r   src.core.configr   src.core.exceptionsr   src.utils.enumsr   src.utils.helpers.authr   r   src.utils.helpers.functionsr   r   r   src.utils.ip_geo_toolr   r    r!   strr)   boolr\   r   r   rM       r(   <module>r      s$      . . $ $ 2 2 - " & G ; ? ; Q N 1 K $ , + G 
 K JFw F# F 888 8 	8
 8 8 8v^$ ^$< ^$' ^$eTWYaTaNb ^$B/' /# /t /PTUXZ^U^P_ /r   