
    Eoh2                     L   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m	Z	 d dl
mZ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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$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/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d+dede	e9   de	e9   fdZ:de%dede'fdZ;de*dede9de'fdZ<d,dede&dee9   de=fdZ>	 d-dede&de?d e?dee9   defd!Z@dede9de'fd"ZAded#e"de$fd$ZBd%e"de*dede'fd&ZCdede?de)fd'ZDdede9fd(ZEdede9d)eFfd*ZGy).    N)datetime	timedeltatimezone)AnyDictListOptional)HTTPException
UploadFilestatus)StreamingResponse)distinctfuncliteral	nullslast)Session
joinedload)r   )Role)UserPermissions)&create_admin_role_with_all_permissionsseed_default_permissions)Users)ChangePasswordSchemaUserCreateSchemaUserFilterSchemaUserReturnSchemaUserSessionSchemaUserSessionsResponseUserUpdateSchema)settings)API_PREFIXES)UserAccessLevel)encrypt_passwordverify_password)get_password_hashget_site_settings_value)QueryPaginatordbusernameemailc                    K   |rC| j                  t              j                  t        j                  |k(        j	                         S |rC| j                  t              j                  t        j
                  |k(        j	                         S y wN)queryr   filterr)   firstr*   )r(   r)   r*   s      ^/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/user/services/user_services.pyget_userr1   (   se     xx%%enn&@AGGIIxx%%ekkU&:;AACCs   BBpayloadreturnc                   K   d }| j                   r| j                   }|j                  t              j                  t        j                  | j                  k(  t        j
                  | j
                  k(  z        j                         }|rt        t        j                  d      | j                  | j                  k7  rt        t        j                  d      t        | j                        }t        j                  dd| j
                  j                  d      d         }t!        j"                  t$        j&                        j)                  d      }| d| }t        t+        t-        j.                               || j
                  || j                  | j0                  | j2                  | j4                  d	d	t!        j6                         t!        j6                         
      }|j9                  |       |j;                          |j=                  |       |r	 t?        |      D ]  \  }	}
