o
    Fh                     @   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AsyncIOMotorClient)DataNotDictLikeError)State)BaseStorageDefaultKeyBuilder
KeyBuilder	StateType
StorageKeyc                   @   s  e Zd ZdZ			d#d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 )&MongoStoragez

    .. warning::
        DEPRECATED: Use :class:`PyMongoStorage` instead.
        This class will be removed in future versions.


    MongoDB storage required :code:`motor` package installed (:code:`pip install motor`)
    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 AsyncIOMotorClient
        :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   L/var/www/html/venv/lib/python3.10/site-packages/aiogram/fsm/storage/mongo.py__init__   s   
zMongoStorage.__init__urlconnection_kwargskwargsc                 K   s.   |du ri }t |fi |}| dd|i|S )ad  
        Create an instance of :class:`MongoStorage` with specifying the connection string

        :param url: for example :code:`mongodb://user:password@host:port`
        :param connection_kwargs: see :code:`motor` docs
        :param kwargs: arguments to be passed to :class:`MongoStorage`
        :return: an instance of :class:`MongoStorage`
        Nr   r   r   )clsr    r!   r"   r   r   r   r   from_url/   s   zMongoStorage.from_urlc                    s   | j   dS )z5Cleanup client resources and disconnect from MongoDB.N)r   close)r   r   r   r   r%   @   s   zMongoStorage.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_stateD   s
   
zMongoStorage.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_stateK   s"   
zMongoStorage.set_statec                    s:   | j |}| jd|iI d H }|d u rd S |dS )Nr-   r)   )r   r8   r   find_onegetr   r,   r<   documentr   r   r   	get_state]   s   
zMongoStorage.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_datad   s*   


zMongoStorage.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_data{   s   zMongoStorage.get_datac                    sn   | 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  |di S )	Nc                 S   s   i | ]
\}}d | |qS )zdata.r   ).0r,   r&   r   r   r   
<dictcomp>   s    z,MongoStorage.update_data.<locals>.<dictcomp>r-   r5   Tr   )r1   r2   r7   r4   r3   rD   )r   r8   itemsr   r9   r:   r@   )r   r,   rD   r<   update_withupdate_resultr   r   r   update_data   s   zMongoStorage.update_data)Nr   r   r'   )r   N)rG   
__module____qualname____doc__r   r   r   r*   r   classmethodr   r   r$   r%   r   r+   r   r>   rC   r   rH   rI   rO   r   r   r   r   r      sD    

*r   N)typingr   r   r   r   r   motor.motor_asyncior   aiogram.exceptionsr	   aiogram.fsm.stater
   aiogram.fsm.storage.baser   r   r   r   r   r   r   r   r   r   <module>   s    	