o
    hP9                     @   s  d dl Z d dlZd dlZd dlZd dl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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mZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% e  edgddZ&eddZ'dZ(dZ)dZ*dZ+dZ,dZ-e.e/ddZ0G dd de j1Z2dAddZ3d e d!e4fd"d#Z5dBd$e$d%ee4 d!e4fd&d'Z6d(e7d)e.d*e.d+ee7 d,ee7 d-ee7 d.ee7 d/ee7 d0ee. d!e4fd1d2Z8d3e7d!e4fd4d5Z9d6e7d!e4fd7d8Z:d3e7d9e"d!e4fd:d;Z;d3e7d!e4fd<d=Z<d>e%d!e4fd?d@Z=dS )C    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                       s   e Zd Z fddZ  ZS )CustomJSONEncoderc                    s0   t |tr	| S t |trt|S t |S N)
isinstancer   	isoformatr   strsuperdefault)selfobj	__class__ 6/var/www/html/moveengine/app/v1/services/saas/users.pyr-   )   s
   

zCustomJSONEncoder.default)__name__
__module____qualname__r-   __classcell__r2   r2   r0   r3   r'   (   s    r'      c                 C   s   d tjtjtj | dS )z-Generate a random alphanumeric referral code. )k)joinrandomchoicesstringascii_uppercasedigits)lengthr2   r2   r3   generate_referral_code1   s   rB   userreturnc                 C   s  |t  }|d }|d| jirtddd|d| ji}|r+d|vs+|d | jkr1tdddt| j}i |  |ddd	}t	|d
< d|d< |
dr|d |d< |
dd|d< |t }|dt|
di}	|	r|	
dd|d< |	
dd|d< |	
dd|d< |	
dr|t }
|
dt|	
di}|r|
dd|d< |
dt	|d
< n|t }||d dd}||d< n	 t |d< t |d< |d td| jd|d < d!}t|D ]}t }|d"|is||d"<  nqtd#d$dz]|t }|d| ji}|r4|
dd|d< |
d%d|d%< |d"|d% i}|r4|
dd|d&< d'd( | D }td)| jitd*}||}t|j|d< |t | j|d   W n t!yk   tdddw t"#t"j$|t%d+}||d,S )-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_idr9   subscription_idsubscription_statusactive_agents_countsubscription_agents_countACTIVE)rR   r   created_date
last_loginpasswordz^([^@]+)   name   referral_codei  z'Could not generate unique referral codereferred_byreferred_account_idc                 S   s   i | ]\}}|d vr||qS ))rV   rX   rY   rQ   rP   r2   ).0r:   vr2   r2   r3   
<dictcomp>|       z'create_user_service.<locals>.<dictcomp>sub)dataexpires_delta)cls)	user_datatoken)&COLLECTION_NAMEfind_onerE   r   rK   pwd_contexthashr_   dictr%   getACCOUNT_COLLECTION_NAMEr   SUBSCRIPTION_COLLECTION_NAMEPROJECT_COLLECTION_NAMEcount_documentsr   utcnowpopresearchgrouprangerB   COLLECTION_EMAILSitemsr   ACCESS_TOKEN_EXPIRES
insert_oner+   inserted_idadd_taskr   r   jsonloadsdumpsr'   )rC   background_tasksdbusers_collectionemails_collectionemail_entryrM   new_user_dataaccounts_collectionaccount_infosubscription_collectionsubscriptionproject_collectionactive_projects_countmax_attemptsattemptrc   emails_inforeferral_infoinsert_user_dataro   new_userjson_compatible_user_datar2   r2   r3   create_user_service5   s~   




r   email_actioncurrent_userc              
   C   s>  |t  }|d }|t }|t }dd | jdD }|r | js%dddS |r,|dnd }	|r5|d	nd }
