Ë
    ±ŒjËF  ã                  óÜ   — d dl mZ d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZmZmZ ddlmZ dd	lmZmZmZ  G d
„ deeee«      Z ed¬«       e	dd¬«       G d„ de«      «       «       Zy)é    )ÚannotationsN)ÚABCÚabstractmethod)ÚversionaddedÚversionchanged)ÚMongoClientÚMongoCollectionÚMongoDatabaseÚcasté   )Úget_dependencyé   )ÚMovingWindowSupportÚSlidingWindowCounterSupportÚStoragec                  óX  ‡ — e Zd ZdZdgZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zedd„«       Zedd„«       Zedd„«       Z	edd„«       Z
e	 	 	 	 	 	 dd„«       Ze	 	 dd	„«       Zdd
„Zdd„Zd d„Zd!d„Zd"d„Zd#d$d„Zd%d„Zd&d„Zd#d'd„Z	 	 	 	 	 	 d(d„Z	 d#	 	 	 	 	 	 	 	 	 d'd„Zd)d„Zdd„Zˆ xZS )*ÚMongoDBStorageBasezV
    Rate limit storage with MongoDB as backend.

    Depends on :pypi:`pymongo`.
    Úpymongoc                óØ   •— t        ‰| �  |fd|i|¤Ž || _        ||dœ| _        | j                  d   j
                  | _        t        d«      \  | _        }|| _	        || _
        d| _        y)ai  
        :param uri: uri of the form ``mongodb://[user:password]@host:port?...``,
         This uri is passed directly to :class:`~pymongo.mongo_client.MongoClient`
        :param database_name: The database to use for storing the rate limit
         collections.
        :param counter_collection_name: The collection name to use for individual counters
         used in fixed window strategies
        :param window_collection_name: The collection name to use for sliding & moving window
         storage
        :param wrap_exceptions: Whether to wrap storage exceptions in
         :exc:`limits.errors.StorageError` before raising it.
        :param options: all remaining keyword arguments are passed to the
         constructor of :class:`~pymongo.mongo_client.MongoClient`
        :raise ConfigurationError: when the :pypi:`pymongo` library is not available
        Úwrap_exceptions)ÚcountersÚwindowsr   zpymongo.errorsN)ÚsuperÚ__init__Ú_database_nameÚ_collection_mappingÚdependenciesÚmoduleÚlibr   Ú
