§
    	ÊjÍ  ã                  ó
  — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZm Z m!Z!  eddg ee¦  «        g¬¦  «        Z"d^d„Z#e" $                    d¦  «         ee¦  «        fd_d„¦   «         Z%e" $                    d¦  «         ee¦  «        fd_d„¦   «         Z&e" '                    d¦  «         ee¦  «        fd`d"„¦   «         Z(e" )                    d#¦  «         ee¦  «        fdad%„¦   «         Z*e" +                    d#¦  «         ee¦  «        fdbd&„¦   «         Z,e" '                    d'¦  «         ee¦  «        fdbd(„¦   «         Z-e" '                    d)¦  «         ee¦  «        fdbd*„¦   «         Z.e" $                    d+¦  «         ee¦  «        fdbd,„¦   «         Z/e" $                    d-¦  «        d. ee¦  «        fdcd1„¦   «         Z0e" '                    d2¦  «         ee¦  «        fddd4„¦   «         Z1ded7„Z2d8Z3ddddd9œZ4dfd<„Z5e" $                    d=¦  «         ee¦  «        fd_d>„¦   «         Z6e" $                    d?¦  «         ee¦  «        fd_d@„¦   «         Z7e" '                    d=¦  «         ee¦  «        fdgdB„¦   «         Z8e" )                    dC¦  «         ee¦  «        fdhdE„¦   «         Z9e" +                    dC¦  «         ee¦  «        fdidF„¦   «         Z:e" $                    dG¦  «        dddd e	ddH¬I¦  «        dJ e	d.dKdL¬M¦  «         e	dd¬N¦  «         ee¦  «        f	djdX„¦   «         Z;e" $                    dY¦  «        dZ ee¦  «        fdkd]„¦   «         Z<dS )lzôAdmin API: account pool management, status, tasks, client keys and the request log.

