Ë
    ±Œj4K  ã            	      óØ   — d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZ d dlmZmZmZ d dlmZ  ed«      Z ed«      Z ed	¬
«       edd¬«       G d„ dee	e
«      «       «       Zy)é    )ÚannotationsN)ÚversionaddedÚversionchanged)ÚMovingWindowSupportÚSlidingWindowCounterSupportÚStorage)Ú	ParamSpecÚTypeVarÚcast)Úget_dependencyÚPÚRz2.1)Úversionz3.14.0zEAdded option to select custom collection names for windows & counters)r   Úreasonc                  ó2  ‡ — e Zd ZdZddgZ	 ddgZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Ze	 	 dd„«       Ze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"d„Z	 	 	 	 	 	 d#d„Zd$d„Zdd„Zˆ xZS )%ÚMongoDBStoragezS
    Rate limit storage with MongoDB as backend.

    Depends on :pypi:`motor`
    úasync+mongodbzasync+mongodb+srvúmotor.motor_asyncioÚpymongoc                óŒ  •— |j                  ddd«      }t        ‰| �  |fd|i|¤Ž | j                  d   | _        | j                  d   | _        t        d«      \  | _        } | j                  j                  j                  |fi |¤Ž| _
        t        j                  | j                  _        || _        ||dœ| _        d	| _        y
)aŽ  
        :param uri: uri of the form ``async+mongodb://[user:password]@host:port?...``,
         This uri is passed directly to :class:`~motor.motor_asyncio.AsyncIOMotorClient`
        :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:`~motor.motor_asyncio.AsyncIOMotorClient`
        :raise ConfigurationError: when the :pypi:`motor` or :pypi:`pymongo` are
         not available
        r   Úmongodbé   Úwrap_exceptionsr   r   zpymongo.errors)ÚcountersÚwindowsFN)ÚreplaceÚsuperÚ__init__ÚdependenciesÚ
dependencyÚproxy_dependencyr   Ú
lib_errorsÚmoduleÚAsyncIOMotorClientÚstorageÚasyncioÚget_running_loopÚget_io_loopÚ_MongoDBStorage__database_nameÚ#_MongoDBStorage__collection_mappingÚ _MongoDBStorage__indices_created)	ÚselfÚuriÚdatabase_nameÚcounter_collection_nameÚwindow_collection_namer   ÚoptionsÚ_Ú	__class__s	           €úd/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/limits/aio/storage/mongodb.pyr   zMongoDBStorage.__init__,   s¿   ø€ ð4 �k‰k˜/¨9°aÓ8ˆä‰Ñ˜ÑI¨oÐIÀÒIà×+Ñ+Ð,AÑBˆŒØ $× 1Ñ 1°)Ñ <ˆÔÜ+Ð,<Ó=ÑˆŒ˜à@�t—‘×-Ñ-×@Ñ@ÀÑPÈÑPˆŒô $+×#;Ñ#;ˆ�‰Ô à,ˆÔà/Ø-ñ%
ˆÔ!ð "'ˆÕó    c                ó.   — | j                   j                  S ©N)r"   ÚPyMongoError©r,   s    r4   Úbase_exceptionszMongoDBStorage.base_exceptions[   s   € ð �‰×+Ñ+Ð+r5   c                óL   — | j                   j                  | j                  «      S r7   )r%   Úget_databaser)   r9   s    r4   ÚdatabasezMongoDBStorage.databasea   s   € à�|‰|×(Ñ(¨×)=Ñ)=Ó>Ð>r5   c              ƒ  ó  K  — | j                   stt        j                  | j                  | j                  d      j                  dd¬«      | j                  | j                  d      j                  dd¬«      «      ƒ d {  –—†  d| _         y 7 Œ­w)Nr   ÚexpireAtr   )ÚexpireAfterSecondsr   T)r+   r&   Úgatherr=   r*   Úcreate_indexr9   s    r4   Úcreate_indiceszMongoDBStorage.create_indicese   s�   è ø€ Ø×%Ò%Ü—.‘.Ø—‘˜d×7Ñ7¸
ÑCÑD×QÑQØ°1ð Ró ð —‘˜d×7Ñ7¸	ÑBÑC×PÑPØ°1ð Qó ó	÷ ð ð "&ˆÕðús   ‚A<BÁ>BÁ?Bc              ƒ  ó   K  — t        t        j                  | j                  | j                  d      j                  i «      | j                  | j                  d      j                  i «      «      ƒ d{  –—† «      }t        j                  | j                  | j                  d      j                  «       | j                  | j                  d      j                  «       «      ƒ d{  –—†  t        t        |«      S 7 Œ†7 Œ­w)z^
        Delete all rate limit keys in the rate limit collections (counters, windows)
        r   r   N)	Úsumr&   rA   r=   r*   Úcount_documentsÚdropr   Úint)r,   Únum_keyss     r4   ÚresetzMongoDBStorage.resetq   sß   è ø€ ô Ü—.‘.Ø—‘˜d×7Ñ7¸
