
    hP9                     n   S SK r S SKrS SKrS SKrS SKrS SKJrJr  S SKJr  S SK	J
r
  S SKJr  S SKJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  SSKJrJrJrJr  SSKJrJ r J!r!J"r"J#r#J$r$J%r%  \" 5         \" S/SS9r&\" SS9r'Sr(Sr)Sr*Sr+Sr,Sr-\." \R^                  " SS5      5      r0 " S S\ Rb                  5      r2S7S jr3S\ S\44S  jr5S8S!\$S"\\4   S\44S# jjr6S$\7S%\.S&\.S'\\7   S(\\7   S)\\7   S*\\7   S+\\7   S,\\.   S\44S- jr8S.\7S\44S/ jr9S0\7S\44S1 jr:S.\7S2\"S\44S3 jr;S.\7S\44S4 jr<S5\%S\44S6 jr=g)9    N)datetime	timedelta)CryptContext)ObjectId)DuplicateKeyError)HTTPExceptionstatusRequest)load_dotenv)Optional)create_access_token)str_to_objectid   )send_verification_emailsend_invite_emailsend_forgot_password_emailsend_welcome_email)UserUserBase	UserLogin
UserUpdateUserResponseListEmailActionResetPasswordRequestbcryptauto)schemes
deprecatedi7  )minutesusersrolesemailsaccountssubscriptionsprojectsALLOWED_FREE_AGENTS2c                   (   ^  \ rS rSrU 4S jrSrU =r$ )CustomJSONEncoder(   c                    > [        U[        5      (       a  UR                  5       $ [        U[        5      (       a  [	        U5      $ [
        TU ]  U5      $ N)
isinstancer   	isoformatr   strsuperdefault)selfobj	__class__s     HC:\Suresh\moveshuttle\MDcreated\moveengine\app\v1\services\saas\users.pyr1   CustomJSONEncoder.default)   sA    c8$$==?"c8$$s8Ows##     )__name__
__module____qualname____firstlineno__r1   __static_attributes____classcell__)r4   s   @r5   r)   r)   (   s    $ $r7   r)   c                     SR                  [        R                  " [        R                  [        R
                  -   U S95      $ )z-Generate a random alphanumeric referral code. )k)joinrandomchoicesstringascii_uppercasedigits)lengths    r5   generate_referral_coderI   1   s+    776>>&"8"86=="HFSTTr7   userreturnc                    U[            nUS   nUR                  SU R                  05      (       a
  [        SSS9eUR                  SU R                  05      nU(       a  SU;  d  US   U R                  :w  a
  [        SSS9e[
        R                  U R                  5      n0 U R                  5       EUSSS	.En[        US
'   SUS'   UR                  S5      (       Ga<  US   US'   UR                  SS5      US'   U[           nUR                  S[        UR                  S5      5      05      n	U	(       a  U	R                  SS5      US'   U	R                  SS5      US'   U	R                  SS5      US'   U	R                  S5      (       aj  U[           n
U
R                  S[        U	R                  S5      5      05      nU(       a.  UR                  SS5      US'   UR                  S[        5      US
'   O&U[           nUR                  US   SS.5      nXS'   O [         R"                  " 5       US'   [         R"                  " 5       US'   UR%                  S5        [&        R(                  " SU R                  5      R+                  S5      US '   S!n[-        U5       H,  n[/        5       nUR                  S"U05      (       a  M'  UUS"'     O   [        S#S$S9e U[0           nUR                  SU R                  05      nU(       a\  UR                  SS5      US'   UR                  S%S5      US%'   UR                  S"US%   05      nU(       a  UR                  SS5      US&'   UR3                  5        VVs0 s H  u  nnUS';  d  M  UU_M     nnn[5        S(U R                  0[6        S)9nUR9                  U5      n[;        UR<                  5      US'   UR?                  [@        U R                  US    5        [D        RF                  " [D        RH                  " U[J        S*95      nUUS+.$ s  snnf ! [B         a    [        SSS9ef = f),Nr"   email  $User with this email already exists.status_codedetailverificationCodeInvalid verification code.T)hashed_password	is_activeis_verifiedsubscription_agentsr   active_agents
account_idroled   r!   _idaccount_typeactive_subscription_idr@   subscription_idsubscription_statusactive_agents_countsubscription_agents_countACTIVE)rZ   r	   created_date
last_loginpasswordz^([^@]+)   name   referral_codei  z'Could not generate unique referral codereferred_byreferred_account_id)r^   r`   ra   rY   rX   sub)dataexpires_delta)cls)	user_datatoken)&COLLECTION_NAMEfind_onerM   r   rS   pwd_contexthashrg   dictr&   getACCOUNT_COLLECTION_NAMEr   SUBSCRIPTION_COLLECTION_NAMEPROJECT_COLLECTION_NAMEcount_documentsr   utcnowpopresearchgrouprangerI   COLLECTION_EMAILSitemsr   ACCESS_TOKEN_EXPIRES
insert_oner/   inserted_idadd_taskr   r   jsonloadsdumpsr)   )rJ   background_tasksdbusers_collectionemails_collectionemail_entryrU   new_user_dataaccounts_collectionaccount_infosubscription_collectionsubscriptionproject_collectionactive_projects_countmax_attemptsattemptrk   emails_inforeferral_inforA   vinsert_user_datars   new_userjson_compatible_user_datas                            r5   create_user_servicer   5   sp   /*8  '4::!6774Z[[ $,,gtzz-BCK,K?;OaCbfjf{f{C{4PQQ "&&t}}5Ootyy{oUYjnoM+>M'(%&M/" |$$&1,&?l#!,!=g !89*33UOKOO\hLi<j4kl,8,<,<^Q,OM.)/;/?/?@XZ\/]M+,3?3C3CDY[]3^M/0 899*,-I*J'6??XdXhXh  jB  YC  ID  AE   F5A5E5EF[]^5_M/2;G;K;KLgi|;}M"78%'(?%@"(:(J(JZghtZu  BJ  LK  )L%1Fo. 	$,OO$5M.!"*//"3M,j!IIk4::>DDQGM& L&.0((/=)IJJ-:M/*	 ' 4]^^\01'00'4::1FG%0__VS%AM'"+6??="+MM-(,55VcHd6efM7D7H7HWY7Z34 .;-@-@-B  s-BTQa  Pr  GrDAqD-B  s#%)<L`a#../?@"8#7#78e!!"4djj-PVBWX
 !%

4::mIZ+[ \2UCC s
  \4Z[[\s&   BP- 3P'P'A*P- 'P- -Qemail_actioncurrent_userc           
         U[            nUS   nU[           nU[           nU R                  R	                  S5       Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     n	nU	(       a  U R                  (       d  SSS.$ U(       a  UR                  S5      OS n
U(       a  UR                  S5      OS nU R                  S;   a  U	S   nUR                  S	U05      S LnU R                  S
:X  a  U(       a  SSS.$ U R                  S:X  a  U(       d  SSS.$ [        R                  " SS5      nUR                  S	U0SSU00SS9  U R                  S
:X  a  UR                  [        X5        OUR                  [        X5        SU S3SS.$ U R                  S:X  GaW  SnU
(       a5  UR                  S[        U
5      05      nU(       a  UR                  SS5      n/ n/ nU	 H  nUR                  S	U05      S LnU(       a  UR!                  U5        M2  [        R                  " SS5      nUR                  SU R"                  05      nU(       a  UR                  SS5      OSnUUU R"                  US .nU R$                  (       a  U R$                  US'   UR                  S	U0SU0SS9  UR                  [&        XU R"                  UX5        UR!                  U5        M     S![)        U5       S"3UUSS#.$ [+        S$S%S&9es  snf )'Nr"   ,z!Email(s) and action are required.r   )messager	   rZ   rk   )signupforgotrM   r   rO   rh   r   zEmail not found.   i i?B $setrS   T)upsertzVerification code sent to .r   inviteMOVEXr]   account_namerole_idri   r   )rM   rS   r[   rl   zInvitations sent to z	 user(s).)r   invitedskippedr	   rN   zInvalid action.rP   )rt   rz   COLLECTION_ROLEr"   splitstripactionry   ru   rC   randint
update_oner   r   r   r   appendr[   rZ   r   lenr   )r   r   r   r   r   r   r   roles_collectionrM   
email_listrZ   rk   user_existsverification_coder   account_detailsr   r   roledetails	role_name
email_datas                        r5   send_email_verification_servicer      s   /*845/*-9-@-@-F-Fs-K]-KE{{}-%++--KJ]\00>!LL3?!!,/TJ9EL$$_54M221&//%0@AM(*{EQRSS(*;1Q??"NN66:$$e(*;<= 	% 	
 (*%%&=uX%%&@%[7wa@ANN				( 1::E?S]C^;_`O.22>7KE*33We4DETQKu% !'vv >*33Y@Q@Q4RSK;F7FI $5$)),	J &&+7+B+B
<((('5)9FJ;OX\(]%%&7S_SdSdfoq}  MNN5!1  6 .c'l^9E	
 	
 4EFF[ ^s   L	L	rZ   skiplimitqr	   rm   created_date_fromcreated_date_tor[   c                    U[            n0 n[        S5        U S:X  a#  UR                  SS:g  5      (       a
  [        SSS9eU S:w  a  XS'   U(       d  U	(       aH  0 nU(       a  [        R
                  " US	5      US
'   U	(       a  [        R
                  " U	S	5      US'   XS'   U(       a  X\S'   U
(       a  XS'   U(       a  USS.nSU0SU0SU0/US'   U(       a5  UR                  " 5       S:X  a  SUS'   OUR                  " 5       S:X  a  SUS'   [        UR                  U5      R                  U5      R                  U5      5      nU HU  n[        US   5      US'   S H;  nUU;   d  M  [        UU   [        5      (       d  M%  UU   R                  5       UU'   M=     MW     UR                  U5      n[        S5        UUS.$ )Nzhello BoOSSallr!   1i  z Not permitted to view all users.rP   rZ   z%Y-%m-%dz$gtez$ltere   rm   r[   i)z$regexz$optionsri   rM   mobilez$oractiveTrV   inactiveFr]   user_id)re   rf   date_of_birthzhey boss)total_countr    )rt   printry   r   r   strptimelowerlistfindr   r   r/   r-   r.   r}   )rZ   r   r   r   r	   rm   r   r   r   r   r[   r   querydate_filterregex_queryr    rJ   fieldr   s                      r5   get_users_servicer      s   /*E	-U|//3??4VWWU(lO"*"3"34Ez"RK"*"3"3OZ"PK +n ':#$f!"4-/ER]G^_e<<>X%!%E+\\^z)!&E+!&&u-2248>>uEFEd5k*YDE}DK!B!B"5k335U E 
 #2259K	*&77r7   r   c                     U[            R                  S[        U 5      05      nU(       a#  [        US   5      US'   UR	                  SS 5        U$ )Nr]   idrU   )rt   ru   r   r/   r   )r   r   rJ   s      r5   read_user_servicer     sJ    o''0H(IJDe%T
"D)Kr7   email_idc                     US   R                  SU 05      nU(       a#  [        US   5      US'   UR                  SS 5        U$ )Nr"   rM   r]   r   rU   )ru   r/   r   )r   r   rJ   s      r5   read_user_serviceby_emailr     sD    h<  '8!45De%T
"D)Kr7   rr   c                    U[            nUR                  S[        U 5      05      nU(       d
  [        SSS9eUR	                  5       R                  5        VVs0 s H  u  pVUc  M
  XV_M     nnnUR                  S[        U 5      0SU05      nUR                  S:X  a
  [        SSS9eUR                  S[        U 5      05      n	U	(       a  U	R                  SS 5        U	$ [        SSS9es  snnf )	Nr]     User not foundrP   r   r   rU   zUser not found after update)	rt   ru   r   r   rx   r   r   matched_countr   )
r   rr   r   r   existing_userkeyvalueupdate_dataresultupdated_users
             r5   update_user_servicer     s    /*$--uog6N.OPM4DEE090@0F0F0H^0H*#E:3:0HK^((%1I)JVU`LabFq 4DEE#,,e_W5M-NOL*D1
C0M
NN _s   	C(%C(c                     U[            nUR                  S[        U 5      05      nU(       d
  [        SSS9eUR	                  S[        U 5      05        U$ )Nr]   r   r   rP   )rt   ru   r   r   
delete_one)r   r   r   rJ   s       r5   delete_user_servicer   (  sU    /*$$e_W-E%FGD4DEE(@ ABKr7   request_bodyc                    U R                   nU R                  nU R                  nU[           nUS   nUR	                  SU05      nU(       d
  [        SSS9eUR	                  SU05      nU(       a  SU;  d  [        US   5      U:w  a
  [        SSS9e[        R                  U5      n	UR                  S	US	   0S
SU	005        UR                  SU0SSS005        SS0$ )Nr"   rM   r   r   rP   rS   rN   rT   r]   r   rU   z$unsetr@   r   zPassword reset successfully)
rM   rS   rg   rt   ru   r   r/   rv   rw   r   )
r   r   rM   coderg   r   r   rJ   r   rU   s
             r5   reset_password_servicer   0  s   E((D$$H/*8$$gu%56D4DEE#,,gu-=>K,K?3{SeGfCgkoCo4PQQ!&&x0OU 4v@QSb?c6de  '5!1H?QSU>V3WX455r7   )   r,   )>r   osr   rC   rE   r   r   passlib.contextr   bsonr   pymongo.errorsr   fastapir   r	   r
   dotenvr   typingr   app.v1.dependencies.authr   app.v1.libraries.objectr   libraries.email_templatesr   r   r   r   models.saas.usersmodelr   r   r   r   r   r   r   rv   r   rt   r   r   rz   r{   r|   intgetenvr&   JSONEncoderr)   rI   rx   r   r   r/   r   r   r   r   r   r   r8   r7   r5   <module>r     s    	 	   ( (  , 2 2   8 3   
 H:&A /   $ . $ "))$93?@ $(( $UQDh QD QDjRG+ RGcklpcq RG  ~B RGh+8# +8S +8 +8# +8X`adXe +8  }E  FI  }J +8  px  y|  p} +8  OW  X[  O\ +8  bj  kn  bo +8  tx +8Zs 4  D O O OD O T 6)= 6d 6r7   