The ``/dashboard`` page is built on these endpoints; a browser extension for
one-click cookie import is planned on top of them too (see docs/ARCHITECTURE.md).
é    )ÚannotationsN)ÚLiteral)Ú	APIRouterÚDependsÚQueryé   )Ú__version__)Úrenew_account)ÚAccountÚAccountStatus)ÚApiKey)ÚInvalidRequestÚNotFound)ÚServices)Úmissing_session_cookiesé   )Úget_servicesÚrequire_admin_key)ÚAccountCreateÚAccountUpdateÚ	KeyCreateÚ	KeyUpdatez/adminÚadmin)ÚprefixÚtagsÚdependenciesÚsvcr   Ú
account_idÚstrÚreturnr   c                ód   — | j                              |¦  «        }|€t          d|› d�¦  «        ‚|S )Nú	account 'ú' not found)ÚpoolÚgetr   )r   r   Úaccs      ú5C:\Projects\Muse2API\src\muse2api\api\routes\admin.pyÚ_getr(      s9   € Ø
Œ(�,Š,�zÑ
"Ô
"€CØ
€{ÝÐ: :Ð:Ð:Ð:Ñ;Ô;Ð;Ø€Jó    z/statusÚdictc              ƒ  ó¤   K  — t           | j                             ¦   «         ƒ d {V —†| j        j        j        | j                             ¦   «         dœS )N)ÚversionÚdriverÚcapabilitiesÚaccounts)r	   r-   Úhealthr.   Ú__dict__r$   Ústats©r   s    r'   Ústatusr4   "   sW   è è € õ Øœ
×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Øœ
Ô/Ô8Ø”H—N’NÑ$Ô$ð	ð ð r)   z	/accountsc              ƒ  óP   K  — dd„ | j                              ¦   «         D ¦   «         iS )NÚdatac                ó6   — g | ]}|                      ¦   «         ‘ŒS © )Úpublic)Ú.0Úas     r'   ú
<listcomp>z!list_accounts.<locals>.<listcomp>.   s    € Ð8Ð8Ð8 A�Q—X’X‘Z”ZÐ8Ð8Ð8r)   )r$   Úallr3   s    r'   Úlist_accountsr>   ,   s*   è è € àÐ8Ð8¨¬¯ª©¬Ð8Ñ8Ô8Ð9Ð9r)   Úbodyr   c              ƒ  ó:  K  — d„ | j                              ¦   «         D ¦   «         }|st          d¦  «        ‚t          | j        || j        | j        ¬¦  «        }|j                             |¦  «        ƒ d {V —† | 	                    ¦   «         t          |¦  «        dœS )Nc                ó   — i | ]
\  }}|¯||“ŒS r8   r8   ©r:   ÚkÚvs      r'   ú
<dictcomp>z"create_account.<locals>.<dictcomp>3   s#   € Ð:Ð:Ð:™˜˜1¸Ð:ˆq�!Ð:Ð:Ð:r)   zcookies must not be empty)ÚlabelÚcookiesÚcookie_expiresÚenabled)ÚaccountÚmissing_cookies)rG   Úitemsr   r   rF   rH   rI   r$   Úupsertr9   r   )r?   r   rG   r&   s       r'   Úcreate_accountrN   1   s¨   è è € à:Ð: ¤× 2Ò 2Ñ 4Ô 4Ð:Ñ:Ô:€GØð :ÝÐ8Ñ9Ô9Ð9Ý
˜œ
¨GÀDÔDWØœ,ð(ñ (ô (€Cà
Œ(�/Š/˜#Ñ
Ô
ÐÐÐÐÐÐÐØ—z’z‘|”|Õ8OÐPWÑ8XÔ8XÐYÐYÐYr)   z/accounts/{account_id}r   c              ƒ  ó’  K  — t          || ¦  «        }|j        �|j        |_        |j        �|j        |_        |j        �@d„ |j                             ¦   «         D ¦   «         |_        t
          j        |_        d |_        |j	        �|j	        |_	        |j
                             |¦  «        ƒ d {V —† d|                     ¦   «         iS )Nc                ó   — i | ]
\  }}|¯||“ŒS r8   r8   rB   s      r'   rE   z"update_account.<locals>.<dictcomp>E   s#   € ÐBÐBÐB¡  1ÀÐB�q˜!ÐBÐBÐBr)   rJ   )r(   rF   rI   rG   rL   r   ÚACTIVEr4   Ú
last_errorrH   r$   rM   r9   )r   r?   r   r&   s       r'   Úupdate_accountrS   <   sÂ   è è € õ ˆs�JÑ
Ô
€CØ„zÐØ”JˆŒ	Ø„|ÐØ”lˆŒØ„|ÐØBÐB¨¬×(:Ò(:Ñ(<Ô(<ÐBÑBÔBˆŒå"Ô)ˆŒ
ØˆŒØÔÐ&Ø!Ô0ˆÔØ
Œ(�/Š/˜#Ñ
Ô
ÐÐÐÐÐÐÐØ�s—z’z‘|”|Ð$Ð$r)   c              ƒ  ót   K  — |j                              | ¦  «        ƒ d {V —†st          d| › d�¦  «        ‚d| iS )Nr"   r#   Údeleted)r$   Úremover   ©r   r   s     r'   Údelete_accountrX   O   sS   è è € à”—’ Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ð <ÝÐ: :Ð:Ð:Ð:Ñ;Ô;Ð;Ø�zÐ"Ð"r)   z/accounts/{account_id}/resetc              ƒ  óÒ   K  — t          || ¦  «        }t          j        dd c|_        |_        |_        |j                             |¦  «        ƒ d {V —† d|                     ¦   «         iS )Ng        rJ   )	r(   r   rQ   r4   Úcooldown_untilrR   r$   rM   r9   )r   r   r&   s      r'   Úreset_accountr[   V   si   è è € å
ˆs�JÑ
Ô
€CÝ5BÔ5IÈ3ÐPTÐ2€C„J�Ô" C¤NØ
Œ(�/Š/˜#Ñ
Ô
ÐÐÐÐÐÐÐØ�s—z’z‘|”|Ð$Ð$r)   z/accounts/{account_id}/renewc              ƒ  óh   K  — t          || ¦  «         t          |j        |j        | ¦  «        ƒ d {V —†S )N)r(   r
   r$   r-   rW   s     r'   Úrenewr]   ^   s>   è è € åˆˆjÑÔÐÝ˜sœx¨¬°ZÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r)   z/accounts/{account_id}/quotac              ƒ  ó  K  — t          || ¦  «        }|j                             |¦  «        ƒ d{V —†}dt          j        ¦   «         i|¥|j        d<   |j                             |¦  «        ƒ d{V —† |j        |j        d         dœS )z×Ask the active driver for the account's quota snapshot and persist it in ``meta``.

    Drivers that do not implement ``MuseDriver.quota`` raise
    ``FeatureNotImplemented``, which the app renders as HTTP 501.
    NÚ
checked_atÚquota)r   r`   )r(   r-   r`   ÚtimeÚmetar$   rM   Úid)r   r   r&   Úsnapshots       r'   Úaccount_quotare   d   s—   è è € õ ˆs�JÑ
Ô
€CØ”Z×%Ò% cÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*€HØ%¥t¤y¡{¤{Ð?°hÐ?€C„HˆWÑØ
Œ(�/Š/˜#Ñ
Ô
ÐÐÐÐÐÐÐØœ&¨3¬8°GÔ+<Ð=Ð=Ð=r)   z/taskséd   ÚlimitÚintc              ƒ  óR   K  — dd„ |j                              | ¦  «        D ¦   «         iS )Nr6   c                ó:   — g | ]}|                      d ¬¦  «        ‘ŒS )Újson)Úmode)Ú
model_dump)r:   Úts     r'   r<   zlist_tasks.<locals>.<listcomp>t   s&   € ÐNÐNÐN°1�Q—\’\ v�\Ñ.Ô.ÐNÐNÐNr)   )ÚtasksÚlist)rg   r   s     r'   Ú
list_tasksrq   r   s.   è è € àÐNÐN¸¼	¿ºÀuÑ8MÔ8MÐNÑNÔNÐOÐOr)   z/tasks/{task_id}/cancelÚtask_idc              ƒ  óJ   K  — d|j                              | ¦  «        ƒ d {V —†iS )NÚ	cancelled)ro   Úcancel)rr   r   s     r'   Úcancel_taskrv   w   s3   è è € à˜sœy×/Ò/°Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð9Ð9r)   Úkey_idr   c                ód   — | j                              |¦  «        }|€t          d|› d�¦  «        ‚|S )Núkey 'r#   )Úkeysr%   r   )r   rw   Úkeys      r'   Ú_get_keyr|   }   s9   € Ø
Œ(�,Š,�vÑ
Ô
€CØ
€{ÝÐ2˜vÐ2Ð2Ð2Ñ3Ô3Ð3Ø€Jr)   )Úlegacyr   )ÚtotalÚrequests_24hÚ
errors_24hÚlast_request_atÚrowúdict | Nonec                óV   ‡ — ‰ €t          t          ¦  «        S ˆ fd„t          D ¦   «         S )Nc                ó"   •— i | ]}|‰|         “ŒS r8   r8   )r:   rC   r‚   s     €r'   rE   z_usage.<locals>.<dictcomp>Œ   s   ø€ Ð)Ð)Ð)˜!ˆAˆs�1ŒvÐ)Ð)Ð)r)   )r*   Ú	_NO_USAGE)r‚   s   `r'   Ú_usager‡   ‰   s.   ø€ Ø
€{Ý•I‰ŒÐØ)Ð)Ð)Ð)�yÐ)Ñ)Ô)Ð)r)   z/keysc              ƒ  óØ   ‡K  — d„ | j                              ¦   «         ƒ d{V —†d         D ¦   «         Šˆfd„| j                             ¦   «         D ¦   «         ˆfd„t          D ¦   «         dœS )zPStored keys plus the built-in identities, each with request counts from the log.c                ó    — i | ]}|d          |“ŒS )rw   r8   )r:   Úrs     r'   rE   zlist_keys.<locals>.<dictcomp>’   s   € ÐNÐNÐN ˆQˆxŒ[˜!ÐNÐNÐNr)   Nr6   c           	     óŽ   •— g | ]A}i |                      ¦   «         ¥d t          ‰                     |j        ¦  «        ¦  «        i¥‘ŒBS )Úusage)r9   r‡   r%   rc   )r:   rC   rŒ   s     €r'   r<   zlist_keys.<locals>.<listcomp>”   sE   ø€ ÐZÐZÐZÀaÐA�A—H’H‘J”JÐA ­°·	²	¸!¼$±´Ñ)@Ô)@ÐAÐAÐZÐZÐZr)   c           	     ó\   •— g | ](}||t          ‰                     |¦  «        ¦  «        d œ‘Œ)S ))rc   ÚnamerŒ   )r‡   r%   )r:   ÚbrŒ   s     €r'   r<   zlist_keys.<locals>.<listcomp>•   s5   ø€ Ð^Ð^Ð^ÈA˜1 aµ&¸¿ºÀ1¹¼Ñ2FÔ2FÐGÐGÐ^Ð^Ð^r)   )r6   Úbuiltin)ÚrequestsÚ	key_usagerz   r=   ÚBUILTIN_KEYS)r   rŒ   s    @r'   Ú	list_keysr”   �   sŠ   øè è € ð OÐN¨C¬L×,BÒ,BÑ,DÔ,DÐ&DÐ&DÐ&DÐ&DÐ&DÐ&DÀfÔ%MÐNÑNÔN€EàZÐZÐZÐZÈ3Ì8Ï<Ê<É>Ì>ÐZÑZÔZØ^Ð^Ð^Ð^ÕQ]Ð^Ñ^Ô^ðð ð r)   z/keys/usagec              ƒ  óD   K  — | j                              ¦   «         ƒ d{V —†S )zKRaw per-``key_id`` counts, including deleted keys still present in the log.N)r‘   r’   r3   s    r'   r’   r’   ™   s.   è è € ð ”×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r)   r   c              ƒ  ó´   K  — |j                              | j                             ¦   «         | j        ¦  «        ƒ d {V —†\  }}|                     ¦   «         |dœS )N)r{   Úapi_key)rz   ÚcreaterŽ   ÚstripÚnoter9   )r?   r   r{   Ú	plaintexts       r'   Ú
create_keyrœ   Ÿ   sU   è è € àœ8Ÿ?š?¨4¬9¯?ª?Ñ+<Ô+<¸d¼iÑHÔHÐHÐHÐHÐHÐHÐH�N€Cˆà—:’:‘<”<¨IÐ6Ð6Ð6r)   z/keys/{key_id}r   c              ƒ  ó&  K  — t          || ¦  «        }|j        �|j                             ¦   «         |_        |j        �|j        |_        |j        �|j        |_        |j                             ¦   «         ƒ d {V —† d|                     ¦   «         iS )Nr{   )r|   rŽ   r™   rš   Úrevokedrz   Úsaver9   )rw   r?   r   r{   s       r'   Ú
update_keyr    ¦   s‡   è è € å
�3˜Ñ
Ô
€CØ„yÐØ”9—?’?Ñ$Ô$ˆŒØ„yÐØ”9ˆŒØ„|ÐØ”lˆŒØ
Œ(�-Š-‰/Œ/ÐÐÐÐÐÐÐØ�3—:’:‘<”<Ð Ð r)   c              ƒ  ót   K  — |j                              | ¦  «        ƒ d {V —†st          d| › d�¦  «        ‚d| iS )Nry   r#   rU   )rz   rV   r   )rw   r   s     r'   Ú
delete_keyr¢   ³   sS   è è € à”—’ Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(ð 4ÝÐ2˜vÐ2Ð2Ð2Ñ3Ô3Ð3Ø�vÐÐr)   z	/requestszUnix seconds)ÚdefaultÚdescriptionFé   iô  )r£   ÚgeÚle)r£   r¦   ú
str | Noner4   ú4Literal['2xx', '3xx', '4xx', '5xx', 'failed'] | NoneÚpathÚsinceúfloat | NoneÚ
hide_pollsÚboolÚoffsetc	           
   ƒ  óV   K  — |j                              | |||||||¬¦  «        ƒ d {V —†S )N)rw   r   r4   rª   r«   r­   rg   r¯   )r‘   Úquery)	rw   r   r4   rª   r«   r­   rg   r¯   r   s	            r'   Úlist_requestsr²   »   sa   è è € ð ”×#Ò#¨6¸jÐQWØ)-°UÀzØ*/¸ð $ñ @ô @ð @ð @ð @ð @ð @ð @ð @r)   z/statsÚ24hÚwindowúLiteral['1h', '24h', '7d']c              ƒ  óp   K  — dt          j         ¦   «         i|j                             | ¦  «        ƒ d {V —†¥S )NÚnow)ra   r‘   r2   )r´   r   s     r'   r2   r2   Ì   s@   è è € ð •4”9‘;”;ÐC¨¬×(:Ò(:¸6Ñ(BÔ(BÐ"BÐ"BÐ"BÐ"BÐ"BÐ"BÐCÐCr)   )r   r   r   r   r    r   )r   r   r    r*   )r?   r   r   r   r    r*   )r   r   r?   r   r   r   r    r*   )r   r   r   r   r    r*   )rg   rh   r   r   r    r*   )rr   r   r   r   r    r*   )r   r   rw   r   r    r   )r‚   rƒ   r    r*   )r?   r   r   r   r    r*   )rw   r   r?   r   r   r   r    r*   )rw   r   r   r   r    r*   )rw   r¨   r   r¨   r4   r©   rª   r¨   r«   r¬   r­   r®   rg   rh   r¯   rh   r   r   r    r*   )r´   rµ   r   r   r    r*   )=Ú__doc__Ú
