Ë
    Ç) iW�  ã            	       ó”  — d dl mZmZmZmZmZmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZ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mZ d d	lmZ d d
lmZm Z m!Z! d dl"m#Z#  eddg¬«      Z$ eejJ                  «      Z&e&ejN                     Z(e(d   Z) G d„ de«      Z* G d„ de«      Z+ G d„ de«      Z, G d„ de«      Z- G d„ de«      Z.e$j_                  dd¬«      de+fd„«       Z0e$jc                  d«      d„ «       Z2e$jc                  d «      d!e3fd"„«       Z4e$jk                  d «      d!e3de.fd#„«       Z6e$jo                  d «      d!e3fd$„«       Z8e$j_                  d%d¬«      de-fd&„«       Z9e$jc                  d%«      d'„ «       Z:e$jc                  d(«      d!e3fd)„«       Z;e$jk                  d(«      d!e3de-fd*„«       Z<e$jo                  d(«      d!e3fd+„«       Z=e$j_                  d,«      de*fd-„«       Z>e$jc                  d.«      d/e3fd0„«       Z? G d1„ d2e«      Z@ G d3„ d4e«      ZAe$j_                  d5d¬«      de@fd6„«       ZBe$jc                  d5«      d7„ «       ZCe$jk                  d8«      d!e3deAfd9„«       ZDe$jo                  d8«      d!e3fd:„«       ZEd d;lFmGZG  G d<„ d=e«      ZHe$jc                  d>«      d?„ «       ZIe$jc                  d@«      d!e3fdA„«       ZJe$j_                  d>«      dBefdC„«       ZKe$jk                  d@«      d!e3dBefdD„«       ZLe$j›                  dE«      d!e3dBefdF„«       ZNe$jo                  d@«      d!e3fdG„«       ZO G dH„ dIe«      ZPe$j_                  dJd¬«      dePfdK„«       ZQe$j_                  dL«       edM«       ed«      fdBedNe3dOee3   fdP„«       ZRe$jc                  dQ«      dcdReSdSeSfdT„«       ZTe$jc                  dU«      dcdOe3dReSdSeSfdV„«       ZUe$jo                  dW«      dOe3fdX„«       ZVe$j_                  dY«       ed«      fdBedZee   fd[„«       ZW G d\„ d]e«      ZXe$jo                  d^«      d_e3deXfd`„«       ZYe$jc                  da«      d_e3fdb„«       ZZy)dé    )Ú	APIRouterÚHTTPExceptionÚDependsÚstatusÚ
UploadFileÚFileÚRequestÚForm)ÚJSONResponseÚFileResponse)Ú	BaseModel)ÚOptionalÚListÚDictÚAnyÚUnion)ÚMongoClient)ÚObjectIdN)Údatetime)Úsettings)Úverify_passwordÚcreate_access_tokenÚget_password_hash)Úget_assistant_servicez/adminÚAdmin)ÚprefixÚtagsÚadminsc                   ó"   — e Zd ZU eed<   eed<   y)ÚLoginRequestÚemailÚpasswordN©Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__© ó    ú@/var/www/html/Whatsapp_Customer_Support_Chatbot/src/api/admin.pyr    r       s   … ØƒJØ„Mr*   r    c                   ó6   — e Zd ZU eed<   eed<   dZee   ed<   y)ÚPermissionBaseÚnameÚcodeNÚdescription)r$   r%   r&   r'   r(   r0   r   r)   r*   r+   r-   r-      s   … Ø
ƒIØ
ƒIØ!%€K�˜#‘Ô%r*   r-   c                   ód   — e Zd ZU dZee   ed<   eed<   dZeed<   dZ	eed<   dZ
eed<   dZeed<   y)	ÚRolePermissionNÚ	module_idÚmodule_nameFÚviewÚaddÚeditÚdelete)r$   r%   r&   r3   r   r'   r(   r5   Úboolr6   r7   r8   r)   r*   r+   r2   r2   !   s>   … Ø#€Iˆx˜‰}Ó#ØÓØ€Dˆ$ÓØ€CˆÓØ€Dˆ$ÓØ€FˆDÔr*   r2   c                   óJ   — e Zd ZU eed<   dZee   ed<   dZeed<   e	e
   ed<   y)ÚRoleBaseÚroleNr0   FÚ	is_deleteÚ
