
    hAD              
          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 d d	l m!Z!  e       Z" e       Z# e!         e jH                  d
      Z% e jH                  d      Z& e' e jH                  d            dz   Z( e' e jH                  d            dz   Z) e jH                  d      Z*dZ+e"jY                  dejZ                         ed       eej\                        fde'defd       Z/e"jY                  dejZ                         eej\                        fdej`                  defd       Z1e"jY                  dejZ                         ee#       eej\                        fdej`                  dedefd       Z2e"jg                  d       ee#       eej\                        fdedefd       Z4e"jg                  d       ee#       eej\                        fdedefd        Z5e"jm                  d!       ee#       eej\                        fd"e'dedefd#       Z7e"jY                  d$       ee#       eej\                        fd%ej0                  dedefd&       Z8e"jY                  d'       ed       ed       ee#       eej\                        fd(e'de'dedefd)       Z9y)*    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                 p  K   	 | st        d      S | j                         } t        j                  t        |       s,t        t        j                  t        j                  dd      S  |j                  t              j                  t        j                  | k(        j                         }|st        d      S d}d|j                   d|j                   d	}t        | ||       d {    t        t        j                   d
dd      S 7 "# t"        $ r}t%        ddt'        |             d }~ww xY 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es         '/var/www/html/answerous/routers/auth.pyretrieveTokenr?      s5    #P $  xxU+"77$996  288D>((u)<=CCED$1  /G"499+-_`d`j`j_k  ls  tLU7<888"..!Z  9  Poc!fX4NOOPs^   D6D D6AD &D6'AD 7D68/D 'D
(!D 	D6
D 	D3D..D33D6z	/registerr:   c                 Z  K   	 | j                   r| j                   j                         nd}| j                  r| j                  j                         nd}| j                  r| j                  j                         nd}| j                  r| j                  j                         nd}| j
                  r| j
                  j                         nd}| j                  r| j                  j                         nd}t        |dd      rt        d      S t        j                  t        |      s,t        t        j                  t        j                  dd	      S  |j                  t               j#                  t         j                  |k(        j%                         }|rt        d
      S t'               }	||	z   }	t!        j(                  |	      }
t+        j,                  d       dt/        j0                          }t!        ||| j                  r|nd| j                  r|nd||
||	t2        t4        
      } |j6                  |        |j8                           |j:                  |       t*        j<                  j?                  tA        tB              tA        |	      z         s.t+        jD                  tA        tB              tA        |	      z          t*        j<                  j?                  tA        tF              tA        |	      z         s.t+        jD                  tA        tF              tA        |	      z          tI        tJ              }tM        tJ        d|jN                  d|      } |j6                  |        |j8                           |j:                  |       |dk(  r4d}d|j                    d|jP                   d}tS        |||       d {    tU        dtV        jX                  j[                  |      j]                               S 7 ;# t^        $ r}ta        ddtA        |             d }~ww xY 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-
r4   r   org_idorg_nameplanpassword_hashr5   	user_codeallocated_storagefolder_limitr   No)r4   	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)   )1r4   r,   r   rK   rL   rM   welcome_emailvalidate_string_lengthr+   r-   r.   r/   r   r   r0   r1   r   r2   r3   generate_random_texthash_passwordosgetenvuuiduuid4r   r   addcommitrefreshpathexistsr9   	DB_FOLDERmakedirsUPLOAD_FOLDERreplace_special_charactersr   r   rT   r5   r6   successReponseschemasUserResponsefrom_ormdictr8   r   )r:   r   r4   r   rK   rL   rM   rX   db_userrandom_texthashed_passwordr5   new_userrV   
new_folderr;   r<   r=   s                     r>   register_userrs   B   s`    LV$(IItyy 2&*jj

  "b(,""$,0MM4==&&(r$(IItyy 26:6H6H**002e!$q, %  xxU+"77$995  "((4.''

e(;<BBD ^  +,{*,,[9IIn-.a

~>#{{V#'==xb)! 9/
 	x		

8ww~~c)nS-==>KKIs;'778ww~~c-0[1AABKKM*3{+;;<3NC&&+

 	z		

:E!7G"8==/  2A  BJ  BP  BP  AQ  QN	  O	LU7<888^  ))(388:
 	
 9  V6KCPQF84TUUVsb   P+DP P+AP P+AP "P+#H P O?:P >P+?P 	P(
P##P((P+z/addcredentialsc                   K   |j                   }t        j                  ||      }	 | j                  r| j                  j	                         nd}| j
                  r| j
                  j	                         nd}| j                  r| j                  j	                         nd}| j                  r| j                  j	                         nd}| j                  r| j                  j	                         nd}	|st        d      S  |j                  t              j                  t        j                  |k(        j                         }
t        |
j                         t        |j                         |
st        d      S |
j                  |j                  k7  rt        d      S |j                  }t!        |dd      rt        d      S t"        j%                  t&        |      s,t)        t*        j,                  t*        j,                  d	d
      S  |j                  t              j                  t        j
                  |k(        j                         }|rt        d      S t/               }t        j0                  |      }t3        j4                  d       dt7        j8                          }t        ||| j                  r|nd| j                  r|nd||||j:                  t<        t>        
      } |j@                  |        |jB                           |jD                  |       tG        dtH        jJ                  jM                  |      jO                               S # tP        $ r}tS        ddtU        |             d }~ww xY ww)NrA   rC   zOrganization ID is requiredzOrganization ID does not existz7Organization ID does not match with the organization IDrD   rE   rF   rG   r!   r#   zEmail already registered.rH   rI   rB   rJ   z2User successfully created with this email address.r(   rW   r)   )+rt   authget_current_userr4   r,   r   rK   rM   rX   r+   r1   r   r2   r3   printrL   rY   r-   r.   r/   r   r   r0   rZ   r[   r\   r]   r^   r_   rO   r   r   r`   ra   rb   ri   rj   OrgUserResponserl   rm   r8   r   r9   )r:   rt   r   r5   org_datar4   r   rK   rM   rX   user_orgrL   rn   ro   rp   rq   r=   s                    r>   add_userr|      s    ##E$$R/H^V$(IItyy 2&*jj

  "b(,""$$(IItyy 26:6H6H**002e -   rxx~,,T[[F-BCIIKHhoohoo 0  __/ I   ((H!$q, %  xxU+"77$995  "((4.''