lib_errorsÚ_storage_uriÚ_storage_optionsÚ_storage)	ÚselfÚuriÚdatabase_nameÚcounter_collection_nameÚwindow_collection_namer   ÚoptionsÚ_Ú	__class__s	           €ú`/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/limits/storage/mongodb.pyr   zMongoDBStorageBase.__init__   sw   ø€ ô2 	‰Ñ˜ÑI¨oÐIÀÒIØ+ˆÔà/Ø-ñ$
ˆÔ ð ×$Ñ$ YÑ/×6Ñ6ˆŒÜ+Ð,<Ó=ÑˆŒ˜ØˆÔØ 'ˆÔØ,0ˆ�ó    c                óª   — | j                   €< | j                  | j                  fi | j                  ¤Ž| _         | j	                  «        | j                   S ©N)r#   Ú_init_mongo_clientr!   r"   Ú(_MongoDBStorageBase__initialize_database©r$   s    r,   ÚstoragezMongoDBStorageBase.storageD   sO   € à�=‰=Ð Ø3˜D×3Ñ3Ø×!Ñ!ñØ%)×%:Ñ%:ñˆDŒMð ×&Ñ&Ô(Ø�}‰}Ðr-   c                ó4   — | j                   | j                     S r/   )r3   r   r2   s    r,   Ú	_databasezMongoDBStorageBase._databaseM   s   € à�|‰|˜D×/Ñ/Ñ0Ð0r-   c                ó:   — | j                   | j                  d      S )Nr   ©r5   r   r2   s    r,   r   zMongoDBStorageBase.countersQ   s   € à�~‰~˜d×6Ñ6°zÑBÑCÐCr-   c                ó:   — | j                   | j                  d      S )Nr   r7   r2   s    r,   r   zMongoDBStorageBase.windowsU   s   € à�~‰~˜d×6Ñ6°yÑAÑBÐBr-   c                ó   — t        «       ‚r/   )ÚNotImplementedError©r$   r%   r)   s      r,   r0   z%MongoDBStorageBase._init_mongo_clientY   s   € ô "Ó#Ð#r-   c                ó.   — | j                   j                  S r/   )r    ÚPyMongoErrorr2   s    r,   Úbase_exceptionsz"MongoDBStorageBase.base_exceptions_   s   € ð �‰×+Ñ+Ð+r-   c                óx   — | j                   j                  dd¬«       | j                  j                  dd¬«       y )NÚexpireAtr   )ÚexpireAfterSeconds)r   Úcreate_indexr   r2   s    r,   Ú__initialize_databasez(MongoDBStorageBase.__initialize_databasee   s0   € Ø�‰×"Ñ" :À!Ð"ÔDØ�‰×!Ñ! *ÀÐ!ÕCr-   c                óî   — | j                   j                  i «      | j                  j                  i «      z   }| j                   j                  «        | j                  j                  «        t	        |«      S )z^
        Delete all rate limit keys in the rate limit collections (counters, windows)
        )r   Úcount_documentsr   ÚdropÚint)r$   Únum_keyss     r,   ÚresetzMongoDBStorageBase.reseti   sW   € ð —=‘=×0Ñ0°Ó4°t·|±|×7SÑ7SÐTVÓ7WÑWˆØ�‰×ÑÔØ�‰×ÑÔä�8‹}Ðr-   c                óx   — | j                   j                  d|i«       | j                  j                  d|i«       y)z>
        :param key: the key to clear rate limits for
        Ú_idN)r   Úfind_one_and_deleter   )r$   Úkeys     r,   ÚclearzMongoDBStorageBase.clears   s0   € ð 	�‰×)Ñ)¨5°#¨,Ô7Ø�‰×(Ñ(¨%°¨Õ6r-   c                óò   — | j                   j                  d|i«      }|r|d   nt        j                  j                  «       j	                  t        j
                  j                  ¬«      j                  «       S )z;
        :param key: the key to get the expiry for
        rK   r@   ©Útzinfo)r   Úfind_oneÚdatetimeÚnowÚreplaceÚtimezoneÚutcÚ	timestamp©r$   rM   Úcounters      r,   Ú
get_expiryzMongoDBStorageBase.get_expiryz   s[   € ð —-‘-×(Ñ(¨%°¨Ó6ˆá$+ˆW�ZÒ ´×1BÑ1B×1FÑ1FÓ1Hß‰WœH×-Ñ-×1Ñ1ˆWÓ2ß‰Y‹[ð	
r-   c                óÌ   — | j                   j                  |dt        j                  j                  t        j                  j
                  «      idœdg¬«      }|xr |d   xs dS )zB
        :param key: the key to get the counter value for
        ú$gte)rK   r@   Úcount)Ú
projectionr   )r   rR   rS   rT   rV   rW   rY   s      r,   ÚgetzMongoDBStorageBase.get…   sh   € ð —-‘-×(Ñ(àØ#¤X×%6Ñ%6×%:Ñ%:¼8×;LÑ;L×;PÑ;PÓ%QÐRñð  �yð )ó 
ˆð Ò+˜7 7Ñ+Ò0¨qÐ0r-   c           
     ó~  — t         j                   j                  t         j                  j                  «      t        j                  |¬«      z   }| j
                  j                  d|idddddgi|dd	|gid
œiddddgi|dd
œidœigddg| j                  j                  j                  ¬«      x}rt        |d   «      S y)zá
        increments the counter for a given rate limit key

        :param key: the key to increment
        :param expiry: amount in seconds for the key to expire in
        :param amount: the number to increment by
        ©ÚsecondsrK   ú$setú$condz$ltú	$expireAtú$$NOWú$addz$count©ÚifÚthenÚelse)r^   r@   Tr^   )Úupsertr_   Úreturn_documentr   )rS   rT   rV   rW   Ú	timedeltar   Úfind_one_and_updater   ÚReturnDocumentÚAFTERrG   )r$   rM   ÚexpiryÚamountÚ
expirationÚresponses         r,   ÚincrzMongoDBStorageBase.incr“   sú   € ô ×&Ñ&×*Ñ*¬8×+<Ñ+<×+@Ñ+@ÓAÄH×DVÑDVØôE
ñ 
ˆ
ð —}‘}×8Ñ8Ø�CˆLð à#Ø',¨{¸GÐ.DÐ&EØ(.Ø)/°(¸FÐ1CÐ(Dñ&ð"ð $Ø',¨{¸GÐ.DÐ&EØ(2Ø(3ñ&ð%ñððð( Ø�yØ ŸH™H×3Ñ3×9Ñ9ð1 9ó 
ð 
ˆ8ð 
ô4 �x Ñ(Ó)Ð)Ør-   c                óH   — 	 | j                   j                  «        y#  Y yxY w)zm
        Check if storage is healthy by calling :meth:`pymongo.mongo_client.MongoClient.server_info`
        TF)r3   Úserver_infor2   s    r,   ÚcheckzMongoDBStorageBase.check¼   s$   € ð	Ø�L‰L×$Ñ$Ô&àøð	Ùús   ‚ �!c                óà   — t        j                   «       }t        | j                  j                  dd|iiddddddd	||z
  gid
œiiidddiddidœig«      «      x}r|d   d   |d   d   fS |dfS )zí
        returns the starting point and the number of entries in the moving
        window

        :param key: rate limit key
        :param expiry: expiry of entry
        :return: (start of window, number of acquired entries)
        z$matchrK   z$projectÚfilteredEntriesz$filterz$entriesÚentryr]   z$$entry)ÚinputÚasÚcondz$minz$filteredEntriesz$size)Úminr^   r   r�   r^   )ÚtimeÚlistr   Ú	aggregate)r$   rM   Úlimitrs   rX   Úresults         r,   Úget_moving_windowz$MongoDBStorageBase.get_moving_windowÇ   sÅ   € ô —I‘I“Kˆ	ÜØ�L‰L×"Ñ"à  s˜|Ð,à"Ø-Ø )Ø-7Ø*1Ø-3°iÀÈVÑASÐ5TÐ,Uñ,"ð0ð%ð
ð #Ø$*Ð,>Ð#?Ø&-Ð/AÐ%Bñ%ððóó
ð 
ˆ6ð 
ð0 ˜!‘9˜UÑ# V¨A¡Y¨wÑ%7Ð7Ð7Ø˜!ˆ|Ðr-   c           	     ó¤  — ||kD  ryt        j                   «       }	 d|g|z  d|dœidt        j                  j                  t        j                  j                  «      t        j
                  |¬«      z   idœ}| j                  j                  d|d	||z
  › �d
d||z
  iii|d¬«       y# | j                  j                  j                  $ r Y yw xY w)zÖ
        :param key: rate limit key to acquire an entry in
        :param limit: amount of entries allowed
        :param expiry: expiry of the entry
        :param amount: the number of entries to acquire
        FÚentriesr   )z$eachz	$positionz$slicer@   rb   )z$pushrd   rK   zentries.z$notr]   T)rm   )r‚   rS   rT   rV   rW   ro   r   Ú
update_oner   ÚerrorsÚDuplicateKeyError)r$   rM   r…   rs   rt   rX   Úupdatess          r,   Úacquire_entryz MongoDBStorageBase.acquire_entryì   sô   € ð �EŠ>Øä—I‘I“Kˆ	ð	ð Ø"+ ¨vÑ!5Ø%&Ø"'ñ ðð Ü ×)Ñ)×-Ñ-¬h×.?Ñ.?×.CÑ.CÓDÜ"×,Ñ,°VÔ<ñ=ðñð ð& �L‰L×#Ñ#à˜3Ø˜u v™~Ð.Ð/°&¸6À9ÈvÑCUÐ:VÐ1Wðð Øð $ô ð øØ�x‰x�‰×0Ñ0ò 	Ùð	ús   œBB) Â)#CÃCc                ó\  — |dz  }| j                   j                  d|iddddddgi|gid	d
dgid	ddgidœidddddgi|gidd	d
dgidœidddddgi|gidd|giddœidœig| j                  j                  j                  g d¢¬«      x}r£|j                  d«      r;|d   j                  t        j                  j                  ¬«      j                  «       nt        j                  «       }t        d|t        j                  «       z
  «      }t        d|d   r||z
  nd«      }|d   ||d   |fS y)Néè  rK   rd   re   ú$lteú	$subtractrf   rg   ú$ifNullú$currentCountr   ú$previousCountri   rh   )ÚpreviousCountÚcurrentCountr@   )r—   r–   r@   )rn   r_   r@   rP   r–   r—   )r   ç        r   r˜   )r   rp   r   rq   rr   r`   rU   rS   rV   rW   rX   r‚   Úmax)r$   rM   rs   Ú	expiry_msr†   Ú