permission)r$   r%   r&   r'   r(   r0   r   r=   r9   r   r2   r)   r*   r+   r;   r;   )   s*   … Ø
ƒIØ!%€K�˜#‘Ó%Ø€IˆtÓØ�^Ñ$Ô$r*   r;   c                   óJ   — e Zd ZU dZee   ed<   dZee   ed<   dZee   ed<   y)ÚPermissionUpdateNr.   r/   r0   )	r$   r%   r&   r.   r   r'   r(   r/   r0   r)   r*   r+   r@   r@   /   s,   … Ø€Dˆ(�3‰-ÓØ€Dˆ(�3‰-ÓØ!%€K�˜#‘Ô%r*   r@   z/permissionséÉ   )Ústatus_codeÚdatac              ƒ   óø   K  — | j                  «       }t        d   j                  |«      }t        |j                  «      |j                  d«      |j                  d«      |j                  d«      dœ}ddd|d	œiS ­w)
NÚpermissionsr.   r/   r0   ©Úidr.   r/   r0   rC   rA   z Permission created successfully.)r   ÚmessageÚpermission_details)ÚdictÚdbÚ
insert_oner'   Úinserted_idÚget)rC   ÚdocÚresultÚresponse_datas       r+   Úcreate_permissionrR   6   s|   è ø€ à
�)‰)‹+€CÜ�Ñ×)Ñ)¨#Ó.€Fô �&×$Ñ$Ó%Ø—‘˜“Ø—‘˜“Ø—w‘w˜}Ó-ñ	€Mð 	ØØ9Ø"/ñ
ðð ùó   ‚A8A:c            	   ƒ   óô   K  — g } t         d   j                  «       D ]Q  }| j                  t        |d   «      |j	                  d«      |j	                  d«      |j	                  d«      dœ«       ŒS ddd	| d
œiS ­w)NrE   Ú_idr.   r/   r0   rF   rC   éÈ   z#Permissions retrieved successfully.)r   rH   rE   )rK   ÚfindÚappendr'   rN   )ÚpermsÚps     r+   Úget_all_permissionsr[   K   sƒ   è ø€ à€EÜ�Ñ×#Ñ#Ó%ò ˆØ�‰Ü�a˜‘h“-Ø—E‘E˜&“MØ—E‘E˜&“MØŸ5™5 Ó/ñ	
õ 	ðð 	ØØ<Ø ñ
ðð ùs   ‚A6A8z/permissions/{id}rG   c              ƒ   óþ   K  — t         d   j                  dt        | «      i«      }|st        dd¬«      ‚t	        |d   «      |j                  d«      |j                  d«      |j                  d«      d	œ}d
dd|dœiS ­w)NrE   rU   é”  úPermission not found©rB   Údetailr.   r/   r0   rF   rC   rV   z"Permission retrieved successfully.©r   rH   r>   ©rK   Úfind_oner   r   r'   rN   )rG   ÚpermÚ	perm_datas      r+   Úget_permission_by_idrf   ^   s‹   è ø€ äˆmÑ×%Ñ% u¬h°r«lÐ&;Ó<€DÙÜ¨Ð4JÔKÐKô �$�u‘+ÓØ—‘˜Ó Ø—‘˜Ó Ø—x‘x Ó.ñ	€Ið 	ØØ;Ø#ñ
ðð ùs   ‚A;A=c              ƒ   ó   K  — |j                  «       j                  «       D ��ci c]  \  }}|€Œ	||“Œ }}}t        d   j                  dt	        | «      id|i«       t        d   j                  dt	        | «      i«      }t        |d   «      |j                  d«      |j                  d«      |j                  d«      dœ}dd	d
|dœiS c c}}w ­w)NrE   rU   ú$setr.   r/   r0   rF   rC   rV   z Permission updated successfully.ra   )rJ   ÚitemsrK   Ú
update_oner   rc   r'   rN   )rG   rC   ÚkÚvÚupdate_datard   re   s          r+   Úedit_permissionrn   s   sÑ   è ø€ à$(§I¡I£K×$5Ñ$5Ó$7×I™D˜A˜q¸1¹=�1�a‘4ÐI€KÑIÜ€}Ñ× Ñ  %¬°"«Ð!6¸ÀÐ8MÔNÜˆmÑ×%Ñ% u¬h°r«lÐ&;Ó<€Dô �$�u‘+ÓØ—‘˜Ó Ø—‘˜Ó Ø—x‘x Ó.ñ	€Ið 	ØØ9Ø#ñ
ðð ùó Jùs   ‚"C¤
C¯C´BCc              ƒ   ó˜   K  — t         d   j                  dt        | «      i«      }|j                  dk(  rt	        dd¬«      ‚ddd	d d
œiS ­w)NrE   rU   r   r]   r^   r_   rC   rV   z Permission deleted successfully.©r   rH   rP   ©rK   Ú
delete_oner   Údeleted_countr   ©rG   rP   s     r+   Údelete_permissionru   ‰   s[   è ø€ ä�Ñ×)Ñ)¨5´(¸2³,Ð*?Ó@€FØ×Ñ˜qÒ Ü¨Ð4JÔKÐKàØØ9Øñ
ðð ùó   ‚AA
z/rolesc              ƒ   óº  K  — | j                  «       }|d   D ]E  }|j                  d«      rŒt        d   j                  d|d   i«      }|rt	        |d   «      |d<   ŒFŒG t        d   j                  |«      }t	        |j                  «      |j                  d«      |j                  d	«      |j                  d
d«      |j                  dg «      D �cg c]s  }t	        |j                  dd«      «      |j                  d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      dœ‘Œu c}dœ}ddd|dœiS c c}w ­w)Nr>   r3   rE   r/   r4   rU   Úrolesr<   r0   r=   FÚ r5   r6   r7   r8   ©r3   r4   r5   r6   r7   r8   ©rG   r<   r0   r=   r>   rC   rA   zRole created successfully.©r   rH   r<   )rJ   rN   rK   rc   r'   rL   rM   )rC   rO   rZ   Úperm_docrP   rQ   s         r+   Úcreate_roler~   ˜   s^  è ø€ à
�)‰)‹+€Cð �Ñò 	ˆØ�u‰u�[Õ!ä˜-Ñ(×1Ñ1°6¸1¸]Ñ;KÐ2LÓMˆHÙÜ!$ X¨e¡_Ó!5��+’ð ð	ô �‰[×#Ñ# CÓ(€Fô �&×$Ñ$Ó%Ø—‘˜“Ø—w‘w˜}Ó-Ø—W‘W˜[¨%Ó0ð —W‘W˜\¨2Ó.ö

ð ô ! §¡ {°BÓ!7Ó8Ø Ÿu™u ]Ó3ØŸ™˜f eÓ,Ø—u‘u˜U EÓ*ØŸ™˜f eÓ,ØŸ%™% ¨%Ó0óò

ñ€Mð& 	ØØ3Ø!ñ
ðð ùò

ùs   ‚*E­B$EÃA8EÅ	Ec               ƒ   ó   K  — g } t         d   j                  «       D ]Ò  }t        |d   «      |j                  d«      |j                  dd«      |j                  dg «      D �cg c]s  }t        |j                  dd«      «      |j                  d	«      |j                  d
d«      |j                  dd«      |j                  dd«      |j                  dd«      dœ‘Œu c}dœ}| j	                  |«       ŒÔ ddd| dœiS c c}w ­w)Nrx   rU   r<   r=   Fr>   r3   ry   r4   r5   r6   r7   r8   rz   ©rG   r<   r=   r>   rC   rV   zRoles retrieved successfully.)r   rH   rx   )rK   rW   r'   rN   rX   )rx   ÚrrZ   Ú	role_datas       r+   Úget_all_rolesrƒ   Å   s   è ø€ à€EÜ�‰[×ÑÓò  ˆä�a˜‘h“-Ø—E‘E˜&“MØŸ™˜{¨EÓ2ð Ÿ™˜|¨RÓ0ö
ð ô "% Q§U¡U¨;¸Ó%;Ó!<Ø#$§5¡5¨Ó#7ØŸE™E &¨%Ó0ØŸ5™5 ¨Ó.ØŸE™E &¨%Ó0ØŸe™e H¨eÓ4óò
ñ	
ˆ	ð  	�‰�YÕð# ð( 	ØØ6Øñ
ðð ùò
ùs   ‚AC>Á!A8C9Ã%C>z/roles/{id}c              ƒ   ó  K  — t         d   j                  dt        | «      i«      }|st        dd¬«      ‚t	        |d   «      |j                  d«      |j                  dd«      |j                  d	g «      D �cg c]s  }t	        |j                  d
d«      «      |j                  d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      dœ‘Œu c}dœ}ddd|dœiS c c}w ­w)Nrx   rU   r]   úRole not foundr_   r<   r=   Fr>   r3   ry   r4   r5   r6   r7   r8   rz   r€   rC   rV   zRole retrieved successfully.r|   rb   )rG   r�   rZ   Úrole_formatteds       r+   Úget_role_by_idr‡   ã   s  è ø€ ä
ˆ7‰×Ñ˜e¤X¨b£\Ð2Ó3€AÙÜ¨Ð4DÔEÐEô �!�E‘(‹mØ—‘�f“Ø—U‘U˜;¨Ó.ð —U‘U˜<¨Ó,ö

ð ô ! §¡ {°BÓ!7Ó8Ø Ÿu™u ]Ó3ØŸ™˜f eÓ,Ø—u‘u˜U EÓ*ØŸ™˜f eÓ,ØŸ%™% ¨%Ó0óò

ñ	€Nð" 	ØØ5Ø"ñ
ðð ùò

ùs   ‚A5DÁ7A8C<
Ã/Dc              ƒ   ó  K  — |j                  «       }|d   D ]E  }|j                  d«      rŒt        d   j                  d|d   i«      }|sŒ5t	        |d   «      |d<   ŒG t        d   j                  dt        | «      id|i«       t        d   j                  dt        | «      i«      }t	        |d   «      |j                  d	«      |j                  d
«      |j                  dd«      |j                  dg «      D �cg c]s  }t	        |j                  dd«      «      |j                  d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      dœ‘Œu c}dœ}ddd|dœiS c c}w ­w)Nr>   r3   rE   r/   r4   rU   rx   rh   r<   r0   r=   Fry   r5   r6   r7   r8   rz   r{   rC   rV   zRole updated successfully.r|   )rJ   rN   rK   rc   r'   rj   r   )rG   rC   rO   rZ   r}   r�   r†   s          r+   Ú	edit_roler‰     s€  è ø€ à
�)‰)‹+€Cð �Ñò 6ˆØ�u‰u�[Õ!Ü˜-Ñ(×1Ñ1°6¸1¸]Ñ;KÐ2LÓMˆHÚÜ!$ X¨e¡_Ó!5��+’ð	6ô €w�K×Ñ˜E¤8¨B£<Ð0°6¸3°-Ô@Ü
ˆ7‰×Ñ˜e¤X¨b£\Ð2Ó3€Aô �!�E‘(‹mØ—‘�f“Ø—u‘u˜]Ó+Ø—U‘U˜;¨Ó.ð —U‘U˜<¨Ó,ö

ð ô ! §¡ {°BÓ!7Ó8Ø Ÿu™u ]Ó3ØŸ™˜f eÓ,Ø—u‘u˜U EÓ*ØŸ™˜f eÓ,ØŸ%™% ¨%Ó0óò

ñ€Nð& 	ØØ3Ø"ñ
ðð ùò

ùs   ‚*F­FÁB.FÃ;A8F Å3Fc              ƒ   ó˜   K  — t         d   j                  dt        | «      i«      }|j                  dk(  rt	        dd¬«      ‚ddd	d d
œiS ­w)Nrx   rU   r   r]   r…   r_   rC   rV   zRole deleted successfully.rp   rq   rt   s     r+   Údelete_roler‹   )  sZ   è ø€ ä�‰[×#Ñ# U¬H°R«LÐ$9Ó:€FØ×Ñ˜qÒ Ü¨Ð4DÔEÐEàØØ3Øñ
ðð ùrv   z/loginc              ƒ   óÆ  K  — t         j                  dd| j                  id| j                  igi«      }|st        ddddd dœi¬«      S t	        | j
                  |d	   «      st        d