e(;<BBD +  +,,,[9IIn-.a

~>#{{V#'==xb)(( 9/
 	x		

84 @##,,X6;;=
 	
  V6KCPQF84TUUVsu   #M9CM :M9;A:M 5M96#M M9#M =M9>AM M9AM M9C9M M9	M6M11M66M9z/detailc                    K   | j                   }t        j                  ||      }t        dt        j
                  j                  |      j                               S w)NzUser details retrived.)rt   rv   rw   ri   rj   rk   rl   rm   )rt   r   r5   	user_datas       r>   user_detailr      sP     ##E%%b%0I$  )))499;
 
s   AAz/listc                 ~  K   | j                   }t        j                  ||      }	 |j                  r |j                  t
              j                  t
        j                  |j                  k(        j                  t
        j                  |j                  k7        j                         }|D cg c]!  }t        j                  j                  |      # }}t        d|D cg c]  }|j                          c}      S t        d      S c c}w c c}w # t        $ r}t!        ddt#        |             d }~ww xY ww)NzUsers retrieved successfullyz)This account is not organization account.r(   Something went wrong: r)   )rt   rv   rw   rK   r1   r   r2   rT   allrj   ry   rl   ri   rm   r+   r8   r   r9   )rt   r   r5   r~   usersr:   r=   s          r>   
list_usersr     s    ##E%%b%0IWBHHTN))$++9I9I*IJQQRVR^R^bkbsbsRstxxzENSTU0099%@TIT!.)233 
 !;  U 4  W6LSQRVH4UVVWsS   #D=BD .&D	D  D
7D =D=>
D D=	
D 	D:D55D::D=z/remove/{user_email}
user_emailc                 f  K   |j                   }t        j                  ||      }	 | st        d      S | j	                         } |j
                  t              j                  t        j                  |k(        j                         }|st        d      S |j                  |j                  k7  rt        d      S  |j                  |        |j                          t        t        j                  t        j                  dd      S # t         $ r}t#        ddt%        |       	      d }~ww xY ww)
