o
    FhX                     @   sp   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
mZ d dlmZmZmZmZmZ G dd deZdS )	    )AnyDictMappingOptionalcastAsyncMongoClient)DataNotDictLikeError)State)BaseStorageDefaultKeyBuilder
KeyBuilder	StateType
StorageKeyc                   @   s  e Zd ZdZ			d#dee dee deded	df
d
dZ	e
	d$dedeeeef  ded	d fddZd%ddZded	ee fddZd$deded	dfddZded	ee fddZdedeeef d	dfddZded	eeef fdd Zdedeeef d	eeef fd!d"ZdS )&PyMongoStoragezc
    MongoDB storage required :code:`pymongo` package installed (:code:`pip install pymongo`).
    Naiogram_fsmstates_and_dataclientkey_builderdb_namecollection_namereturnc                 C   s6   |du rt  }|| _| j| | _| j| | _|| _dS )a$  
        :param client: Instance of AsyncMongoClient
        :param key_builder: builder that helps to convert contextual key to string
        :param db_name: name of the MongoDB database for FSM
        :param collection_name: name of the collection for storing FSM states and data
        N)r   _client	_database_collection_key_builder)selfr   r   r   r    r   N/var/www/html/venv/lib/python3.10/site-packages/aiogram/fsm/storage/pymongo.py__init__   s   
zPyMongoStorage.__init__urlconnection_kwargskwargsc                 K   s.   |du ri }t |fi |}| dd|i|S )al  
        Create an instance of :class:`PyMongoStorage` with specifying the connection string

        :param url: for example :code:`mongodb://user:password@host:port`
        :param connection_kwargs: see :code:`pymongo` docs
        :param kwargs: arguments to be passed to :class:`PyMongoStorage`
        :return: an instance of :class:`PyMongoStorage`
        Nr   r   r   )clsr    r!   r"   r   r   r   r   from_url)   s   zPyMongoStorage.from_urlc                    s   | j  I dH S )z5Cleanup client resources and disconnect from MongoDB.N)r   close)r   r   r   r   r%   :   s   zPyMongoStorage.closevaluec                 C   s$   |d u rd S t |tr|jS t|S N)
isinstancer
   statestr)r   r&   r   r   r   resolve_state>   s
   
zPyMongoStorage.resolve_statekeyr)   c                    s   | j |}|d u r3| jjd|idddiiddiddI d H }|i kr1| jd|iI d H  d S d S | jjd|idd| |iidd	I d H  d S )
N_id$unsetr)      r   Tfilterupdate
projectionreturn_document$setr1   r2   upsert)r   buildr   find_one_and_update
delete_one
update_oner+   )r   r,   r)   document_idupdatedr   r   r   	set_stateE   s"   
zPyMongoStorage.set_statec                    sD   | j |}| jd|iI d H }|d u rd S ttt |dS )Nr-   r)   )r   r8   r   find_oner   r   r*   getr   r,   r<   documentr   r   r   	get_stateW   s   zPyMongoStorage.get_statedatac                    s   t |tstdt|j | j|}|s@| jjd|idddiiddiddI d H }|i kr>| j	d|iI d H  d S d S | jj
d|id	d|iidd
I d H  d S )Nz-Data must be a dict or dict-like object, got r-   r.   rD   r/   r   Tr0   r5   r6   )r(   dictr	   type__name__r   r8   r   r9   r:   r;   )r   r,   rD   r<   r=   r   r   r   set_data^   s*   


zPyMongoStorage.set_datac                    sP   | j |}| jd|iI d H }|d u s|dsi S ttttf |d S )Nr-   rD   )	r   r8   r   r?   r@   r   r   r*   r   rA   r   r   r   get_datau   s   zPyMongoStorage.get_datac                    s|   | j |}dd | D }| jjd|id|iddddidI d H }|s1| jd|iI d H  tttt	f |
di S )	Nc                 S   s   i | ]
\}}d | |qS )zdata.r   ).0r,   r&   r   r   r   
<dictcomp>~   s    z.PyMongoStorage.update_data.<locals>.<dictcomp>r-   r5   Tr   )r1   r2   r7   r4   r3   rD   )r   r8   itemsr   r9   r:   r   r   r*   r   r@   )r   r,   rD   r<   update_withupdate_resultr   r   r   update_data|   s   zPyMongoStorage.update_data)Nr   r   r'   )r   N)rG   
__module____qualname____doc__r   r   r   r   r*   r   classmethodr   r$   r%   r   r+   r   r>   rC   r   rH   rI   rO   r   r   r   r   r      sD    

*r   N)typingr   r   r   r   r   pymongor   aiogram.exceptionsr	   aiogram.fsm.stater
   aiogram.fsm.storage.baser   r   r   r   r   r   r   r   r   r   <module>   s    	