
    Bh1                        d dl mZ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Zd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d d	l 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+  e       Z, e
       Z- e         ej\                  d       Z/ e0 ej\                  d            dz   Z1 e0 ej\                  d            dz   Z2 e       Z3e,ji                  d       ed       ed       ed       ed       ed       ee-      fdede5de0de0de0defd       Z6e,jo                  d       ee-      fde5de)jp                  defd       Z9e,ju                  d       ee-      fde5defd       Z;e,jy                  d e)jz                  !       ee-      fde5defd"       Z>e,jy                  d#      d$e0fd%       Z?d*d&e0d'e0d(e5fd)Z@y)+    )
UploadFileFileForm	APIRouterDependsHTTPExceptionstatus)OAuth2PasswordRequestForm
HTTPBearerHTTPAuthorizationCredentials)JSONResponse)load_dotenvN)OpenAI)HybridSearch)	S3Service)*)process_document_celery)AsyncResult)UserFolder	DocumentsChatHistoryCOLLECTION_NAMEDB_PATH/STORAGE_PATHz/add.
doc_select	folder_iddoc_namedoc_urlmetadatacredentialsc                   K   t        j                         }|j                  }t        j                  ||      }|r	 t        j                  |      }| d k(  r|st        d      S | r| j                  s|st        d      S |j                  t              j                  t        j                  |j                  k(        j                  t        j                  |k(        j                         }	|	st        d      S t!        t"              t!        |j$                        z   dz   t!        |	j&                        z   }
t)        j*                  |
d       	 | j                  rt(        j,                  j/                  |
| j                        }t(        j,                  j1                  | j                        d   }t3        |d	      5 }|j5                  | j7                          d {          d d d        | j8                  j;                  d
       t(        j,                  j1                  | j                        d
   }nt(        j,                  j=                  |      j?                  d      d   }t(        j,                  j1                  |      d   }tA        |      }t(        j,                  j/                  |
| |       }tC        ||      }|jD                  dk(  s|jD                  dk(  rFt        j                  |jF                        }|jI                  d      }t        ||jD                        S tA        |      }tK               }|jM                  |
|| r| nd        |
 d| | }|jO                  |      }|rWtQ        ||||jS                  d      |d|r|nd       }|jU                  |       |jW                          |jY                  |       t[        j\                  |||||
||j$                  t^        |	j&                  j`                  
      }|r|j`                  r|j                  tP              j                  tP        j`                  |j`                  k(        j                         }|jb                  |_2        |jW                          |j                  tP              j                  tP        j`                  |j`                  k(        j                         }|jY                  |       |j`                  |||jb                  |jf                  d}ti        d|      S y y # t
        j                  $ r t        d      cY S w xY w7 ]# 1 sw Y   YxY w# tj        $ r}|j                  tP              j                  tP        j`                  j`                  k(        j                         }d|_3        |jW                          |jm                          to        ddt!        |             d }~ww xY ww)NzInvalid JSON format in metadataz7Please provide either a document file or a document URLz8Please provide either a document file or a document URL.zFolder ID does not exist.r   Texist_ok   wbr   .    message
Processing)r   r    sanitized_namedocument_typer   
doc_statusdoc_metadata)doc_idr   r    task_idr0   z1Document uploaded and is in queue for processing.FailedzFailed to save file: status_codedetail)8dbaseSessionLocalr"   authget_current_userjsonloadsJSONDecodeErrorerrorResponsefilenamequeryr   filteruser_idr   firststrUPLOAD_FOLDER	user_coder.   osmakedirspathjoinsplitextopenwritereadfileseekbasenamesplitreplace_special_charactersdownload_filer6   bodygetr   upload_objectget_object_urlr   lstripaddcommitrefreshr   delaycollection_namer2   idr3   r0   successReponse	Exceptionrollbackr   )r   r   r   r    r!   r"   dbtokenuserfolder
upload_dirdocument_pathfile_extensionfdocument_namer.   download_responseparsed_bodyr,   
s3_servicefile_keydocument_urlnew_documenttaskupdate_statusupdated_datadocument_dataes                               ,/var/www/html/answerous/routers/chromadoc.py
upload_pdfry       s     
			B##E  U+D	zz(+H T'I 	 *--gWXXXXf$$V^^t||%CDKKFL\L\`iLijpprF899]#C$77;C@U@U<VVJKK
T*MVGGLLZ5H5HIMWW--j.A.AB1ENmT* 1ajoo//01 OO  #GG,,Z-@-@A!DMGG,,W5;;C@DMWW--g6q9N7FNGGLL7GGW5XYM -g} E !,,37H7T7TX[7["jj):)?)?@%//)4$W->-J-JKK3MB[
  ^:Z[_` \>"2>2BC!00:$!$!/,33C8#'*2hL FF< IIKJJ|$ ',,]M>[ghrt|  C  M  M  N]  _e  _t  _t  uA  uH  uH  IL//HHY/66y7G7G<K^K^7^_eegM"&''M!IIK88I.55i6F6F,J]J]6]^ddfLJJ|$&--#&77)44M "C  0<S ## 	 5 	4 01 1F  V+2293C3C|GZGZ3Z[aac!) 
		