|j                  t@              j                  t@        jB                  |
k(        j                         }|sLtE        |jF                  |jF                  |	dk(        }|j9                  |       |j;                           	 tM        jN                  |      S # tH        $ r!}tK        dt+        |              Y d }~:d }~ww xY ww)Nz,User with this phone or email already existsstatus_codedetailz*Password and confirm password do not matchz\W+_@r   z%Y%m%d%H%M%ST)user_idr)   r*   passwordphone
first_name	last_name	avatar_id	is_activeis_verified
created_at
updated_atr:   role_id
is_primaryError assigning role to user: )(access_levelr-   r   r.   r<   r*   r/   r
   r   HTTP_400_BAD_REQUESTr;   confirm_passwordr%   resubsplitr   nowr   utcstrftimestruuiduuid4r=   r>   r?   utcnowaddcommitrefresh	enumerater   slugr   id	Exceptionprintr   model_validate)r2   r(   access_levelsexisting_userhashed_passwordbase_username	timestampr)   new_useridxrH   role	user_rolees                 r0   create_user_servicerh   0   sU    M,,HHUO**EKK7==,HU[[\c\i\iMi+jkqqsM33A
 	

 733333?
 	

 ((8(89O FF63(;(;C(@(CDMX\\*33NCI)-HDJJL!mm mm%%####??$??$H FF8IIKJJx 
	=%.}%=  !\xx~,,TYY,-FGMMO /TWWbeijbj lIFF9%IIK  **844  	=23q6(;<<	=s8   HK9AK .AK 6K9	K6K1,K91K66K9r:   c                 Z   |j                  t              j                  t        j                  |k(        j	                         }|st        t        j                  d      d }| j                  r| j                  }| j                  rx|j                  t              j                  t        j                  | j                  k(  t        j                  |j                  k7        j	                         }|rt        dd      | j                  rx|j                  t              j                  t        j                  | j                  k(  t        j                  |j                  k7        j	                         }|rt        dd      | j                  dd      j                         D ]  \  }}t        |||        |r	 |j                  t              j                  t        j                  |j                  k(        j!                          |j#                          t%        |      D ]  \  }}	|j                  t&              j                  t&        j(                  |	k(        j	                         }
|
sLt        |j                  |
j                  |d	k(  
      }|j+                  |       |j#                           	 |j+                  |       |j#                          |j3                  |       t5        j6                  |      S # t,        $ r!}t/        dt1        |              Y d }~ld }~ww xY w)NUser not foundr5   i  z(Email already registered by another userz/Phone number already registered by another userrH   T)excludeexclude_unsetr   rD   rG   )r-   r   r.   r:   r/   r
   r   HTTP_404_NOT_FOUNDrH   r*   rZ   r<   dictitemssetattrr   deleterV   rX   r   rY   rU   r[   r\   rQ   rW   r   r]   )r2   r(   r:   current_userr^   r_   fieldvaluerd   rH   re   rf   rg   s                r0   update_user_serviceru   o   s]   88E?))%--7*BCIIKL(A(AJZ[[ M,,}}..u{{gmm/KUXXYeYhYhMhiooqC8bcc}}..u{{gmm/KUXXYeYhYhMhiooqC8ijj^4PVVX ,ueU+, 	=HH_%,,_-D-D-WX__aIIK%.}%=  !\xx~,,TYY,-FGMMO /QUQXQXfimnfn pIFF9%IIK  FF<IIKJJ|**<88  	=23q6(;<<	=s    <B3L  0AL   	L*	L%%L*sort_byc                 \   | j                  t              j                  t        j                  dk(        }|j                  rq|j                  t        j                  t        j                  dz   t        j                  z         j                  d|j                  j                          d            }|j                  r]|j                  t        j                  t        j                        j                  d|j                  j                          d            }|j                  r]|j                  t        j                  t        j                        j                  d|j                  j                          d            }|j                  r]|j                  t        j                  t        j                        j                  d|j                  j                          d            }|j                  r<|j                  t        j                  j                  d|j                   d            }|j                  ,|j                  t        j                  |j                  k(        }|j                  ,|j                  t        j                  |j                  k(        }|j                  r.|j                  t        j                  |j                              }g }|r|D ]  }	 |j!                  dd      }|dv rLt#        t        |      }|j%                  d      r|j'                         }|j)                  t+        |             nt-        t.        j0                  d| d	       |r |j4                  | }||fS # t2        $ r  t-        t.        j0                  d| d	      w xY w)
a  
    Build and return a filtered and sorted tour query.

    Args:
     db: Database session
     payload: Filter parameters
     sort_by: List of fields to sort by (prefix with - for descending order)

    Returns:
     tuple: (SQLAlchemy Query object, sort_query list if any)
    N %- )r=   r>   r*   r<   r@   rA   is_foreign_visitoris_reported	is_online
last_loginrB   z&Cannot sort with unidentified column ''r5   )r-   r   r.   
deleted_at	full_namer   lowerr=   r>   iliker*   r<   r@   rA   rH   has_rolereplacegetattr
startswithdescappendr   r
   r   HTTP_422_UNPROCESSABLE_ENTITYAttributeErrororder_by)r(   r2   rv   r-   
sort_queryscol
sort_orders           r0   _build_user_queryr      s    HHUO""5#3#3t#;<E JJu''#-?@FF7K\K\KbKbKdJeefGgh
 TZZ(8(89??!GDVDVD\D\D^C__`@abcTZZ8>>7CTCTCZCZC\B]]^?_`a}}TZZ4::Qw}}?R?R?T>UUV;WXY}}U[[..7==//CDE$U__0A0AAB&U..'2E2EEFU^^G,@,@AB J 	AiiR(   ")!4J||C(%/__%6
%%i
&;<'$*$H$H!Gs!L  =+	B "ENNJ/E* " # & D DCA3aH s   *BN)N+pageper_pagec           
      4   | j                  t              j                         }t        | ||      \  }}|dz
  |z  }t	        |t
        dj                  t        t        j                               t        j                  g      ||      }	|	j                         S )N   r{   )r-   schemaurloffsetlimit)r-   r   allr   r'   r   joinrQ   r    api_base_urlr!   USERpaginate)