dd
dd dœi¬«      S d }|j                  d«      rçt        d   j                  dt        |d   «      i«      }|r¿t        |d   «      |j                  d«      |j                  dd«      |j                  dg «      D �cg c]s  }t        |j                  dd«      «      |j                  d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      dœ‘Œu c}dœ}t        d|j                  d«      xs |j                  d«      i¬«      }ddd|d t        |d   «      |j                  d«      |d   |j                  d!«      |d"œd#œiS c c}w ­w)$Nú$orr!   Úusernamer]   rC   zaccount not found.©r   rH   Úuser©rB   Úcontentr"   é�  zInvalid credentials.Úrole_idrx   rU   r<   r=   Fr>   r3   ry   r4   r5   r6   r7   r8   rz   r€   Úsub)rC   rV   zLogin successful.ÚbearerÚ	full_name)rG   r!   rŽ   r—   r<   )r   rH   Úaccess_tokenÚ
token_typer�   )Úadmins_collectionrc   r!   r   r   r"   rN   rK   r   r'   r   )rC   ÚadminÚ	role_infoÚrole_docrZ   r˜   s         r+   Úloginrž   8  s  è ø€ ä×&Ñ&ØØ�d—j‘jÐ!Ø˜Ÿ™Ð$ð
ð(ó €Eñ ÜØàØ!Ø3Ø ñðô	
ð 		
ô ˜4Ÿ=™=¨%°
Ñ*;Ô<ÜØàØ!Ø5Ø ñðô	
ð 		
ð €IØ‡y�y�ÔÜ�g‘;×'Ñ'¨´¸¸yÑ9IÓ0JÐ(KÓLˆÙä˜( 5™/Ó*Ø Ÿ™ VÓ,Ø%Ÿ\™\¨+°uÓ=ð &Ÿ\™\¨,¸Ó;ö
ð ô &)¨¯©¨{¸BÓ)?Ó%@Ø'(§u¡u¨]Ó';Ø !§¡ f¨eÓ 4Ø Ÿu™u U¨EÓ2Ø !§¡ f¨eÓ 4Ø"#§%¡%¨°%Ó"8óò
ñ	ˆIô" '¨U°E·I±I¸gÓ4FÒ4_È%Ï)É)ÐT^ÓJ_Ð,`Ôa€LàØØ*Ø(Ø"ä˜% ™,Ó'ØŸ™ 7Ó+Ø! *Ñ-Ø"ŸY™Y {Ó3Ø!ññ
ðð ùò
ùs   ‚C0G!Ã2A8G
Å*A7G!z/user/{user_id}Úuser_idc              ƒ   óf  K  — 	 t         j                  dt        | «      i«      }|st        dd¬«      ‚dddt	        |d   «      |j                  d«      |d	   |j                  d
«      |j                  d«      rt	        |j                  d«      «      nd dœiS # t        $ r t        dd¬«      ‚w xY w­w)NrU   r]   úUser not foundr_   rC   rV   z$User details retrieved successfully.r!   rŽ   r—   r”   )r   rH   rG   r!   rŽ   r—   r”   r“   zInvalid User ID format)rš   rc   r   r   r'   rN   Ú	Exception)rŸ   r›   s     r+   Úget_userr£     s¼   è ø€ ðNÜ!×*Ñ*¨E´8¸GÓ3DÐ+EÓFˆÙÜ¨CÐ8HÔIÐIð ØØAÜ˜% ™,Ó'ØŸ™ 7Ó+Ø! *Ñ-ØŸ™ ;Ó/Ø8=¿	¹	À)Ô8Lœ3˜uŸy™y¨Ó3Ô4ÐRVñð

ð 
	
øô ò NÜ¨Ð4LÔMÐMðNüs   ‚B1„BB ÂB1ÂB.Â.B1c                   óJ   — e Zd ZU eed<   eed<   eed<   eed<   dZee   ed<   y)ÚAdminCreater!   rŽ   r"   r—   Nr”   )r$   r%   r&   r'   r(   r”   r   r)   r*   r+   r¥   r¥   –  s$   … ØƒJØƒMØƒMØƒNØ!€GˆX�c‰]Ô!r*   r¥   c                   ór   — e Zd ZU dZee   ed<   dZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   y)ÚAdminUpdateNr!   rŽ   r"   r—   r”   )r$   r%   r&   r!   r   r'   r(   rŽ   r"   r—   r”   r)   r*   r+   r§   r§   �  sH   … Ø€Eˆ8�C‰=ÓØ"€Hˆh�s‰mÓ"Ø"€Hˆh�s‰mÓ"Ø#€Iˆx˜‰}Ó#Ø!€GˆX�c‰]Ô!r*   r§   z/usersc           
   ƒ   ó>  K  — t         j                  dd| j                  id| j                  igi«      rt	        ddddd dœi¬«      S | j                  «       }t        | j                  «      |d	<   d }|j                  d
«      r@	 t        d   j                  dt        |d
   «      i«      }|r|j                  d«      }nd |d
<   t         j                  |«      }dddt        |j                  «      |d   |d   |d   |j                  d
«      |dœdœiS #  d |d
<   Y ŒXxY w­w)Nr�   r!   rŽ   r“   rC   z!Email or Username already exists.r�   r‘   r"   r”   rx   rU   r<   rA   z Admin user created successfully.r—   ©rG   r!   rŽ   r—   r”   Ú	role_name)rš   rc   r!   rŽ   r   rJ   r   r"   rN   rK   r   rL   r'   rM   )rC   Ú	admin_docrª   r<   rP   s        r+   Úcreate_adminr¬   ¤  sF  è ø€ ô ×!Ñ! 5¨G°T·Z±ZÐ+@À:ÈtÏ}É}ÐB]Ð*^Ð"_Ô`ÜØàØ!ØBØ ñðô	
ð 		
ð —	‘	“€IÜ-¨d¯m©mÓ<€IˆjÑð €IØ‡}�}�YÔð		)Ü�g‘;×'Ñ'¨´¸À9Ñ9MÓ0NÐ(OÓPˆDÙØ!ŸX™X fÓ-‘ð )-�˜9Ñ%ô ×)Ñ)¨)Ó4€Fð 	ØØ9ä˜&×,Ñ,Ó-Ø" 7Ñ+Ø% jÑ1Ø& {Ñ3Ø$Ÿ=™=¨Ó3Ø&ññ
ðð øð	)Ø$(ˆY�yÓ!üs   ‚B DÂ?D ÃADÄDÄDc            
   ƒ   óN  K  — g } 	 t         d   j                  «       D �ci c]!  }t        |d   «      |j                  dd«      “Œ# }}t        j                  «       D ]±  }|j                  d«      dk(  rŒ|j                  d«      }|r't        |«      |v r|j                  t        |«      «      nd }| j                  t        |d   «      |j                  d«      |j                  d«      |j                  d	«      |rt        |«      nd |d