expires_atÚcurrent_ttlÚprev_ttls           r,   Úget_sliding_windowz%MongoDBStorageBase.get_sliding_window  sÑ  € ð ˜T‘Mˆ	Ø—\‘\×5Ñ5Ø�CˆLð à#à$*Ø)4°{ÀGÐ6LÐ(MØ(1ð-&ð'"ð *3°_ÀaÐ4HÐ(IØ)2Ð5EÀqÐ4IÐ(Jñ	&ð*ð $à$*Ø)4°{ÀGÐ6LÐ(MØ(1ð-&ð'"ð )*Ø)2°_ÀaÐ4HÐ(Iñ	&ð)ð $à$*Ø)4°{ÀGÐ6LÐ(MØ(1ð-&ð'"ð %+¨[¸)Ð,Dð)"ð )4ñ&ð%ñ3'ð)ð+ðX !ŸH™H×3Ñ3×9Ñ9ÚDð_ 6ó 0
ð 0
ˆ6ð 0
ðf —:‘:˜jÔ)ð ˜
Ñ#×+Ñ+´8×3DÑ3D×3HÑ3HÐ+ÓI×SÑSÔUä—Y‘Y“[ð ô
 ˜a ¬d¯i©i«kÑ!9Ó:ˆKÜ˜1°f¸_Ò6M˜k¨FÒ2ÐSTÓUˆHð �Ñ'ØØ�~Ñ&Øð	ð ð r-   c                óú  — |dz  }| j                   j                  d|iddddddd	gi|gid
