o
    nv•j“  ã                   @   s†   d dl Z d dlmZmZ d dlmZ G dd„ dƒZdd„ ZG dd	„ d	ƒZG d
d„ dƒZ	G dd„ dƒZ
e
ƒ Zdd„ Zdd„ Zdd„ ZdS )é    N)ÚAsyncMongoClientÚReturnDocument)Úsettingsc                   @   s@   e Zd Zdd„ Zddd„Zdd„ Zdd	d
„Zdd„ Zdd„ ZdS )ÚInMemoryCursorc                 C   s   || _ d | _d | _d| _d S )Né   )ÚdocsÚ_limitÚ	_sort_keyÚ	_sort_dir)Úselfr   © r   ú-/web/html/dev/chatbot/backend/app/database.pyÚ__init__   s   
zInMemoryCursor.__init__r   c                 C   s   || _ || _| S ©N)r	   r
   )r   ÚkeyÚ	directionr   r   r   Úsort   s   zInMemoryCursor.sortc                 C   s
   || _ | S r   )r   )r   Únr   r   r   Úlimit   s   zInMemoryCursor.limitNc                 ƒ   sp   �t ˆ jƒ}ˆ jr|j‡ fdd„ˆ jdkd� ˆ jd ur(ˆ jdkr(|d ˆ j… }|d ur6|dkr6|d |… }|S )Nc                    ó   |   ˆ jd¡S ©NÚ ©Úgetr	   ©Úx©r   r   r   Ú<lambda>   ó    z(InMemoryCursor.to_list.<locals>.<lambda>éÿÿÿÿ©r   Úreverser   )Úlistr   r	   r   r
   r   )r   ÚlengthÚresr   r   r   Úto_list   s   €
zInMemoryCursor.to_listc                    s\   t ˆ jƒ}ˆ jr|j‡ fdd„ˆ jdkd� ˆ jd ur'ˆ jdkr'|d ˆ j… }t|ƒˆ _ˆ S )Nc                    r   r   r   r   r   r   r   r   "   r   z*InMemoryCursor.__aiter__.<locals>.<lambda>r   r    r   )r"   r   r	   r   r
   r   ÚiterÚ_iter)r   r$   r   r   r   Ú	__aiter__   s   

zInMemoryCursor.__aiter__c                 Ã   s"   �zt | jƒW S  ty   t‚w r   )Únextr'   ÚStopIterationÚStopAsyncIterationr   r   r   r   Ú	__anext__(   s   €ÿzInMemoryCursor.__anext__)r   r   )	Ú__name__Ú
__module__Ú__qualname__r   r   r   r%   r(   r,   r   r   r   r   r      s    


	r   c                 C   sˆ   |  ¡ D ]=\}}|  |¡}t|tƒr:d|v r||d v r dS d|v r,||d vr, dS d|v r9||d kr9 dS q||krA dS qdS )Nz$ninFz$inz$neT)Úitemsr   Ú
isinstanceÚdict)ÚdocÚfilter_dictÚkÚvÚdoc_valr   r   r   Ú_doc_matches_filter.   s   

€ÿr8   c                   @   sJ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zddd„Zddd„Z	d	S )ÚInMemoryCollectionc                 C   s   || _ g | _d S r   )ÚnameÚ	documents)r   r:   r   r   r   r   =   s   
zInMemoryCollection.__init__c                 Ã   s(   �| j D ]}t||ƒrt|ƒ  S qd S r   )r;   r8   r2   )r   r4   r3   r   r   r   Úfind_oneA   s   €

ÿzInMemoryCollection.find_onec                 ƒ   s.   �t |ƒ‰ | j ˆ ¡ G ‡ fdd„dƒ}|ƒ S )Nc                
       s(   e Zd Z”  d”  d”  dd¡¡¡ZdS )z3InMemoryCollection.insert_one.<locals>.InsertResultÚ_idÚsiteIdÚ	sessionIdÚidN)r-   r.   r/   r   Úinserted_idr   ©Ústoredr   r   ÚInsertResultJ   s     rD   )r2   r;   Úappend)r   r3   rD   r   rB   r   Ú
insert_oneG   s
   €zInMemoryCollection.insert_onec                 Ã   s¤   �|   |¡I d H }|rH| jD ]9}t||ƒrGd|v r(|d  ¡ D ]\}}|||< qd|v r;|d  ¡ D ]}| |d ¡ q2G dd„ dƒ}|ƒ   S qG dd„ dƒ}|ƒ S )Nú$setú$unsetc                   @   ó   e Zd ZdZdS )ú3InMemoryCollection.update_one.<locals>.UpdateResultr   N©r-   r.   r/   Úmodified_countr   r   r   r   ÚUpdateResultZ   ó    rM   c                   @   rI   )rJ   r   NrK   r   r   r   r   rM   ]   rN   )r<   r;   r8   r0   ÚkeysÚpop)r   r4   Úupdate_dictÚtargetr3   r5   r6   rM   r   r   r   Ú