œ«       Œ³ ddd| dœiS c c}w #  i }Y ŒÛxY w­w)Nrx   rU   r<   ÚUnknownrŽ   r›   r”   r!   r—   r©   rC   rV   z#Admin users retrieved successfully.)r   rH   Úusers)rK   rW   r'   rN   rš   rX   )r¯   r�   Ú	roles_mapÚuÚr_idÚr_names         r+   Úget_all_adminsr´   Õ  s!  è ø€ à€EðÜFHÈÁk×FVÑFVÓFXÖYÀ”S˜˜5™“] A§E¡E¨&°)Ó$<Ñ<ÐYˆ	ÐYô ×#Ñ#Ó%ò ˆà�5‰5�Ó Ò'Øà�u‰u�YÓˆÙ-1´c¸$³iÀ9Ñ6L�—‘œs 4›yÔ)ÐRVˆà�‰Ü�a˜‘h“-Ø—U‘U˜7“^ØŸ™˜jÓ)ØŸ™˜{Ó+Ù$(”s˜4”y¨dØñ
õ 	ðð" 	ØØ<Øñ
ðð ùò) ZøðØŠ	üs.   ‚D%†D Ÿ&DÁD ÁCD%ÄD ÄD"Ä D%z/users/{id}c              ƒ   óx  K  — |j                  «       j                  «       D ��ci c]  \  }}|€Œ	||“Œ }}}d|v rt        |d   «      |d<   d|v r1|d   r,	 t        d   j	                  dt        |d   «      i«      sd |d<   t        j                  dt        | «      id|i«      }|j                  dk(  rt        dd¬	«      ‚t        j	                  dt        | «      i«      }d }|j                  d«      r:	 t        d   j	                  dt        |d   «      i«      }|r|j                  d
«      }dddt        |d   «      |j                  d«      |j                  d«      |j                  d«      |j                  d«      rt        |j                  d«      «      nd |dœdœiS c c}}w #  d |d<   Y �Œ/xY w#  Y ŒŠxY w­w)Nr"   r”   rx   rU   rh   r   r]   r¡   r_   r<   rC   rV   z Admin user updated successfully.r!   rŽ   r—   r©   r�   )rJ   ri   r   rK   rc   r   rš   rj   Úmatched_countr   rN   r'   )	rG   rC   rk   rl   rm   rP   r±   rª   r�   s	            r+   Úupdate_adminr·   ö  s¿  è ø€ à$(§I¡I£K×$5Ñ$5Ó$7×I™D˜A˜q¸1¹=�1�a‘4ÐI€KÑIð �[Ñ Ü"3°KÀ
Ñ4KÓ"Lˆ�JÑð �KÑ K°	Ò$:ð	+Ü�w‘K×(Ñ(¨%´¸+ÀiÑ:PÓ1QÐ)RÔSØ*.�˜YÑ'ô ×)Ñ)¨5´(¸2³,Ð*?À&È+ÐAVÓW€FØ×Ñ˜qÒ Ü¨Ð5EÔFÐ	Fä×"Ñ" E¬8°B«<Ð#8Ó9€Að €IØ‡u�uˆYÔð	Ü�G‘×%Ñ% u¬h°q¸±|Ó.DÐ&EÓFˆQÙ˜qŸu™u V›}�9ð 	ØØ9ä˜!˜E™(“mØŸ™˜w›ØŸE™E *Ó-ØŸU™U ;Ó/Ø45·E±E¸)Ô4Dœ3˜qŸu™u YÓ/Ô0È$Ø&ññ
ðð ùó9 Jøð	+Ø&*ˆ[˜Ô#ûð 	‘üsF   ‚"F:¤
F ¯F ´!F:Á+F& ÂA2F:Ã49F3 Ä-A9F:Æ&F0Æ-F:Æ3F7Æ5F:c              ƒ   ó’   K  — t         j                  dt        | «      i«      }|j                  dk(  rt	        dd¬«      ‚dddd d	œiS ­w)
NrU   r   r]   r¡   r_   rC   rV   z Admin user deleted successfully.rp   )rš   rr   r   rs   r   rt   s     r+   Údelete_adminr¹   #  sV   è ø€ ä×)Ñ)¨5´(¸2³,Ð*?Ó@€FØ×Ñ˜qÒ Ü¨Ð4DÔEÐEàØØ9Øñ
ðð ùs   ‚AA)ÚDEFAULT_SYSTEM_PROMPTc                   óD   — e Zd ZU dZee   ed<   dZee   ed<   dZe	ed<   y)ÚPromptUpdateNr’   ÚpromptTÚ	is_active)
r$   r%   r&   r’   r   r'   r(   r½   r¾   r9   r)   r*   r+   r¼   r¼   3  s(   … Ø!€GˆX�c‰]Ó!Ø €FˆH�S‰MÓ Ø€IˆtÔr*   r¼   z/promptsc               ƒ   óF  K  — g } t         d   j                  «       j                  dd«      D ]e  }| j                  t	        |d   «      |j                  d«      |j                  dd«      |j                  dt        j                  «       «      dœ«       Œg d	d
| t        dœdœS ­w)z+List all custom prompts stored in database.ÚpromptsrU   é   r’   r¾   FÚ
updated_at©rG   r’   r¾   rÂ   rV   zPrompts retrieved successfully.)rÀ   Údefault_prompt©r   rH   rC   )	rK   rW   ÚsortrX   r'   rN   r   Úutcnowrº   )rÀ   rZ   s     r+   Úlist_all_promptsrÈ   8  sž   è ø€ ð €Gä�	‰]×ÑÓ!×&Ñ& u¨aÓ0ò ˆØ�‰Ü�a˜‘h“-Ø—u‘u˜YÓ'ØŸ™˜{¨EÓ2ØŸ%™% ¬h¯o©oÓ.?Ó@ñ	
õ 	ðð Ø4àÜ3ñ
ñð ùs   ‚BB!z/prompts/{id}c              ƒ   óø   K  — t         d   j                  dt        | «      i«      }|st        dd¬«      ‚ddt	        |d   «      |j                  d«      |j                  d	d
«      |j                  d«      dœdœS ­w)zGet a specific prompt by ID.rÀ   rU   r]   úPrompt not foundr_   rV   zPrompt retrieved successfully.r’   r¾   FrÂ   rÃ   rÅ   rb   )rG   r½   s     r+   Úget_prompt_by_idrË   N  s   è ø€ ô �	‰]×#Ñ# U¬H°R«LÐ$9Ó:€FÙÜ¨Ð4FÔGÐGð Ø3ä�f˜U‘mÓ$Ø—z‘z )Ó,ØŸ™ K°Ó7Ø Ÿ*™* \Ó2ñ	
ñ	ð 	ùrS   Úrequestc              ƒ   ó  K  — 	 | j                  «       ƒ d{  –—† }|j                  d«      xs |j                  d«      }|j                  dd«      }|st        dddddœ¬	«      S ||t        j                  «       d
œ}t
        d   j                  |«      }t        «       }|r|j                  «        ddt        |j                  «      |dœdœS 7 Œµ# t        $ r$}t        ddt        |«      ddœ¬	«      cY d}~S d}~ww xY w­w)zCreate a new prompt.Nr’   r½   r¾   Tr“   úContent is requiredrÅ   r‘   )r’   r¾   rÂ   rÀ   rA   zPrompt created successfully.©rG   r¾   éô  )ÚjsonrN   r   r   rÇ   rK   rL   r   Úclear_cacher'   rM   r¢   )rÌ   rC   r’   r¾   rO   rP   ÚserviceÚes           r+   Úcreate_promptrÕ   `  s   è ø€ ðgØ—\‘\“^×#ˆØ—(‘(˜9Ó%Ò;¨¯©°(Ó);ˆØ—H‘H˜[¨$Ó/ˆ	áÜ¨CÀCÐTiÐswÑ9xÔyÐyð Ø"Ü"Ÿ/™/Ó+ñ
ˆô
 �I‘×)Ñ)¨#Ó.ˆô (Ó)ˆÙØ×ÑÔ!ð Ø5Ü˜v×1Ñ1Ó2ÀÑKñ