ÑCÑD×TÑTØóð —‘˜d×7Ñ7¸	ÑBÑC×SÑSÐTVÓWó	÷ ó
ˆô �n‰nØ�M‰M˜$×3Ñ3°JÑ?Ñ@×EÑEÓGØ�M‰M˜$×3Ñ3°IÑ>Ñ?×DÑDÓFó
÷ 	
ð 	
ô
 ”C˜Ó"Ð"ðøð	
ús%   ‚A1C>Á3C:Á4A1C>Ã%C<Ã&C>Ã<C>c              ƒ  óø   K  — t        j                  | j                  | j                  d      j	                  d|i«      | j                  | j                  d      j	                  d|i«      «      ƒ d{  –—†  y7 Œ­w)z>
        :param key: the key to clear rate limits for
        r   Ú_idr   N)r&   rA   r=   r*   Úfind_one_and_delete)r,   Úkeys     r4   ÚclearzMongoDBStorage.clear„   sr   è ø€ ô �n‰nØ�M‰M˜$×3Ñ3°JÑ?Ñ@×TÑTØ˜�óð �M‰M˜$×3Ñ3°IÑ>Ñ?×SÑSØ˜�óó	
÷ 	
ò 	
ús   ‚A0A:Á2A8Á3A:c              ƒ  ó.  K  — | j                   | j                  d      j                  d|i«      ƒ d{  –—† }|r|d   nt        j                  j	                  «       j                  t        j                  j                  ¬«      j                  «       S 7 Œ_­w)z;
        :param key: the key to get the expiry for
        r   rL   Nr?   ©Útzinfo)	r=   r*   Úfind_oneÚdatetimeÚnowr   ÚtimezoneÚutcÚ	timestamp©r,   rN   Úcounters      r4   Ú
get_expiryzMongoDBStorage.get_expiry‘   s~   è ø€ ð Ÿ™ d×&?Ñ&?À
Ñ&KÑL×UÑUØ�CˆLó
÷ 
ˆñ %,ˆW�ZÒ ´×1BÑ1B×1FÑ1FÓ1Hß‰WœH×-Ñ-×1Ñ1ˆWÓ2ß‰Y‹[ð	
ð
ús   ‚1B³B´A Bc              ƒ  ó  K  — | j                   | j                  d      j                  |dt        j                  j	                  t        j
                  j                  «      idœdg¬«      ƒ d{  –—† }|xr |d   xs dS 7 Œ­w)zB
        :param key: the key to get the counter value for
        r   ú$gte)rL   r?   Úcount)Ú
projectionNr   )r=   r*   rS   rT   rU   rV   rW   rY   s      r4   ÚgetzMongoDBStorage.getž   s‡   è ø€ ð Ÿ™ d×&?Ñ&?À
Ñ&KÑL×UÑUàØ#¤X×%6Ñ%6×%:Ñ%:¼8×;LÑ;L×;PÑ;PÓ%QÐRñð  �yð Vó 
÷ 
ˆð Ò+˜7 7Ñ+Ò0¨qÐ0ð
ús   ‚A,BÁ.B Á/Bc           
   ƒ  óü  K  — | j                  «       ƒ d{  –—†  t        j                  j                  t        j                  j                  «      t        j
                  |¬«      z   }| j                  | j                  d      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                  j                  ¬«      ƒ d{  –—† }t        |d   «      S 7 Œá7 Œ­w)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
        N©Úsecondsr   rL   ú$setú$condz$ltú	$expireAtú$$NOWú$addz$count©ÚifÚthenÚelse)r^   r?   Tr^   )Úupsertr_   Úreturn_document)rC   rT   rU   rV   rW   Ú	timedeltar=   r*   Úfind_one_and_updater!   r#   ÚReturnDocumentÚAFTERrH   )r,   rN   ÚexpiryÚamountÚ