Nr   User does not exist.z*User does not belong to your organization.zUser removed successfully.r!   r#   r(   r   r)   )rt   rv   rw   r+   r,   r1   r   r2   r   r3   rK   deletera   r   r   r7   r8   r   r9   )r   rt   r   r5   r~   r   r:   r=   s           r>   remove_userr     s    ##E%%b%0IW $    "rxx~$$TZZ5%89??A &  ;;)*** <  			$		** ,,7
 	
  W6LSQRVH4UVVWsL   #D1D D1A D D1#D 7D18AD D1	D.D))D..D1z/shareshare_folderc                 V  K   |j                   }t        j                  ||      }	 | j                  st	        d      S  |j
                  t              j                  t        j                  | j                  k(        j                  t        j                  |j                  k(        j                         }|st	        d      S | j                  st	        d      S | j                  j                         }| j                  j                         }| j                  r| j                  j                         nd}t        j                  t         |      s,t#        t$        j&                  t$        j&                  dd      S |dk(  r |j
                  t(              j                  t(        j                  | j                  k(        j                  t(        j                  |k(        j                         }	|	rt	        d      S t)        || j                  |r|nd	
      }
 |j*                  |
        |j,                           |j.                  |
       t1        dt2        j4                  j7                  |
      j9                               S |dk(  r |j
                  t(              j                  t(        j                  | j                  k(        j                  t(        j                  |k(        j                         }|rO |j:                  |        |j,                          t#        t$        j<                  t$        j<                  dd      S t#        t$        j<                  t$        j<                  dd      S t	        d      S # t>        $ r}tA        ddtC        |             d }~ww xY 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.rA   )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)   )"rt   rv   rw   r   r+   r1   r   r2   rT   r3   r   r,   r   accessr-   r.   r/   r   r   r0   r   r`   ra   rb   ri   rj   SharedFolderResponserl   rm   r   r7   r8   r   r9   )r   rt   r   r5   r:   folder_existr   r   access_typeis_existrU   shared_folderr=   s                r>   r   r   5  sv     ##E  U+DFW%% %   rxx'..v/?/?<CYCY/YZaabhbpbptx  uA  uA  cA  B  H  H  J +  !! $  ""((*#006685A5H5Hl))//1fxxU+"77$996  & rxx-44\5K5K|OeOe5efmmnz  oA  oA  EJ  oJ  K  Q  Q  SH$J  "&00/;|F
 BFF6NBIIKBJJv!B,,55f=BBD  H$$BHH\299,:P:PT`TjTj:jkrrs  tF  tF  JO  tO  P  V  V  XM		-(		# & 2 2"("4"4#^  $ & 2 2"("4"4#^  !Q   W6LSQRVH4UVVWs   #N)M? N)BM? N)M? N)B!M? :N);B M? ;N)<BM? N)CM? N)+M? 3N)4
M? >N)?	N&N!!N&&N)z/historydoc_idc                   K   |j                   }t        j                  ||      }|r|j                         nd}	 | st	        d      S |st	        d      S  |j
                  t              j                  t        j                  |k(        j                  t        j                  |j                  k(        j                         }|st	        d      S  |j
                  t              j                  t        j                  |j                  k(        j                  t        j                  | k(        j                         }|D cg c]!  }t        j                   j#                  |      # }	}|	st%        dg       S t%        d|	D 
cg c]  }
|
j'                          c}
      S c c}w c c}
w # t(        $ r}t+        ddt-        |       	      d }~ww xY ww)
NrA   zPlease select document request.r   r   zNo any document found.zHistory retrieved successfullyr(   r   r)   )rt   rv   rw   r,   r+   r1   r   r2   r   rK   r3   r   rT   r   r   rj   ChatHistoryResponserl   ri   rm   r8   r   r9   )r   r   rt   r   r5   r:   	chat_userchat_historychats	chat_datachatr=   s               r>   r   r     s     ##E  U+D"EKKMEW 1   $  BHHTN))$***=>EEdkkUYU`U`F`aggi	 &   rxx,33K4G4G9K\K\4\]ddepewew  |B  fB  C  G  G  INZ[UW0099%@[	[!(  ,%./TTYY[/
 	
 \ 0 W6LSQRVH4UVVWsx   7GF) GF) GA:F) GA2F) &F'F) 6G7
F) F$
F) G
F) )	G2GGG):r\   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.schemasrj   db_config.authrv   datetimer   dependencies.helperdotenvr   routersecurityr]   r   r   r9   re   rg   r   r/   postrk   get_dbr?   
UserCreaters   r|   getr   r   r   r   r   r        r>   <module>r      s   	  L L _ _ * "  D D #   ! 	< %BII&AB  ryy!78 			)$%c)	IBIIn-.s2+,A[)=)=>%)#Ygbii>P $Ps $PG $P ?$PN [)=)=>@G		@R MVg00 MVg MV ?MV` VG$8$89Y`aiYj  |C  DF  DM  DM  |N bV++ bV:V bVqx bV :bVH IBI(BSdklnluludv 
#? 
Za 
 
 GAHARbijljsjsbt W"> WX_ W W$ %&SZ[cSdt{|~  }F  }F  uG W# W4P Wjq W 'W> Xgnowgx  IP  QS  QZ  QZ  I[ KWW%9%9 KWHd KW  F KW KWZ Zs)c070A"))$	(W(W(W .(W 		(W (Wr   