ð 	
ð/ $ùô8 ò gÜ¨ÀÔPSÐTUÓPVÐ`dÑ5eÔfÕfûðgüsR   ‚C?„C —C˜AC Á$C?Á%A'C ÃC?ÃC Ã	C<ÃC7Ã1C<Ã2C?Ã7C<Ã<C?c              ƒ   ó  K  — 	 |j                  «       ƒ d{  –—† }|j                  d«      xs |j                  d«      }|st        dddddœ¬«      S t        d   j	                  d	t        | «      id
|t        j                  «       dœi«      }|j                  dk(  rt        dd¬«      ‚t        «       }|r|j                  «        ddd| idœS 7 Œ¶# t        $ r$}t        ddt        |«      ddœ¬«      cY d}~S d}~ww xY w­w)zEdit an existing prompt.Nr’   r½   r“   rÎ   rÅ   r‘   rÀ   rU   rh   )r’   rÂ   r   r]   rÊ   r_   rV   zPrompt updated successfully.rG   rÐ   ©rÑ   rN   r   rK   rj   r   r   rÇ   r¶   r   r   rÒ   r¢   r'   )rG   rÌ   rC   r’   Úupdate_resultrÓ   rÔ   s          r+   Úedit_promptrÙ   ƒ  s  è ø€ ðgØ—\‘\“^×#ˆØ—(‘(˜9Ó%Ò;¨¯©°(Ó);ˆáÜ¨CÀCÐTiÐswÑ9xÔyÐyä˜9™×0Ñ0Ø”H˜R“LÐ!Ø ¼¿¹Ó8IÑJÐKó
ˆð
 ×&Ñ&¨!Ò+Ü¨CÐ8JÔKÐKô (Ó)ˆÙØ×ÑÔ!ð Ø5Ø˜2�Jñ
ð 	
ð' $ùô0 ò gÜ¨ÀÔPSÐTUÓPVÐ`dÑ5eÔfÕfûðgüsQ   ‚D „C —C˜:C ÁD ÁA:C ÃD ÃC Ã	C=ÃC8Ã2C=Ã3D Ã8C=Ã=D z/prompts/{id}/statusc              ƒ   óð  K  — 	 |j                  «       ƒ d{  –—† }|j                  d«      }|€t        dddddœ¬«      S t        d   j	                  dt        | «      id	|t        j                  «       d
œi«      }|j                  dk(  rt        dd¬«      ‚t        «       }|r|j                  «        dd|rdnd› d�| |dœdœS 7 Œ¬# t        $ r$}t        ddt        |«      ddœ¬«      cY d}~S d}~ww xY w­w)z!Update active status of a prompt.Nr¾   r“   zis_active field is requiredrÅ   r‘   rÀ   rU   rh   )r¾   rÂ   r   r]   rÊ   r_   rV   zPrompt Ú	activatedÚdeactivatedz successfully.rÏ   rÐ   r×   )rG   rÌ   rC   r¾   rP   rÓ   rÔ   s          r+   Úupdate_prompt_statusrÝ   ¢  s+  è ø€ ðgØ—\‘\“^×#ˆØ—H‘H˜[Ó)ˆ	àÐÜ¨CÀCÐTqÐ{ñ  :Aô  Bð  Bô �I‘×)Ñ)¨5´(¸2³,Ð*?À&ÐXaÔqy÷  rAñ  rAó  rCñ  KDð  BEó  Fˆà×Ñ 1Ò$Ü¨CÐ8JÔKÐKô (Ó)ˆÙØ×ÑÔ!ð Ø ±	¡¸}Ð MÈ^Ð\Ø¨IÑ6ñ
ð 	
ð) $ùô2 ò gÜ¨ÀÔPSÐTUÓPVÐ`dÑ5eÔfÕfûðgüsP   ‚C6„C —C˜'C ¿C6Á BC ÃC6ÃC Ã	C3ÃC.Ã(C3Ã)C6Ã.C3Ã3C6c              ƒ   óÌ   K  — t         d   j                  dt        | «      i«      }|j                  dk(  rt	        dd¬«      ‚t        «       }|r|j                  «        ddd	d
œS ­w)zDelete a prompt.rÀ   rU   r   r]   rÊ   r_   rV   zPrompt deleted successfully.NrÅ   )rK   rr   r   rs   r   r   rÒ   )rG   rP   rÓ   s      r+   Údelete_promptrß   Â  so   è ø€ ô �	‰]×%Ñ% u¬h°r«lÐ&;Ó<€FØ×Ñ˜qÒ Ü¨Ð4FÔGÐGô $Ó%€GÙØ×ÑÔð Ø1Øñð ùs   ‚A"A$c                   ó   — e Zd ZU eed<   y)ÚFolderCreateÚfolder_nameNr#   r)   r*   r+   rá   rá   Ù  s   … ØÔr*   rá   z/folders/createc              ƒ   ó  K  — t         d   j                  d| j                  i«      }|rt        ddddddœi¬«      S | j                  t	        j
                  «       t	        j
                  «       d	d
œ}t         d   j                  |«      }t        j                  t        j                  «      t        |j                  «      z  }|j                  dd¬«       dddt        |j                  «      | j                  |d   d	dœdœiS ­w)zCreate a new folderÚdocument_foldersrâ   r“   rC   zFolder already existsN)r   rH   Úfolderr‘   r   ©râ   Ú
created_atrÂ   Ú
file_countT©ÚparentsÚexist_okrA   zFolder created successfullyrç   )Ú	folder_idrâ   rç   rè   )rK   rc   râ   r   r   rÇ   rL   ÚpathlibÚPathr   ÚDATA_DIRr'   rM   Úmkdir)rC   ÚexistingÚ
folder_docrP   Úfolder_paths        r+   Úcreate_folderrô   Ü  s  è ø€ ô Ð$Ñ%×.Ñ.°¸t×?OÑ?OÐ/PÓQ€HÙÜØàØ!Ø6Ø"ñðô	
ð 		
ð ×'Ñ'Ü—o‘oÓ'Ü—o‘oÓ'Øñ	€Jô Ð"Ñ#×.Ñ.¨zÓ:€Fä—,‘,œx×0Ñ0Ó1´C¸×8JÑ8JÓ4KÑK€KØ×Ñ˜d¨TÐÔ2ð 	ØØ4ä  ×!3Ñ!3Ó4Ø#×/Ñ/Ø(¨Ñ6Øñ	ñ	
ðð ùs   ‚D Dz/folders/upload-file.râ   rì   c           
   ƒ   ó  K  — t        d«       t        d|› �«       t        d|› �«       | j                  «       ƒ d{  –—† }t        dt        |j                  «       «      › �«       |j	                  d«      xs |j	                  d«      }t        d|rt        |«      nd	› �«       |r?t        |«      D ]1  \  }}t        d
|dz   › dt        |d«      r|j                  nd› �«       Œ3 |st        d«       t        dd¬«      ‚d}|}|r:t        d   j                  dt        |«      i«      }	|	r|}|	d   }n•t        dd¬«      ‚t        d   j                  d|i«      }	|	rt        |	d   «      }|	d   }nX|t        j                  «       t        j                  «       d	dœ}
t        d   j!                  |
«      }t        |j"                  «      }t%        j&                  t(        j*                  «      |z  }|j-                  dd¬«       g }g }t        dt        |«      › d�«       |D �]  }t        d|j                  › d�«       |j                  j/                  «       j1                  d«      s*t        d «       |j3                  |j                  d!d"œ«       Œp||j                  z  }t        d#|› �«       	 t5        |d$«      5 }t7        j8                  |j:                  |«       ddd«       t        d%t<        j>                  jA                  |«      › d&�«       |j                  t        |«      |t        j                  «       d)t<        j>                  jA                  |«      d*œ}t        d   j!                  |«      }t        d+|j"                  › �«       d,}	 tE        «       }|r\t        d-«       |jF                  jI                  ||¬.«       t        d   jK                  d|j"                  id/d0d,ii«       t        d1«       |j3                  t        |j"                  «      |j                  |d4œ«       �Œ	 t        d   jK                  dt        |«      id5t        |«      id6t        j                  «       id7œ«       t        d8«       t        d9t        |«      › d:�«       t        d;t        |«      › d:�«       t        d<|› �«       t        d=«       d>d?t        |«      › d@�||||dAœiS 7 �Œž# 1 sw Y   �ŒxY w# tB        $ r:}t        d'|› �«       |j3                  |j                  d(|› �d"œ«       Y d}~�Œ	d}~ww xY w# tB        $ rD}t        d2|› �«       d3}t        d   jK                  d|j"                  id/d0d3ii«       Y d}~�Œ„d}~ww xY w­w)BzUpload multiple files to folderz
=== FOLDER UPLOAD REQUEST ===zfolder_name: zfolder_id: NzForm keys: ÚfilesÚfilezFiles received: r   úFile rÁ   ú: ÚfilenamezNO FILENAMEz ERROR: No files found in requesté¦  z3No files provided. Use 'files' or 'file' field namer_   rä   rU   râ   r]   úFolder not foundræ   Tré   z
Processing z	 files...z
--- Processing: z ---ú.pdfzREJECTED: Not a PDF fileúOnly PDF files allowed©rú   ÚreasonzSaving to: ÚwbzFile saved successfully, size: z byteszERROR saving file: úSave failed: ÚIndexing)rú   rì   râ   Úupload_dater   ÚsizezDB record created: ÚIndexedzIndexing file...©râ   rh   r   zFile indexed successfullyzERROR indexing: ÚFailed)Úfile_idrú   r   rè   rÂ   )ú$incrh   z
=== UPLOAD COMPLETE ===z
Uploaded: z fileszFailed: zFolder ID: z========================
rC   rA   z file(s) uploaded to folder)r   rH   rì   râ   Úuploaded_filesÚfailed_files)&ÚprintÚformÚlistÚkeysÚgetlistÚlenÚ	enumerateÚhasattrrú   r   rK   rc   r   r'   r   rÇ   rL   rM   rí   rî   r   rï   rð   ÚlowerÚendswithrX   ÚopenÚshutilÚcopyfileobjr÷   ÚosÚpathÚgetsizer¢   r   ÚmanagerÚindex_single_filerj   )rÌ   râ   rì   r  rö   ÚidxÚfÚfinal_folder_idÚfinal_folder_namerå   Ú
new_folderrP   Údata_dirr  r  r÷   Ú	file_pathÚbufferrÔ   Úfile_docÚfile_resultÚ
status_msgrÓ   s                          r+   Úupload_file_to_folderr*    sV  è ø€ ô 
Ð+Ô-Ü	ˆM˜+˜Ð
'Ô(Ü	ˆK˜	�{Ð
#Ô$à—‘“×€DÜ	ˆKœ˜TŸY™Y›[Ó)Ð*Ð
+Ô,à�L‰L˜Ó!Ò9 T§\¡\°&Ó%9€EÜ	Ð©5œS œZ°aÐ8Ð
9Ô:áÜ Ó&ò 	^‰FˆC�Ü�E˜#˜a™%˜ ´¸¸JÔ1G 1§:¢:È]Ð"[Ð\Õ]ð	^ñ ÜÐ0Ô1Ü¨Ð4iÔjÐjà€OØ#ÐáÜÐ&Ñ'×0Ñ0°%¼À)Ó9LÐ1MÓNˆÙØ'ˆOØ & }Ñ 5Ñä¨CÐ8JÔKÐKäÐ&Ñ'×0Ñ0°-ÀÐ1MÓNˆÙÜ! &¨¡-Ó0ˆOØ & }Ñ 5Ñð  +Ü&Ÿo™oÓ/Ü&Ÿo™oÓ/Øñ	ˆJô Ð*Ñ+×6Ñ6°zÓBˆFÜ! &×"4Ñ"4Ó5ˆOô �|‰|œH×-Ñ-Ó.°Ñ@€HØ‡N�N˜4¨$€NÔ/à€NØ€Lô 
ˆMœ#˜e›*˜ YÐ
/Ô0Øó 5ˆÜÐ" 4§=¡= /°Ð6Ô7Ø�}‰}×"Ñ"Ó$×-Ñ-¨fÔ5ÜÐ,Ô.Ø×Ñ¨T¯]©]ÐF^Ñ _Ô`Øà˜tŸ}™}Ñ,ˆ	Ü�˜I˜;Ð'Ô(ð	Ü�i Ó&ð 6¨&Ü×"Ñ" 4§9¡9¨fÔ5÷6äÐ3´B·G±G·O±OÀIÓ4NÐ3OÈvÐVÔWð Ÿ™Ü! /Ó2Ø,Ü#Ÿ?™?Ó,Ø Ü—G‘G—O‘O IÓ.ñ
ˆô ˜‘k×,Ñ,¨XÓ6ˆÜÐ# K×$;Ñ$;Ð#<Ð=Ô>àˆ
ð	Ü+Ó-ˆGÙÜÐ(Ô*Ø—‘×1Ñ1°)ÐIZÐ1Ô[Ü�7‘×&Ñ&Ø˜K×3Ñ3Ð4Ø˜h¨	Ð2Ð3ôô Ð1Ô3ð 	×ÑÜ˜;×2Ñ2Ó3ØŸ™Ø ñ
ö 	ðc5ôp ÐÑ×%Ñ%Ø	”˜Ó)Ð*à!¤3 ~Ó#6Ð7Ø!¤8§?¡?Ó#4Ð5ñ	
ôô 
Ð%Ô'Ü	ˆJ”s˜>Ó*Ð+¨6Ð
2Ô3Ü	ˆH”S˜Ó&Ð' vÐ
.Ô/Ü	ˆK˜Ð(Ð
)Ô*Ü	Ð&Ô(ð 	ØÜ˜nÓ-Ð.Ð.IÐJØ(Ø,Ø,Ø(ñ
ð	ð 	ðm  ù÷v6ñ 6ûô ò 	ÜÐ'¨ sÐ+Ô,Ø×Ñ¨T¯]©]ÈÐVWÐUXÐFYÑ ZÔ[Ýûð	ûô6 ò 	ÜÐ$ Q CÐ(Ô)Ø!ˆJÜˆw‰K×"Ñ"Ø˜×/Ñ/Ð0Ø˜( HÐ-Ð.÷ò ûð	üs   ‚;V½S¾I/VÊ.S+Ê:!SË4S+ÌA=VÎA(T1Ï5C'VÓS(	Ó#S+Ó+	T.Ó4/T)Ô#VÔ)T.Ô.VÔ1	U>Ô:9U9Õ3VÕ9U>Õ>Vz/foldersÚpageÚlimitc              ƒ   óˆ  K  — | dz
  |z  }t         d   j                  i «      }g }t         d   j                  «       j                  dd«      j	                  |«      j                  |«      D ]>  }|j                  t        |d   «      |d   |d   |d   |j                  dd	«      d