r(   r2   r   r   rv   usersr-   r8   r   	paginators
             r0   get_all_users_servicer      s     HHUO!E Wg6HE1Qh("FGGS..01<3D3DEFI     c                     | j                  t              j                  t        j                  |k(        }|j	                         }|st        t        j                  d      t        j                  |      S )Nrj   r5   )
r-   r   r.   r:   r/   r
   r   rm   r   r]   )r(   r:   r-   users       r0   get_user_by_user_id_servicer      sV    HHUO""5==G#;<E;;=D(A(AJZ[[**400r   rr   c                    | j                  t              j                  t        j                  |j                  k(        j	                         }|st        t        j                  d      |j                  }|j                  }|j                  }||k7  rt        t        j                  d      t        ||j                        rt        t        j                  d      t        ||j                        st        t        j                  d      t        |      }||_        t        j                          |_        | j%                          | j'                  |       ddiS )Nrj   r5   z.New password and confirm password do not matchz7New password cannot be the same as the current passwordzCurrent password is incorrectr7   zPassword changed successfully)r-   r   r.   rZ   r/   r
   r   rm   current_passwordnew_passwordrJ   rI   r$   r;   r%   r   rT   rC   rV   rW   )r(   rr   r2   userobjr   r   rJ   r`   s           r0   change_password_servicer   	  s"   hhuo$$UXX%@AGGIG(A(AJZ[[//''L//''33<l
 	

 |W%5%5633<u
 	

 +W-=-=>(C(CLkll (5O&G!*GIIKJJw566r   r   c                 8   K   t        ||| j                        S wr,   )ru   r:   )r   r2   r(   s      r0   update_user_profiler   )  s     wDLL99s   c           
         d}t        | d|      }| j                  t              j                  t        j                  |k(        j                  t        j                  j                               j                  |      j                         }t        |t        |      |D cg c]  }t        j                  |       c}      S c c}w )N   session_number)default)max_allowed_sessionsactive_countactive_sessions)r&   r-   UserSessionr.   r:   r   rB   r   r   r   r   lenr   from_orm_with_location)r(   r:   max_sessionssessionsr   s        r0   get_user_sessions_with_limitr   -  s    L*2/?VL 		##w.	/	+((--/	0	|		   )]NVW*AA!DW  Xs   "Cc                 >   | j                  t              j                  t        j                  |k(        j	                         }|st        t        j                  d      t        j                         |_
        | j                          | j                  |       ddiS )Nrj   r5   messagezUser deleted successfully)r-   r   r.   r:   r/   r
   r   rm   r   rT   r   rV   rW   )r(   r:   r   s      r0   delete_user_servicer   B  st    88E?!!%--7":;AACD(A(AJZ[[ oo'DOIIKJJt233r   r@   c                 *   | j                  t              j                  t        j                  |k(        j	                         }|st        t        j                  d      ||_        | j                          | j                  |       dd|rdnd diS )Nrj   r5   r   zUser status changed to activeinactivez successfully)r-   r   r.   r:   r/   r
   r   rm   r@   rV   rW   )r(   r:   r@   r   s       r0   user_status_change_servicer   O  sz    88E?!!%--7":;AACD(A(AJZ[[DNIIKJJt0YJ0WWdeffr   )NNr,   )r   
   N)HrK   rR   r   r   r   typingr   r   r   r	   fastapir
   r   r   fastapi.responsesr   
sqlalchemyr   r   r   r   sqlalchemy.ormr   r   #src.apps.auth.models.sessions_modelr   *src.apps.role_permission.models.role_modelr   5src.apps.role_permission.models.user_permission_modelr   4src.apps.role_permission.services.permission_servicer   r   src.apps.user.models.user_modelr   "src.apps.user.schemas.user_schemasr   r   r   r   r   r   r   src.core.configr    src.utils.constantsr!   src.utils.enumsr"   src.utils.helpers.authr#   r$   src.utils.helpers.functionsr%   r&   src.utils.helpers.paginationr'   rQ   r1   rh   ru   tupler   intr   r   r   r   r   r   boolr    r   r0   <module>r      s   	  2 2 , , 5 5 / 9 9 . F ; Q 2   % , + D 8w (3- xPS} <5'7 <5W <5IY <5~,9!1 ,9w ,9 ,9Qa ,9^I' I,< ItCy I\a IZ ei  * 25 EH X\]`Xa 	 (1G 1c 1>N 17 7u 7G[ 7@:E :4D :' :Vf :W s ?S *
4G 
4c 
4g7 gS gT gr   