expirationÚresponses         r4   ÚincrzMongoDBStorage.incr¬   s/  è ø€ ð ×!Ñ!Ó#×#Ð#ä×&Ñ&×*Ñ*¬8×+<Ñ+<×+@Ñ+@ÓAÄH×DVÑDVØôE
ñ 
ˆ
ð Ÿ™Ø×%Ñ% jÑ1ñ
ç
Ñ
Ø�CˆLð à#Ø',¨{¸GÐ.DÐ&EØ(.Ø)/°(¸FÐ1CÐ(Dñ&ð"ð $Ø',¨{¸GÐ.DÐ&EØ(2Ø(3ñ&ð%ñððð( Ø�yØ ×1Ñ1×8Ñ8×GÑG×MÑMð1 ó 
÷
ˆô: �8˜GÑ$Ó%Ð%ðG 	$øð
ús"   ‚C<–C8—CC<Ã%C:Ã&C<Ã:C<c              ƒ  ód   K  — 	 | j                   j                  «       ƒ d{  –—†  y7 Œ#  Y yxY w­w)z{
        Check if storage is healthy by calling
        :meth:`motor.motor_asyncio.AsyncIOMotorClient.server_info`
        NTF)r%   Úserver_infor9   s    r4   ÚcheckzMongoDBStorage.checkÙ   s2   è ø€ ð
	Ø—,‘,×*Ñ*Ó,×,Ð,àð -ùð	Ùüs    ‚0„) ¡'¢) ¦0§) ©-«0c              ƒ  ó*  K  — t        j                   «       }| j                  | j                  d      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«      j	                  d¬«      ƒ d{  –—† x}r|d   d   |d   d   fS |dfS 7 Œ­w)zõ
        returns the starting point and the number of entries in the moving
        window

        :param str key: rate limit key
        :param int expiry: expiry of entry
        :return: (start of window, number of acquired entries)
        r   z$matchrL   z$projectÚfilteredEntriesz$filterz$entriesÚentryr]   z$$entry)ÚinputÚasÚcondz$minz$filteredEntriesz$size)Úminr^   r   )ÚlengthNr   r�   r^   )Útimer=   r*   Ú	aggregateÚto_list)r,   rN   Úlimitrs   rX   Úresults         r4   Úget_moving_windowz MongoDBStorage.get_moving_windowå   sè   è ø€ ô —I‘I“Kˆ	à ŸM™M¨$×*CÑ*CÀIÑ*NÑOß‰Yà  s˜|Ð,à"Ø-Ø )Ø-7Ø*1Ø-3°iÀÈVÑASÐ5TÐ,Uñ,"ð0ð%ð
ð #Ø$*Ð,>Ð#?Ø&-Ð/AÐ%Bñ%ððó÷, ‰W˜AˆWÓ÷/ð ˆFð ð2 ˜!‘9˜UÑ# V¨A¡Y¨wÑ%7Ð7Ð7Ø˜!ˆ|Ðð5ús   ‚A4BÁ6BÁ7Bc           	   ƒ  ó(  K  — | j                  «       ƒ d{  –—†  ||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	      j                  d
|d||z
  › �dd||z
  iii|d¬«      ƒ d{  –—†  y7 ŒÄ7 Œ# | j                  j                  j                  j                  $ r Y yw xY w­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
        NFÚentriesr   )z$eachz	$positionz$slicer?   rb   )z$pushrd   r   rL   zentries.z$notr]   T)rm   )rC   rƒ   rT   rU   rV   rW   ro   r=   r*   Ú
update_oner!   r#   ÚerrorsÚDuplicateKeyError)r,   rN   r†   rs   rt   rX   Úupdatess          r4   Úacquire_entryzMongoDBStorage.acquire_entry  s<  è ø€ ð ×!Ñ!Ó#×#Ð#à�EŠ>Øä—I‘I“Kˆ	ð	ð Ø"+ ¨vÑ!5Ø%&Ø"'ñ ðð Ü ×)Ñ)×-Ñ-¬h×.?Ñ.?×.CÑ.CÓDÜ"×,Ñ,°VÔ<ñ=ðñð ð& —-‘- × 9Ñ 9¸)Ñ DÑE×PÑPà˜3Ø˜u v™~Ð.Ð/°&¸6À9ÈvÑCUÐ:VÐ1Wðð Øð Qó ÷ ð ð ðG 	$øð4ùð ×$Ñ$×+Ñ+×2Ñ2×DÑDò 	Ùð	üsE   ‚D–C—D¶BC ÃCÃC ÃDÃC Ã-DÄDÄDÄDc              ƒ  óp  K  — | j                  «       ƒ d {  –—†  |dz  }| j                  | j                  d      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                  j                  d¬«      ƒ d {  –—† }t        t        |d   «      S 7 �Œ7 Œ­w)Néè  r   rL   rd   ÚpreviousCountre   ú$lteú	$subtractrf   rg   ú$ifNullú$currentCountr   ú$previousCountri   z$gtrh   é   )ÚcurrentCountr?   ÚcurWeightedCountz$floorz	$multiplyz$dividez$maxr™   z$curWeightedCountÚ	_acquiredz$unsetT)rn   rm   )
rC   r=   r*   rp   r!   r#   rq   rr   r   Úbool)r,   rN   r†   rs   rt   Ú	expiry_msr‡   s          r4   Úacquire_sliding_window_entryz+MongoDBStorage.acquire_sliding_window_entry?  sÊ  è ø€ ð ×!Ñ!Ó#×#Ð#Ø˜T‘Mˆ	Ø—}‘}Ø×%Ñ% iÑ0ñ
ç
Ñ
Ø�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 !×1Ñ1×8Ñ8×GÑG×MÑMØði ó u
÷w
ˆôr ”D˜& Ñ-Ó.Ð.ðw 	$ùðw
ús"   ‚D6–D1—DD6ÄD4ÄD6Ä4D6c              ƒ  ó¬  K  — |dz  }| j                   | j                  d      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
                  j                  g d¢¬«      ƒ 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7 Œª­w)Nr‘   r   rL   rd   re   r“   r”   rf   rg   r•   r–   r   r—   ri   rh   )r’   r™   r?   )r™   r’   r?   )rn   r_   r?   rQ   r’   r™   )r   ç        r   r    )r=   r*   rp   r!   r#   rq   rr   r`   r   rT   rV   rW   rX   rƒ   Úmax)r,   rN   rs   r�   r‡   Ú