| jd
v r|d }|d|id u}| jdkrU|rUdddS | jdkra|sadddS t	dd}|j
d|idd|iidd | jdkr|t|| n|t|| d| dddS | jdkrd}|	r|dt|	i}|r|dd}g }g }|D ]X}|d|id u}|r|| qt	dd}|d| ji}|r|d d!nd!}||| j|
d"}| jr| j|d< |j
d|id|idd |t||| j|||
 || qd#t| d$||dd%S td&d'd())Nr!   c                 S   s   g | ]
}|  r|  qS r2   )strip)rf   rE   r2   r2   r3   
<listcomp>   s    z3send_email_verification_service.<locals>.<listcomp>,z!Email(s) and action are required.r   )messager   rR   rc   )signupforgotrE   r   rG   r`   r   zEmail not found.   i i?B $setrK   T)upsertzVerification code sent to .r   inviteMOVEXrU   account_namerole_idra   r   )rE   rK   rS   rd   zInvitations sent to z	 user(s).)r   invitedskippedr   rF   zInvalid action.rH   )rp   rv   COLLECTION_ROLEr!   splitactionru   rq   r<   randint
update_oner   r   r   r   appendrS   rR   r   lenr   )r   r   r   r   r   r   r   roles_collection
email_listrR   rc   rE   user_existsverification_coder   account_detailsr   r   roledetails	role_name
email_datar2   r2   r3   send_email_verification_service   st   








r   rR   skiplimitqr   re   created_date_fromcreated_date_torS   c                 C   sp  |t  }i }td | dkr|ddkrtddd| dkr#| |d< |s'|	rAi }|r3t|d	|d
< |	r=t|	d	|d< ||d< |rG||d< |
rM|
|d< |ra|dd}d|id|id|ig|d< |rx| dkrnd|d< n
| dkrxd|d< t||	|
|}|D ]"}t|d |d< dD ]}||v rt|| tr||  ||< qq||}td ||dS )Nzhello BoOSSallr    1i  z Not permitted to view all users.rH   rR   z%Y-%m-%dz$gtez$lter]   re   rS   i)z$regexz$optionsra   rE   mobilez$oractiveTrN   inactiveFrU   user_id)r]   r^   date_of_birthzhey boss)total_countr   )rp   printru   r   r   strptimelowerlistfindr   r   r+   r)   r*   ry   )rR   r   r   r   r   re   r   r   r   r   rS   r   querydate_filterregex_queryr   rC   fieldr   r2   r2   r3   get_users_service   sJ   



r   r   c                 C   s:   |t  dt| i}|rt|d |d< |dd  |S )NrU   idrM   )rp   rq   r   r+   r{   )r   r   rC   r2   r2   r3   read_user_service  s
   r   email_idc                 C   s6   |d  d| i}|rt|d |d< |dd  |S )Nr!   rE   rU   r   rM   )rq   r+   r{   )r   r   rC   r2   r2   r3   read_user_serviceby_email  s
   r   rn   c                 C   s   |t  }|dt| i}|stddddd |  D }|dt| id|i}|jdkr7tddd|dt| i}|rJ|d	d  |S tdd
d)NrU     User not foundrH   c                 S   s   i | ]\}}|d ur||qS r(   r2   )rf   keyvaluer2   r2   r3   rh     ri   z'update_user_service.<locals>.<dictcomp>r   r   rM   zUser not found after update)	rp   rq   r   r   rt   r   r   matched_countr{   )r   rn   r   r   existing_userupdate_dataresultupdated_userr2   r2   r3   update_user_service  s   
r   c                 C   s@   |t  }|dt| i}|stddd|dt| i |S )NrU   r   r   rH   )rp   rq   r   r   
delete_one)r   r   r   rC   r2   r2   r3   delete_user_service(  s   r   request_bodyc           
      C   s   | j }| j}| j}|t }|d }|d|i}|s tddd|d|i}|r5d|vs5t|d |kr;tdddt|}	|	d	|d	 id
d|	ii |	d|idddii ddiS )Nr!   rE   r   r   rH   rK   rF   rL   rU   r   rM   z$unsetr9   r   zPassword reset successfully)
rE   rK   r_   rp   rq   r   r+   rr   rs   r   )
r   r   rE   coder_   r   r   rC   r   rM   r2   r2   r3   reset_password_service0  s   
r   )r8   r(   )>r   osr|   r<   r>   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   rr   r   rp   r   r   rv   rw   rx   intgetenvr%   JSONEncoderr'   rB   rt   r   r   r+   r   r   r   r   r   r   r2   r2   r2   r3   <module>   sH    $

	UJT-