œ«       Œ@ dd||| |||z   dz
  |z  dœdœdœS ­w)z,Get all folders with file counts (Paginated)rÁ   rä   rç   éÿÿÿÿrU   râ   rÂ   rè   r   ©rì   râ   rç   rÂ   rè   rV   zFolders retrieved successfully©Útotalr+  r,  Úpages)ÚfoldersÚ
paginationrÅ   )	rK   Úcount_documentsrW   rÆ   Úskipr,  rX   r'   rN   )r+  r,  r6  Útotal_foldersr3  r   s         r+   Úlist_foldersr8  �  sí   è ø€ ð �1‰H˜Ñ€DÜÐ)Ñ*×:Ñ:¸2Ó>€Mà€GÜÐ"Ñ#×(Ñ(Ó*×/Ñ/°¸bÓA×FÑFÀtÓL×RÑRÐSXÓYò ˆØ�‰Ü˜Q˜u™X›Ø˜]Ñ+Ø˜L™/Ø˜L™/ØŸ%™% ¨aÓ0ñ
õ 	ðð Ø3àà&ØØØ'¨%Ñ/°!Ñ3¸Ñ=ñ	ñ
ñð ùs   ‚C Cz/folders/{folder_id}/filesc              ƒ   ót  K  — t         d   j                  dt        | «      i«      }|st        dd¬«      ‚|dz
  |z  }t         d   j	                  dt        | «      i«      }g }t         d   j                  dt        | «      i«      j                  d	d