6KCPQF84TUUVs   9W&T C<W&A.U <T;T8
T;$EU %W&&G+U W&T52W&4T55W&8T;;U U 	W#BWW##W&z/rename/{doc_id}r2   datac                 `  K   t        j                         }|j                  }t        j                  ||      }	 	 |j
                  r|j
                  j                         nd}|st        d      S |j                  t              j                  t        j                        j                  t        j
                  |k(        j                  t        j                  |j                  k(        j                         }|rt        d      S |j                  t              j                  t        j                   | k(        j                         }|st        dd      S |j
                  |_        |j#                          |j                  t              j                  t        j                   | k(        j                         }	|j%                  |	       t'        dt(        j*                  j-                  |	      j/                               S # t0        $ r}
t3        ddt5        |
       	      d }
~
ww xY ww)
N zDocument name is required.z,Cannot update document with duplicate names.Document does not exist.  zDocument successfully updated.r+   Something went wrong: r5   )r8   r9   r"   r:   r;   r   stripr?   rA   r   rK   rg   rB   r   rC   rD   r2   r\   r]   ra   schemasDocumentResponsefrom_ormdictrb   r   rE   )r2   rz   r"   rd   re   rf   rl   existing_docdocru   rw   s              rx   updateDocNamer      s    				B##E  U+D W	 26++-B ,  xx	*//	0@0@AHHI[I[_lIlmttu{  vD  vD  HL  HT  HT  vT  U  [  [  ] >  hhy!(()9)9V)CDJJL *  }}
		xx	*11)2B2Bf2LMSSU


< ,$$--l;@@B
 	

  W6LSQRVH4UVVWsO   7H.5H /H.0BH H.AH H.B+H H.	H+H&&H++H.z/delete/{doc_id}c                   K   t        j                         }|j                  }t        j                  ||      }	 |j                  t              j                  t        j                  | k(        j                         }|st        dd      S |j                  t              j                  t        j                  |j                  k(        j                         }|j                  rt        t        ||j                         }|j#                  |j                         t%        j&                  d      dz   t)        |j*                        z   dz   t)        |j                         z   }| d|j                    d|j,                   }		 t%        j.                  |	       t1        d|	 d       t9               }|j;                  |	       |j=                  |       |j?                          tA        dd       S # t2        $ r t1        d|	 d       Y bt4        $ r t1        d	|	 d
       Y {t6        $ r}
t1        d|
        Y d }
~
d }
~
ww xY w# t6        $ r}
tC        ddt)        |
             d }