update_oneN   s    €



÷
zInMemoryCollection.update_oneNc           	      Ã   s’   �| j D ]B}t||ƒrFt|ƒ}d|v r"|d  ¡ D ]\}}|||< qd|v r5|d  ¡ D ]}| |d ¡ q,t|ƒ}|tjkrB|  S |  S qd S )NrG   rH   )r;   r8   r2   r0   rO   rP   r   ÚAFTER)	r   r4   rQ   Úreturn_documentr3   Ú
before_docr5   r6   Ú	after_docr   r   r   Úfind_one_and_updatea   s    €



õz&InMemoryCollection.find_one_and_updatec                 C   s8   |pi }g }| j D ]}t||ƒr| t|ƒ¡ q	t|ƒS r   )r;   r8   rE   r2   r   )r   r4   Úresultsr3   r   r   r   Úfindq   s   

€zInMemoryCollection.findc                 ƒ   s6   �ˆ pi ‰ ˆ s| j  ¡  d S ‡ fdd„| j D ƒ| _ d S )Nc                    s*   g | ]‰ t ‡ fd d„ˆ ¡ D ƒƒsˆ ‘qS )c                 3   s"   � | ]\}}ˆ   |¡|kV  qd S r   )r   )Ú.0r5   r6   ©Údr   r   Ú	<genexpr>€   s   €  z<InMemoryCollection.delete_many.<locals>.<listcomp>.<genexpr>)Úallr0   )r[   ©r4   r\   r   Ú
<listcomp>~   s    þÿz2InMemoryCollection.delete_many.<locals>.<listcomp>)r;   Úclear)r   r4   r   r`   r   Údelete_manyy   s   €
ÿzInMemoryCollection.delete_manyr   )
r-   r.   r/   r   r<   rF   rS   rX   rZ   rc   r   r   r   r   r9   <   s    

r9   c                   @   s$   e Zd Zddefdd„Zdd„ ZdS )	ÚInMemoryDatabaseTÚseed_defaultc              	   C   sN   i | _ |r%ddlm} tdƒ}|j ddd|dƒdd	d
œ¡ || j d< d S d S )Nr   )Úhash_passwordÚagentsÚagent_super_adminzSuper Adminzalok.chaudhary2001@gmail.comÚ123456ÚADMINÚACTIVE)ÚagentIdr:   ÚemailÚpasswordHashÚroleÚstatus)ÚcollectionsÚapp.utils.securityrf   r9   r;   rE   )r   re   rf   Úagents_collr   r   r   r   „   s   úôzInMemoryDatabase.__init__c                 C   s"   || j vrt|ƒ| j |< | j | S r   )rq   r9   )r   Úitemr   r   r   Ú__getitem__”   s   

zInMemoryDatabase.__getitem__N)T)r-   r.   r/   Úboolr   ru   r   r   r   r   rd   ƒ   s    rd   c                   @   s:   e Zd ZU dZedB ed< dZedB ed< dZe	ed< dS )ÚDatabaseNÚclientÚin_memory_dbFÚuse_fallback)
r-   r.   r/   rx   r   Ú__annotations__ry   rd   rz   rv   r   r   r   r   rw   ™   s   
 rw   c                   C   st   t jrt jd u rtƒ t _t jS t jd u r4zttjdddd�t _W n ty3   dt _tƒ t _t j Y S w t jtj	 S )NTiÐ  )ÚtlsAllowInvalidCertificatesÚtlsAllowInvalidHostnamesÚserverSelectionTimeoutMS)
Ú	db_helperrz   ry   rd   rx   r   r   Úmongodb_uriÚ	ExceptionÚdatabase_namer   r   r   r   Úget_database    s$   

ü
ýrƒ   c                  Ã   sb   �zt ƒ } tjstjdurtjj d¡I dH  W dS W dS W dS  ty0   dt_tƒ t_Y dS w )z]Initialize database connection on startup. Falls back to in-memory if MongoDB is unavailable.NÚpingT)	rƒ   r   rz   rx   ÚadminÚcommandr�   rd   ry   )Údbr   r   r   Úinit_databaseµ   s   €ÿþrˆ   c                   C   s:   t jd urzt j ¡  W n	 ty   Y nw d t _d S d S r   )r   rx   Úcloser�   r   r   r   r   Úclose_databaseÀ   s   
ÿ
ûrŠ   )ÚasyncioÚpymongor   r   Ú
app.configr   r   r8   r9   rd   rw   r   rƒ   rˆ   rŠ   r   r   r   r   Ú<module>   s    )G