«      j                  |«      j                  |«      D ]K  }|j                  t        |d   «      |d   |d	   |j                  dd«      |j                  dd«      dœ«       ŒM dd| |d   |d   |d   |j                  dd«      dœ||||||z   dz
  |z  dœdœdœS ­w)z2Get all files in a specific folder with paginationrä   rU   r]   rü   r_   rÁ   rö   rì   r  r.  rú   r   r®   r  r   )r	  rú   r  r   r  rV   zFiles retrieved successfullyrâ   rç   rÂ   rè   r/  r0  )rå   rö   r4  rÅ   )rK   rc   r   r   r5  rW   rÆ   r6  r,  rX   r'   rN   )rì   r+  r,  rå   r6  Útotal_filesrö   r   s           r+   Úget_folder_filesr;  ­  so  è ø€ ô Ð"Ñ#×,Ñ,¨e´X¸iÓ5HÐ-IÓJ€FÙÜ¨Ð4FÔGÐGð �1‰H˜Ñ€DÜ�W‘+×-Ñ-¨{¼HÀYÓ<OÐ.PÓQ€Kð €EÜ�‰[×Ñ˜{¬H°YÓ,?Ð@ÓA×FÑFÀ}ÐVXÓY×^Ñ^Ð_cÓd×jÑjÐkpÓqò ˆØ�‰Ü˜1˜U™8“}Ø˜*™Ø˜]Ñ+Ø—e‘e˜H iÓ0Ø—E‘E˜& !Ó$ñ
õ 	ðð Ø1ð 'Ø% mÑ4Ø$ \Ñ2Ø$ \Ñ2Ø$Ÿj™j¨°qÓ9ñð à$ØØØ%¨Ñ-°Ñ1°eÑ;ñ	ñ
ñð ùs   ‚D6D8z/folders/{folder_id}c              ƒ   óL  K  — t         d   j                  dt        | «      i«      }|st        dd¬«      ‚|d   }	 t	        «       }|r|j
                  j                  |«       t        j                  t        j                  «      | z  }|j                  «       rt        j                  |«       t         d
   j!                  dt        | «      i«       t         d   j#                  dt        | «      i«       dd|› d�d	dœS # t        $ r}t        d|› d|› �«       Y d	}~Œºd	}~ww xY w­w)zBDelete a folder and all its files from disk, DB, and Vector index.rä   rU   r]   rü   r_   râ   z-Warning: Failed to delete vectors for folder rù   Nrö   rì   rV   zFolder 'z,' and all its contents deleted successfully.rÅ   )rK   rc   r   r   r   r  Údelete_folder_vectorsr¢   r  rí   rî   r   rï   Úexistsr  ÚrmtreeÚdelete_manyrr   )rì   rå   râ   rÓ   rÔ   ró   s         r+   Údelete_folderrA  Ù  s"  è ø€ ô Ð"Ñ#×,Ñ,¨e´X¸iÓ5HÐ-IÓJ€FÙÜ¨Ð4FÔGÐGà˜Ñ'€KðRÜ'Ó)ˆÙØ�O‰O×1Ñ1°+Ô>ô
 —,‘,œx×0Ñ0Ó1°IÑ=€KØ×ÑÔÜ�‰�kÔ"ô €w�K×Ñ˜[¬(°9Ó*=Ð>Ô?ô ÐÑ×%Ñ% u¬h°yÓ.AÐ&BÔCð Ø˜k˜]Ð*VÐWØñð øô ò RÜÐ=¸k¸]È"ÈQÈCÐP×QÑQûðRüs/   ‚8D$»'C= Á"BD$Ã=	D!ÄDÄD$ÄD!Ä!D$z/files/uploadrö   c              ƒ   ó\  K  — |rt        |«      dk(  rZ|d   j                  sK| j                  «       ƒ d {  –—† }|j                  d«      xs |j                  d«      }|st	        dd¬«      ‚g }g }t        j                  t        j                  «      }|j                  dd¬	«       |D �]o  }|j                  j                  «       j                  d
«      s|j                  |j                  ddœ«       ŒL||j                  z  }	 t        |d«      5 }t        j                  |j                   |«       d d d «       |j                  t%        j&                  «       dt(        j*                  j-                  |«      dœ}
t.        d   j1                  |
«      }d}	 t3        «       }|rF|j4                  j7                  |d ¬«       t.        d   j9                  d|j:                  idddii«       |j                  t=        |j:                  «      |j                  |dœ«       �Œr dddd dœiS 7 �Œï# 1 sw Y   ŒöxY w# t"        $ r,}	|j                  |j                  d|	› �dœ«       Y d }	~	�Œºd }	~	ww xY w# t"        $ r5}	d}t.        d   j9                  d|j:                  idddii«       Y d }	~	Œ½d }	~	ww xY w­w)NrÁ   r   rö   r÷   rû   z6No files provided. Use 'files' field name in form-datar_   Tré   rý   rþ   rÿ   r  r  r  )rú   r  r   r  r  r  rU   rh   r   r  )rG   rú   r   rC   rV   zFiles uploaded successfully.rp   )r  rú   r  r  r   rí   rî   r   rï   rð   r  r  rX   r  r  r  r÷   r¢   r   rÇ   r  r  r  rK   rL   r   r  r  rj   rM   r'   )rÌ   rö   r  r  r  r$  r÷   r%  r&  rÔ   r'  rP   r)  rÓ   s                 r+   Úupload_filerC  ý  s~  è ø€ ñ ”S˜“Z 1’_¨U°1©X×->Ò->à—\‘\“^×#ˆØ—‘˜WÓ%Ò=¨¯©°fÓ)=ˆÙÜ¨CÐ8pÔqÐqØ€NØ€Lä�|‰|œH×-Ñ-Ó.€HØ‡N�N˜4¨$€NÔ/àó 'ˆà�}‰}×"Ñ"Ó$×-Ñ-¨fÔ5Ø×Ñ¨T¯]©]ÐF^Ñ _Ô`Øð ˜tŸ}™}Ñ,ˆ	ð	Ü�i Ó&ð 6¨&Ü×"Ñ" 4§9¡9¨fÔ5÷6ð Ÿ™Ü#Ÿ?™?Ó,Ø Ü—G‘G—O‘O IÓ.ñ	
ˆô �G‘×'Ñ'¨Ó1ˆð ˆ
ð	`Ü+Ó-ˆGÙØ—‘×1Ñ1°)ÈÐ1ÔNÜ�7‘×&Ñ&¨¨v×/AÑ/AÐ'BÀVÈhÐXaÐMbÐDcÔdð
 	×ÑÜ�f×(Ñ(Ó)ØŸ™Ø ñ
ö 	ðG'ðT 	ØØ5Øñ
ðð ðg $ù÷&6ð 6ûäò 	Ø×Ñ¨T¯]©]ÈÐVWÐUXÐFYÑ ZÔ[Ýûð	ûô( ò 	`Ø!ˆJÜˆw‰K×"Ñ" E¨6×+=Ñ+=Ð#>ÀÈ(ÐT\ÐI]Ð@^×_Ñ_ûð	`üs~   ‚3J,µH$¶CJ,ÄH3Ä!H'Ä2H3Ä:AJ,ÆAI+Ç'>J,È'H0	È,H3È3	I(È<!I#ÉJ,É#I(É(J,É+	J)É4+J$ÊJ,Ê$J)Ê)J,c                   ó(   — e Zd ZU eeee   f   ed<   y)ÚFileDeleteRequestÚfile_idsN)r$   r%   r&   r   r'   r   r(   r)   r*   r+   rE  rE  =  s   … Ø�C˜˜c™�NÑ#Ô#r*   rE  z/files/delete/{file_id}r	  c           
   ƒ   ó¾  K  — t        d«       t        d|j                  «       › �«       t        |j                  t        «      r|j                  gn|j                  }d}g }g }|D �]”  } 	 t
        d   j                  dt        | «      i«      }|s|j                  d| › d�«       Œ@|d   }|j                  d	«      }|j                  d
