o
    g)gB                  
   @   sz  d dl Z d dlZd dlmZmZ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 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lmZ d dlT d d	l m!Z! e Z"e Z#e!  e $d
Z%e $dZ&e'e $dd Z(e'e $dd Z)e $dZ*dZ+e"j,dej-dedeej.fde'defddZ/e"j,dej-deej.fdej0defddZ1e"j,dej-dee#eej.fdej0dedefddZ2e"3d ee#eej.fdedefd!d"Z4e"5d#ee#eej.fd$e'dedefd%d&Z6e",d'ee#eej.fd(ejdedefd)d(Z7e",d*ededee#eej.fd+e'de'dedefd,d-Z8dS ).    N)	APIRouterDependsHTTPExceptionstatusRequestForm)OAuth2PasswordRequestForm
HTTPBearerHTTPAuthorizationCredentials)JSONResponse)Session)UserFolderChatHistorySharedFolder)	timedelta)*)load_dotenvDEFAULT_ALLOCATED_STORAGEDEFAULT_FOLDER_LIMITDB_PATH/STORAGE_PATHDEFAULT_FOLDERz0^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$z	/retrieve)response_model.emaildbc              
      s   zR| s	t dW S |  } tt| sttjtjdddW S |t	
t	j| k }|s3t dW S d}d|j d|j d	}t| ||I d H  ttjd
dddW S  tyj } ztddt| dd }~ww )NEmail is required.Email: Invalid value.r   messagestatus_codecontentzUnregistered Email Address.zAnswerous Access TokenDear z2, <br/><p>PYour access token for Answerous API is zG</p><br/>With Regards,<br/>Answerous Team<br/>e: support@contactous.com   z9The token has been sent to your registered email address.  zServer Error : r"   detail)errorResponsestriprematchEMAIL_REGEXr   r   HTTP_400_BAD_REQUESTqueryr   filterr   firstnametoken
send_emailHTTP_200_OK	Exceptionr   str)r   r   usersubjectmail_contente r<   +/var/www/html/answerous_api/routers/auth.pyretrieveToken   s@   r>   z	/registerr8   c                    sn  z| j r| j  nd}| jr| j nd}| jr| j nd}| jr)| j nd}| jr3| j nd}| jr=| j nd}t|ddrJtdW S t	
t|s\ttjtjddd	W S |ttj|k }|rptd
W S t }	||	 }	t|	}
td dt  }t||| jr|nd| jr|nd||
||	ttd
}|| |  || tjt t!t |	 st"t t!t |	  tjt t#t |	 st"t t#t |	  t$t%}t&t%d|j'd|d}|| |  || |dkrd}d|j  d|j( d}t)|||I d H  t*dt+j,-|. W S  t/y6 } zt0ddt | dd }~ww )N 0000Yes   2   Name: Invalid valueEmail: Invalid valuer   r!   zLEmail already registered. Retrieve the token or register a new email addressTOKEN_PREFIX-
r2   r   org_idorg_nameplanpassword_hashr3   	user_codeallocated_storagefolder_limitr   No)r2   	parent_iduser_idsharedsanitized_namezYour Answerous API Access Tokenr$   a  ,<br/><p>Thank you for signing up with Answerous. It is a RAG-as-a-service designed with the objective of giving you a simple set of flexible APIs with high quality output. The APIs can be tested within minutes and the documentation will help you to integrate them in your environment easily.</p><p>All users of Answerous have a unique access API token.</p><p>Please take note of your token. It is: z}</p><p>Please do not hesitate to contact us if you need any help in using Answerous.</p><br/>Warm Regards,<br/>Answerous TeamzPUser successfully created with this email address. Please take note of the tokenr&   Failed to save file: r'   )1r2   r*   r   rI   rJ   rK   welcome_emailvalidate_string_lengthr)   r+   r,   r-   r   r   r.   r/   r   r0   r1   generate_random_texthash_passwordosgetenvuuiduuid4r   r   addcommitrefreshpathexistsr7   	DB_FOLDERmakedirsUPLOAD_FOLDERreplace_special_charactersr   r   rR   r3   r4   successReponseschemasUserResponsefrom_ormdictr6   r   )r8   r   r2   r   rI   rJ   rK   rV   db_userrandom_texthashed_passwordr3   new_userrT   
new_folderr9   r:   r;   r<   r<   r=   register_userB   s   