expires_atÚcurrent_ttlÚprev_ttls           r4   Úget_sliding_windowz!MongoDBStorage.get_sliding_window¿  s÷  è ø€ ð ˜T‘Mˆ	ØŸ=™=Ø×%Ñ% iÑ0ñ
ç
Ñ
Ø�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ð-&ð'"ð *0°+¸yÐ1IÐ(JØ(3ñ	&ð%ñ3%ð'ð)ðT !×1Ñ1×8Ñ8×GÑG×MÑMÚDð[ ó .
÷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ð �Ñ'ØØ�~Ñ&Øð	ð ð ð0
ús   ‚B%EÂ'EÂ(B+Ec              ƒ  ó@   K  — | j                  |«      ƒ d {  –—† S 7 Œ­wr7   )rO   )r,   rN   rs   s      r4   Úclear_sliding_windowz#MongoDBStorage.clear_sliding_window  s   è ø€ Ø—Z‘Z “_×$Ð$Ð$ús   ‚—˜c                óX   — | j                   xr | j                   j                  «        y  y r7   )r%   Úcloser9   s    r4   Ú__del__zMongoDBStorage.__del__  s   € Ø�‰Ò-˜Ÿ™×+Ñ+Õ-Ñ-r5   )Úlimitsr   r   F)r-   Ústrr.   r¬   r/   r¬   r0   r¬   r   rœ   r1   zfloat | str | boolÚreturnÚNone)r­   z-type[Exception] | tuple[type[Exception], ...])r­   r®   )r­   z
int | None)rN   r¬   r­   r®   )rN   r¬   r­   Úfloat)rN   r¬   r­   rH   )r   )rN   r¬   rs   rH   rt   rH   r­   rH   )r­   rœ   )rN   r¬   r†   rH   rs   rH   r­   ztuple[float, int])
rN   r¬   r†   rH   rs   rH   rt   rH   r­   rœ   )rN   r¬   rs   rH   r­   ztuple[int, float, int, float])rN   r¬   rs   rH   r­   r®   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSTORAGE_SCHEMEÚDEPENDENCIESr   Úpropertyr:   r=   rC   rJ   rO   r[   r`   rw   rz   rˆ   r�   rž   r¥   r§   rª   Ú__classcell__)r3   s   @r4   r   r      s”  ø„ ñð &Ð':Ð;€Nðð *¨9Ð5€Lð
 &Ø'1Ø&/Ø %ð-'àð-'ð ð-'ð "%ð	-'ð
 !$ð-'ð ð-'ð &ð-'ð 
õ-'ð^ ð,à	6ò,ó ð,ð
 ñ?ó ð?ó
&ó#ó&
ó
ó1ô+&óZ
ð(Øð(Ø"ð(Ø,/ð(à	ó(ðV @Að.Øð.Ø"ð.Ø,/ð.Ø9<ð.à	ó.ðb @Að~/Øð~/Ø"ð~/Ø,/ð~/Ø9<ð~/à	ó~/ð@CØðCØ #ðCà	&óCóJ%÷.r5   r   )Ú
__future__r   r&   rT   rƒ   Údeprecated.sphinxr   r   Úlimits.aio.storage.baser   r   r   Úlimits.typingr	   r
   r   Úlimits.utilr   r   r   r   © r5   r4   Ú<module>r¾      s{   ðÝ "ã Û Û ç :÷ñ ÷
ñ õ
 'áˆcƒN€ÙˆCƒL€ñ �eÔÙØØRôôj.�WÐ1Ð3Nó j.ó	ó ñ
j.r5   