~
ww xY ww)Nr}   r~   r   r   r(   zFile 'z' has been deleted.z' not found.z%Permission denied: Unable to delete 'z'.zAn error occurred: zDocument deleted successfullyr+   r   r5   )"r8   r9   r"   r:   r;   rA   r   rB   r2   rD   r?   r   r   document_uuidr   r_   r.   delete_collection_by_uuidrH   getenvrE   rG   r/   removeprintFileNotFoundErrorPermissionErrorrb   r   delete_filedeleter\   ra   r   )r2   r"   rd   re   rf   documentrg   hsUPLOAD_PATH	file_pathrw   ro   s               rx   deleteDocumentr      s%    				B##E  U+D'W88I&--i.>.>&.HIOOQ *  &!(()9)9X=O=O)OPVVX!!odF4I4IJB(()?)?@ ))N3C7DNN8KKCOPSTZTiTiPjjK&-q)@)@(A8CYCYBZ[I	1		)$yk)<=> #J""9-
		(
		+
 	
 % 8yk67" M=i[KL 1+A3/001  W6LSQRVH4UVVWsy   7I,AI 
I,C4I  $G, $AI +I,,H?I H?I H?'H:5I :H??I 	I)I$$I))I,z/list/{folder_id})response_modelc                   K   t        j                         }|j                  }t        j                  ||      }	 |j                  t              j                  t        j                        j                  t        j                  |j                  k(        j                  t        j                  | k(        j                         }|st        |      dk(  rt        d      S |D cg c]!  }t         j"                  j%                  |      # }}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)Nr   zNo any document found.z Documents retrieved successfullyr+   r   r5   )r8   r9   r"   r:   r;   rA   r   rK   rg   rB   r   rC   r   alllenr?   r   r   r   ra   r   rb   r   rE   )	r   r"   rd   re   rf   	documentsr   rv   rw   s	            rx   get_documentsr      sO    				B##E  U+DWHHY',,Y-=-=>EEfnnX\XdXdFdellmv  nA  nA  EN  nN  O  S  S  U	S^q0 (  ZccXW55>>xHcMc!21>?X?  d @ W6LSQRVH4UVVWsS   7E'B$D= E'D= #&D3	D= D8
,D= 2E'3
D= =	E$EE$$E'z/task/{task_id}r3   c                 z   K   t        |       }|j                  t        |j                        |j                  dS w)N)r	   result	traceback)r   r	   rE   r   r   )r3   task_results     rx   get_task_statusr      s:     g&K$$k(() ** s   9;url	save_path
chunk_sizec                    	 | j                  d      st        d      S t        j                  | dd      }|j	                          t        |j                  j                  dd            }t        j                  t        j                  j                  |      d       t        |d	      5 }|j                  |
      D ]  }|s|j                  |        	 ddd       t        d|      S # 1 sw Y   xY w# t        j                  j                   $ r"}t        dt#        |       d      cY d}~S d}~wt$        $ r}t        d| d      cY d}~S d}~ww xY w)a  
    Downloads a file from the specified URL and saves it to the given path.
    
    Args:
        url (str): The URL of the file to download.
        save_path (str): The local path where the file should be saved.
        chunk_size (int, optional): The chunk size for streaming data. Defaults to 1024.
    
    Returns:
        str: The path of the saved file.
    
    Raises:
        ValueError: If the URL is invalid or the response status is not successful.
        Exception: For other errors during download or file saving.
    )zhttp://zhttps://z9Invalid URL. URL must start with 'http://' or 'https://'.T
   )streamtimeoutzcontent-lengthr   r$   r'   )r   Nr|   z"Failed to download file from URL: r*   z)An error occurred while saving the file: r+   )
startswithr?   requestsrW   raise_for_statusintheadersrH   rI   rJ   dirnamerM   iter_contentrN   ra   
exceptionsRequestExceptionrE   rb   )r   r   r   response
total_sizerP   chunkrw   s           rx   rU   rU   	  s3   "R~~56 #\^^ <<D"=!!# ))--.>BC
 	BGGOOI.> )T" 	&d!..*.E &JJu%&	&
 b++	& 	& // PA#a&J3OO RHLSQQRsS   C8 BC8 +C,C,C8 ,C51C8 8ED2,E2E>EEE)i   )Afastapir   r   r   r   r   r   r	   fastapi.securityr
   r   r   fastapi.responsesr   dotenvr   r   rH   r<   uuiddocx2pdfopenair   dependencies.HybridSearchr   dependencies.awsutilsr   dependencies.helpercelery_workerr   celery.resultr   db_config.databasedatabaser8   db_config.modelsr   r   r   r   db_config.schemasr   db_config.authr:   routersecurityr   r_   rE   	DB_FOLDERrF   openai_clientpostr   ry   putDocumentr   r   r   rW   DocumentListResponser   r   rU        rx   <module>r      sI   U U U _ _ *   	     2 + ! 1 % " A A #  
< RYY012			)$%c)	IBIIn-.s2hV!$Z#YIt*J070AqVqVqV qV 	qV
 qV .qV qVh ipqyiz $W $W7+;+; $WJf $W  $WL !"RYZbRc +W +W3O +W #+W\ 0L0LMT[\dTe W3 W5Q W NW& 3  ,Rs ,Rs ,R ,Rr   