ddgid
ddgidœiiidddddd	gi|gidd
ddgidœiddddd	gi|giddddgidd|gidd	d|z  gidœiddœidœiddddddddddddd	|gigigi|gigidgiiiidddddd|gi|gidd|giddœiiiddddd|gi|giiiddgig| j                  j                  j                  d¬«      }t        t        |r	|d   «      S d«      S )Nr�   rK   rd   r–   re   r‘   r’   rf   rg   r“   r”   r   r•   ri   z$gtrh   r   )r—   r@   ÚcurWeightedCountz$floorz	$multiplyz$dividez$maxr—   z$curWeightedCountÚ	_acquiredz$unsetT)rn   rm   F)r   rp   r   rq   rr   r   Úbool)r$   rM   r…   rs   rt   rš   r†   s          r,   Úacquire_sliding_window_entryz/MongoDBStorageBase.acquire_sliding_window_entry]  s�  € ð ˜T‘Mˆ	Ø—‘×1Ñ1Ø�CˆLð Ø'Ø#à$*Ø)4°{ÀGÐ6LÐ(MØ(1ð-&ð'"ð *3°_ÀaÐ4HÐ(IØ)2Ð5EÀqÐ4IÐ(Jñ	&ð*ððð" à#à$*Ø)4°{ÀGÐ6LÐ(MØ(1ð-&ð'"ð )*Ø)2°_ÀaÐ4HÐ(Iñ	&ð)ð $à$*Ø)4°{ÀGÐ6LÐ(MØ(1ð-&ð'"ð %,Ø/4°{ÀAÐ6FÐ.GØ17¸+ÀyÐ9QÐ0RØ17¸'À1ÀyÁ=Ð9QÐ0Rñ.&ð)"ð )4ñ&ð%ñð!ðF Ø*Ø$Ø &à(3Ø,<à09à8>Ø<=à@KØDOàHNØLSØLUðQJðEFðNBð
=>ðA:ð56ð  5>ð#<2ð-.ð6*ð%&ð4 %4ð7)"ð'ð -ð"ð$ðL Ø&Ø#à$*Ø)/Ð2EÀvÐ1NÐ(OØ(-ð-&ð'"ð *0°/À6Ð1JÐ(KØ(7ñ	&ð)ððð" Ø#Ø" fÐ/BÀFÐ.KÐ%LÈeÐ$Tð&ððð Ð.Ð/Ð0ð_pðb !ŸH™H×3Ñ3×9Ñ9Øði 2ó u
ˆôl ”D±˜& Ñ-ÓCÐC¸UÓCÐCr-   c                ó$   — | j                  |«      S r/   )rN   )r$   rM   rs   s      r,   Úclear_sliding_windowz'MongoDBStorageBase.clear_sliding_windowÙ  s   € Ø�z‰z˜#‹Ðr-   c                óR   — | j                   r| j                   j                  «        y y r/   )r3   Úcloser2   s    r,   Ú__del__zMongoDBStorageBase.__del__Ü  s   € Ø�<Š<Ø�L‰L×ÑÕ ð r-   )Úlimitsr   r   F)r%   Ústrr&   rª   r'   rª   r(   rª   r   r¢   r)   úint | str | boolÚreturnÚNone)r¬   r   )r¬   r
   )r¬   r	   ©r%   z