__future__r   ra   Útypingr   Úfastapir   r   r   Ú r	   Úaccounts.keepaliver
   Úaccounts.modelr   r   Ú	auth.keysr   Úerrorsr   r   Úservices.containerr   Úupstream.muser   Údepsr   r   Úschemasr   r   r   r   Úrouterr(   r%   r4   r>   ÚpostrN   ÚpatchrS   ÚdeleterX   r[   r]   re   rq   rv   r|   r“   r†   r‡   r”   r’   rœ   r    r¢   r²   r2   r8   r)   r'   ú<module>rÉ      sE  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø *Ð *Ð *Ð *Ð *Ð *Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hà	ˆ˜(¨'¨À'À'ÐJ[ÑB\ÔB\ÐA]Ð	^Ñ	^Ô	^€ðð ð ð ð ‡‚ˆIÑÔØ!( ¨Ñ!6Ô!6ð ð ð ð ñ Ôðð ‡‚ˆKÑÔØ(/¨°Ñ(=Ô(=ð :ð :ð :ð :ñ Ôð:ð ‡‚ˆ[ÑÔØ>E¸gÀlÑ>SÔ>Sð Zð Zð Zð Zñ ÔðZð ‡‚Ð&Ñ'Ô'à)0¨°Ñ)>Ô)>ð%ð %ð %ð %ñ (Ô'ð%ð$ ‡‚Ð'Ñ(Ô(Ø:A¸'À,Ñ:OÔ:Oð #ð #ð #ð #ñ )Ô(ð#ð ‡‚Ð+Ñ,Ô,Ø9@¸ÀÑ9NÔ9Nð %ð %ð %ð %ñ -Ô,ð%ð ‡‚Ð+Ñ,Ô,Ø18°¸Ñ1FÔ1Fð Að Að Að Añ -Ô,ðAð
 ‡‚Ð*Ñ+Ô+Ø9@¸ÀÑ9NÔ9Nð 
>ð 
>ð 
>ð 
>ñ ,Ô+ð
>ð ‡‚ˆHÑÔØ"%°w°w¸|Ñ7LÔ7Lð Pð Pð Pð Pñ ÔðPð ‡‚Ð&Ñ'Ô'Ø4;°G¸LÑ4IÔ4Ið :ð :ð :ð :ñ (Ô'ð:ð
ð ð ð ð #€Ø¨¸!ÐPTÐUÐU€	ð*ð *ð *ð *ð ‡‚ˆGÑÔØ$+ G¨LÑ$9Ô$9ð ð ð ð ñ Ôðð ‡‚ˆMÑÔØ$+ G¨LÑ$9Ô$9ð *ð *ð *ð *ñ Ôð*ð
 ‡‚ˆWÑÔØ6=°g¸lÑ6KÔ6Kð 7ð 7ð 7ð 7ñ Ôð7ð ‡‚ÐÑÔØCJÀ7È<ÑCXÔCXð 	!ð 	!ð 	!ð 	!ñ  Ôð	!ð ‡‚ÐÑ Ô Ø29°'¸,Ñ2GÔ2Gð ð ð ð ñ !Ô ðð ‡‚ˆKÑÔàØ!ØCGØØ˜%¨¸.ÐIÑIÔIØØ�˜s q¨SÐ1Ñ1Ô1Ø�%  aÐ(Ñ(Ô(Ø�G˜LÑ)Ô)ð@ð @ð @ð @ñ Ôð@ð  ‡‚ˆHÑÔØ5:Ø ' ¨Ñ 5Ô 5ðDð Dð Dð Dñ ÔðDð Dð Dr)   