rq   z/addcredentialsc                    s  |j }t||}z| jr| j nd}| jr| j nd}| jr'| j nd}| jr1| j nd}| jr;| j nd}	|sDt	dW S |
ttj|k }
t|
j t|j |
sbt	dW S |
j|jkrmt	dW S |j}t|ddr{t	dW S tt|sttjtjd	d
dW S |
ttj|k }|rt	dW S t }t|}td dt  }t||| jr|nd| jr|nd||||jttd
}| | |!  |"| t#dt$j%&|' W S  t(y } zt)ddt*| dd }~ww )Nr?   rA   zOrganization ID is requiredzOrganization ID does not existz7Organization ID does not match with the organization IDrB   rC   rD   rE   r   r!   zEmail already registered.rF   rG   r@   rH   z2User successfully created with this email address.r&   rU   r'   )+rr   authget_current_userr2   r*   r   rI   rK   rV   r)   r/   r   r0   r1   printrJ   rW   r+   r,   r-   r   r   r.   rX   rY   rZ   r[   r\   r]   rM   r   r   r^   r_   r`   rg   rh   OrgUserResponserj   rk   r6   r   r7   )r8   rr   r   r3   org_datar2   r   rI   rK   rV   user_orgrJ   rl   rm   rn   ro   r;   r<   r<   r=   add_user   s   




ry   z/listc              
      s   | j }t||}z/|jr5|ttj|jktj|jk }dd |D }t	ddd |D W S t
dW S  tyP } ztddt| dd }~ww )	Nc                 S      g | ]}t j|qS r<   )rh   rv   rj   ).0usersr<   r<   r=   
<listcomp>       zlist_users.<locals>.<listcomp>zUsers retrieved successfullyc                 S      g | ]}|  qS r<   rk   )r{   r8   r<   r<   r=   r}         z)This account is not organization account.r&   Something went wrong: r'   )rr   rs   rt   rI   r/   r   r0   rR   allrg   r)   r6   r   r7   )rr   r   r3   	user_datar|   r;   r<   r<   r=   
list_users   s$   *r   z/remove/{user_email}
user_emailc              
      s   |j }t||}z?| stdW S |  }|ttj|k	 }|s*tdW S |j
|j
kr5tdW S || |  ttjtjdddW S  ty` } ztddt| d	d }~ww )
Nr   User does not exist.z*User does not belong to your organization.zUser removed successfully.r   r!   r&   r   r'   )rr   rs   rt   r)   r*   r/   r   r0   r   r1   rI   deleter_   r   r   r5   r6   r   r7   )r   rr   r   r3   r   r   r8   r;   r<   r<   r=   remove_user  s<   
r   z/shareshare_folderc              
      s  |j }t||}z| jstdW S |ttj| jktj|jk	 }|s/tdW S | j
s7tdW S | j
 }| j }| jrI| j nd}tt|s]ttjtjdddW S |dkr|ttj| jktj
|k	 }	|	r|tdW S t|| j|r|nd	d
}
||
 |  ||
 tdtj|
 W S |dkr|ttj| jktj
|k	 }|r|| |  ttjtjdddW S ttjtjdddW S tdW S  ty } zt ddt!| dd }~ww )NzFolder is required.zFolder ID does not exist.r   Giver   r   r!   z4The folder is already shared with the email address.r?   )r   	folder_idorganizationz0The folder is now shared with the email address.Removez9The folder is no longer shareable with the email address.z;Invalid access value. The value must be 'Give' or 'Remove'.r&   r   r'   )"rr   rs   rt   r   r)   r/   r   r0   rR   r1   r   r*   r   accessr+   r,   r-   r   r   r.   r   r^   r_   r`   rg   rh   SharedFolderResponserj   rk   r   r5   r6   r   r7   )r   rr   r   r3   r8   folder_existr   r   access_typeis_existrS   shared_folderr;   r<   r<   r=   r   +  s   *

(


(
z/historydoc_idc           
   
      s   |j }t||}|r| nd}zV| stdW S |s!tdW S |ttj|ktj	|j	k
 }|s<tdW S |ttj|jktj| k }dd |D }|s^tdW S tdd	d |D W S  ty }	 ztd
dt|	 dd }	~	ww )Nr?   zPlease select document request.r   r   c                 S   rz   r<   )rh   ChatHistoryResponserj   )r{   chatsr<   r<   r=   r}     r~   z chat_history.<locals>.<listcomp>zNo any document found.zHistory retrieved successfullyc                 S   r   r<   r   )r{   chatr<   r<   r=   r}     r   r&   r   r'   )rr   rs   rt   r*   r)   r/   r   r0   r   rI   r1   r   rR   r   r   rg   r6   r   r7   )
r   r   rr   r   r3   r8   	chat_userchat_history	chat_datar;   r<   r<   r=   r   y  s@   ((r   )9rZ   r\   fastapir   r   r   r   r   r   fastapi.securityr   r	   r
   fastapi.responsesr   sqlalchemy.ormr   db_config.databasedatabaser   db_config.modelsr   r   r   r   db_config.schemasrh   db_config.authrs   datetimer   dependencies.helperdotenvr   routersecurityr[   r   r   r7   rc   re   r   r-   postri   get_dbr>   
UserCreaterq   ry   getr   r   r   r   r   r<   r<   r<   r=   <module>   s`     


$' P*d$(*M