str | Noner)   r«   r¬   r   )r¬   z-type[Exception] | tuple[type[Exception], ...])r¬   r­   )r¬   z
int | None)rM   rª   r¬   r­   )rM   rª   r¬   Úfloat)rM   rª   r¬   rG   )r   )rM   rª   rs   rG   rt   rG   r¬   rG   )r¬   r¢   )rM   rª   r…   rG   rs   rG   r¬   ztuple[float, int])
rM   rª   r…   rG   rs   rG   rt   rG   r¬   r¢   )rM   rª   rs   rG   r¬   ztuple[int, float, int, float])rM   rª   rs   rG   r¬   r­   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚDEPENDENCIESr   Úpropertyr3   r5   r   r   r   r0   r>   r1   rI   rN   r[   r`   rw   rz   r‡   rŽ   rž   r£   r¥   r¨   Ú__classcell__)r+   s   @r,   r   r      s£  ø„ ñð �;€Lð
 &Ø'1Ø&/Ø %ð#1àð#1ð ð#1ð "%ð	#1ð
 !$ð#1ð ð#1ð $ð#1ð 
õ#1ðJ òó ðð ò1ó ð1ð òDó ðDð òCó ðCð ð$Øð$Ø*:ð$à	ò$ó ð$ð
 ð,à	6ò,ó ð,ó
Dóó7ó	
ó1ô'óR	ó#ôJ*ðXCØðCØ #ðCà	&óCðL @AðzDØðzDØ"ðzDØ,/ðzDØ9<ðzDà	ózDóx÷!r-   r   z2.1)Úversionz3.14.0zEAdded option to select custom collection names for windows & counters)r·   Úreasonc                  ó(   — e Zd ZddgZ	 	 	 	 	 	 dd„Zy)ÚMongoDBStorageÚmongodbzmongodb+srvc                óX   — t        t         | j                  j                  |fi |¤Ž«      S r/   )r   r   r   r;   s      r,   r0   z!MongoDBStorage._init_mongo_clienté  s(   € ô ”KÐ!5 §¡×!5Ñ!5°cÑ!E¸WÑ!EÓFÐFr-   Nr®   )r°   r±   r²   ÚSTORAGE_SCHEMEr0   © r-   r,   rº   rº   á  s/   „ ð   Ð/€NðGØðGØ*:ðGà	ôGr-   rº   )Ú
__future__r   rS   r‚   Úabcr   r   Údeprecated.sphinxr   r   Úlimits.typingr   r	   r
   r   Úutilr   Úbaser   r   r   r   rº   r¾   r-   r,   Ú<module>rÅ      sx   ðÝ "ã Û ß #ç :÷ó õ "ß KÑ KôJ!ØÐ Ð"=¸sôJ!ñZ �eÔÙØØRôôGÐ'ó Gó	ó ñ
Gr-   