«      }	t        «       }
|
r|
j                  j                  |«       |r3t        j                  t        j                   «      t	        |«      z  |z  }n&t        j                  t        j                   «      |z  }|j#                  «       r|j%                  «        t
        d   j'                  dt        | «      i«       |r(t
        d   j)                  dt        |«      idddii«       |j                  t	        | «      ||rt	        |«      nd|	dœ«       |dz  }t        d|› �«       �Œ— t        d|› dt-        |«      › d�«       dd|› d�|||dœdœS # t*        $ r+}|j                  d| › dt	        |«      › �«       Y d}~�Œðd}~ww xY w­w)z“
    Unified File Deletion Endpoint (Single or Multiple)
    - Single: {"file_ids": "id1"}
    - Multiple: {"file_ids": ["id1", "id2", "id3"]}
    z 
--- DELETE REQUEST RECEIVED ---z	Payload: r   rö   rU   rø   z
 not foundrú   rì   râ   rä   r
  rè   r.  N)r	  rú   rì   râ   rÁ   z	Deleted: zError deleting file rù   z	Summary: z files deleted, z errors.rV   zSuccessfully deleted z files.)rs   Údeleted_filesÚerrorsrÅ   )r  rJ   Ú
isinstancerF  r'   rK   rc   r   rX   rN   r   r  Údelete_file_vectorsrí   rî   r   rï   r>  Úunlinkrr   rj   r¢   r  )r	  rC   rF  rs   Údeleted_files_detailsrI  r'  rú   rì   râ   rÓ   r%  rÔ   s                r+   Údelete_filesrN  @  sW  è ø€ ô 
Ð-Ô/Ü	ˆI�d—i‘i“k�]Ð
#Ô$ô #-¨T¯]©]¼CÔ"@�—‘‰ÀdÇmÁm€Hà€MØÐØ€Fàó .Fˆð-	Fä˜'‘{×+Ñ+¨U´H¸WÓ4EÐ,FÓGˆHÙØ—‘  g Y¨jÐ9Ô:Øà 
Ñ+ˆHØ Ÿ™ [Ó1ˆIØ"Ÿ,™, }Ó5ˆKô ,Ó-ˆGÙØ—‘×3Ñ3°HÔ=ñ Ü#ŸL™L¬×):Ñ):Ó;¼cÀ)»nÑLÈxÑW‘	ä#ŸL™L¬×):Ñ):Ó;¸hÑF�	à×ÑÔ!Ø× Ñ Ô"ô ˆw‰K×"Ñ" E¬8°GÓ+<Ð#=Ô>ñ ÜÐ%Ñ&×1Ñ1ØœH YÓ/Ð0Ø˜l¨BÐ/Ð0ôð
 "×(Ñ(Ü˜w›<Ø$Ù/8œS œ^¸dØ*ñ	*ô ð ˜QÑˆMÜ�I˜h˜ZÐ(Ö)ðW.Fô` 
ˆI�m�_Ð$4´S¸³[°MÀÐ
JÔKàØ*¨=¨/¸ÐAà*Ø2Øñ
ñð øô	 ò 	FØ�M‰MÐ0°°	¸¼CÀ»F¸8ÐD×EÒEûð	Füs=   ‚A'IÁ*:H&Â$IÂ%EH&Ç:,IÈ&	IÈ/ IÉIÉIÉIz/files/{file_id}/viewc              ƒ   ó   K  — 	 t         d   j                  dt        | «      i«      }|st        dd¬«      ‚|d   }|j	                  d«      }|r3t        j                  t        j                  «      t        |«      z  |z  }n&t        j                  t        j                  «      |z  }|j                  «       st        dd|› �¬«      ‚t        |d	|¬
«      S # t        $ r-}t        |t        «      r|‚t        dt        |«      ¬«      ‚d}~ww xY w­w)z%View/Fetch PDF file content directly.rö   rU   r]   z!File record not found in databaser_   rú   rì   zPhysical file not found at zapplication/pdf)r  Ú
media_typerú   rÐ   N)rK   rc   r   r   rN   rí   rî   r   rï   r'   r>  r   r¢   rJ  )r	  r'  rú   rì   r%  rÔ   s         r+   Úview_pdfrQ  Œ  sü   è ø€ ð<Ü�g‘;×'Ñ'¨´¸Ó0AÐ(BÓCˆÙÜ¨CÐ8[Ô\Ð\à˜JÑ'ˆØ—L‘L Ó-ˆ	ñ ÜŸ™¤X×%6Ñ%6Ó7¼#¸i».ÑHÈ8ÑS‰IäŸ™¤X×%6Ñ%6Ó7¸(ÑBˆIà×ÑÔ!Ü¨CÐ:UÐV_ÐU`Ð8aÔbÐbäØØ(Øô
ð 	
øô
 ò <Ü�aœÔ'ØˆGÜ¨´C¸³FÔ;Ð;ûð<üs)   ‚D„CC ÃDÃ	DÃ(DÄDÄD)rÁ   é
   )[Úfastapir   r   r   r   r   r   r	   r
   Úfastapi.responsesr   r   Úpydanticr   Útypingr   r   r   r   r   Úpymongor   Úbsonr   r  r  rí   r   Úsrc.core.configr   Úsrc.utils.authr   r   r   Úsrc.api.chatr   ÚrouterÚMONGODB_URIÚclientÚDB_NAMErK   rš   r    r-   r2   r;   r@   ÚpostrR   rN   r[   r'   rf   Úputrn   r8   ru   r~   rƒ   r‡   r‰   r‹   rž   r£   r¥   r§   r¬   r´   r·   r¹   Úsrc.utils.promptsrº   r¼   rÈ   rË   rÕ   rÙ   ÚpatchrÝ   rß   rá   rô   r*  Úintr8  r;  rA  rC  rE  rN  rQ  r)   r*   r+   ú<module>re     sÈ  ðß ^× ^Ó ^ß 8Ý ß 3Õ 3Ý Ý Û Û 	Û Ý Ý $ß RÑ Rå .á	˜(¨'¨Ô	3€ñ 
�X×)Ñ)Ó	*€ØˆH×ÑÑ€Ø�x‘LÐ ô�9ô ô&�Yô &ô
�Yô ô%ˆyô %ô&�yô &ð ‡�ˆ^¨€Ó-ð .ò ó .ðð( ‡�ˆNÓñó ðð$ ‡�ÐÓ ð 3ò ó !ðð( ‡�ÐÓ ð˜cð Ð)9ò ó !ðð* ‡�Ð"Ó#ð
 ò 
ó $ð
ð ‡�ˆX 3€Ó'ð*˜Hò *ó (ð*ðX ‡�ˆHÓñó ðð: ‡�ˆMÓð˜Sò ó ðð: ‡�ˆMÓð%˜ð % 8ò %ó ð%ðN ‡�ˆ}Óð
˜#ò 
ó ð
ð ‡�ˆXÓðD�lò Dó ðDðL ‡�ÐÓðN˜Cò Nó ðNô,"�)ô "ô"�)ô "ð ‡�ˆX 3€Ó'ð.˜[ò .ó (ð.ð` ‡�ˆHÓñó ðð@ ‡�ˆMÓð*˜3ð * kò *ó ð*ðX ‡�ˆ}Óð
˜3ò 
ó ð
õ 4ô�9ô ð
 ‡�ˆJÓñó ðð* ‡�ˆOÓð˜sò ó ðð" ‡�ˆZÓð g ò  gó ð gðD ‡�ˆOÓðg˜#ð g¨ò gó ðgð< ‡�Ð$Ó%ðg 3ð g°ò gó &ðgð> ‡�ˆÓð˜Cò ó  ðô,�9ô ð ‡�Ð¨C€Ó0ð%˜lò %ó 1ð%ðN ‡�Ð#Ó$ñ ˜C“yÙ# D›zñIØðIàðIð ˜‰}òIó %ðIðT ‡�ˆJÓñ˜Sð ¨Sò ó ðð: ‡�Ð(Ó)ñ) cð )°ð )Àò )ó *ð)ðV ‡�Ð%Ó&ð 3ò ó 'ððF ‡�ˆ_ÓÙBFÀtÃ*ñ =˜wð =¨t°JÑ/?ò =ó ð=ô~$˜	ô $ð ‡�Ð(Ó)ðI ð IÐ+<ò Ió *ðIðV ‡�Ð#Ó$ð<˜Cò <ó %ñ<r*   