Ë
    uPêj­&  ã                   ó¤   — U d Z ddl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mZ ddlmZ erddlmZ  eh d	£«      Zeed
<    G d„ de
e   «      Zy)z?
User repository for database operations on LiteLLM_UserTable.
é    N)ÚMapping)ÚTYPE_CHECKINGÚFinal©ÚLiteLLM_UserTable)ÚBaseRepositoryÚDbRecordÚrecord_to_dict)ÚTableActions)Úmodels>   ÚmetadataÚmodel_spendÚmodel_max_budgetÚ_JSON_ENCODED_COLUMNSc            *       ó†  ‡ — e Zd ZdZeded   fd„«       Zedee   fd„«       Z	de
dz  dedz  fd„Zd,d
edededz  fˆ fd„Zdededz  fd„Zdededz  fd„Zdedee   fd„Zdedee   fd„Zdefd„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-d	ededz  dedz  dedz  dedz  dedz  dee   dz  dedz  dedz  dedz  dee   dz  deeef   dz  dedz  dedz  dedz  d edz  d!ee   dz  d"ee   dz  d#edz  def(d$„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-d	ededz  dedz  dedz  dedz  dedz  dee   dz  dedz  dedz  dedz  dee   dz  deeef   dz  dedz  dedz  dedz  d edz  d!ee   dz  d"ee   dz  d#edz  dedz  f(d%„Zd	ededefd&„Zd	ededz  fd'„Zd	ed(ededz  fd)„Zd	edededz  fd*„Zd	edededz  fd+„Zˆ xZS ).ÚUserRepositoryz(Repository for user database operations.Úreturnzprisma_models.LiteLLM_UserTablec                 óB   — | j                   j                  j                  S ©N)Úprisma_clientÚdbÚlitellm_usertable©Úselfs    úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/repositories/user_repository.pyÚtablezUserRepository.table   s   € à×!Ñ!×$Ñ$×6Ñ6Ð6ó    c                 ó   — t         S r   r   r   s    r   Úmodel_classzUserRepository.model_class   s   € ä Ð r   ÚrecordNc                 óî   — |€yt        j                  t        |«      j                  «       D ��ci c]5  \  }}||t        v r%t        |t        «      rt        j                  |«      n|“Œ7 c}}«      S c c}}w )z*Convert a database record to a User model.N)	r   Úmodel_validater
   Úitemsr   Ú
isinstanceÚstrÚjsonÚloads)r   r    ÚcolumnÚvalues       r   Ú	_to_modelzUserRepository._to_model   sq   € àˆ>Øä ×/Ñ/ô &4°FÓ%;×%AÑ%AÓ%C÷á!�F˜Eð ¨VÔ7LÑ-LÔQ[Ð\aÔcfÔQgœŸ
™
 5Ô)ÐmrÑróó
ð 	
ùós   ¯:A1
Úuser_idÚid_valueÚid_fieldc              ƒ   ó@   •K  — t         ‰| �  ||«      ƒ d {  –—† S 7 Œ­wr   )ÚsuperÚ
find_by_id)r   r,   r-   Ú	__class__s      €r   r0   zUserRepository.find_by_id*   s   øè ø€ Ü‘WÑ'¨°(Ó;×;Ð;Ð;ús   ƒ—˜Ú
user_emailc              ƒ   óX   K  — | j                  d|i¬«      ƒ d{  –—† }|r|d   S dS 7 Œ­w)zFind a user by email.r2   ©ÚwhereNr   ©Ú	find_many)r   r2   Úrecordss      r   Úfind_by_emailzUserRepository.find_by_email-   s5   è ø€ à#Ÿ~™~°\À:Ð4N˜~ÓO×OˆÙ$ˆw�q‰zÐ.¨$Ð.ð Pús   ‚*š(›*Ússo_user_idc              ƒ   óD   K  — | j                  |d¬«      ƒ d{  –—† S 7 Œ­w)zFind a user by SSO ID.r:   ©r-   N)r0   )r   r:   s     r   Úfind_by_sso_idzUserRepository.find_by_sso_id2   s   è ø€ à—_‘_ [¸=�_ÓI×IÐIÐIúó   ‚ ™š Úorganization_idc              ƒ   óF   K  — | j                  d|i¬«      ƒ d{  –—† S 7 Œ­w)z"Find all users in an organization.r?   r4   Nr6   )r   r?   s     r   Úfind_by_organization_idz&UserRepository.find_by_organization_id6   s#   è ø€ à—^‘^Ð+<¸oÐ*N�^ÓO×OÐOÐOús   ‚!š›!Úteam_idc              ƒ   óJ   K  — | j                  dd|ii¬«      ƒ d{  –—† S 7 Œ­w)zFind all users in a team.ÚteamsÚhasr4   Nr6   )r   rB   s     r   Úfind_by_team_idzUserRepository.find_by_team_id:   s'   è ø€ à—^‘^¨7°U¸GÐ4DÐ*E�^ÓF×FÐFÐFúó   ‚#œ!�#c              ƒ   ó¸   K  — ddl m} | j                  «       ƒ d{  –—† }| j                  ddg |d«      dœi¬«      ƒ d{  –—† }t        d||z
  «      S 7 Œ97 Œ­w)	a4  Number of users that count toward the license seat limit.

        Every user is billable except those SCIM-deactivated
        (metadata.scim_active == false). Rows where scim_active is absent,
        null, or true all count, so seats are counted as total users minus
        the deactivated ones.
        r   )ÚJsonNr   Úscim_activeF)ÚpathÚequalsr4   )ÚprismarI   ÚcountÚmax)r   rI   ÚtotalÚdeactivateds       r   Úcount_billable_usersz#UserRepository.count_billable_users>   sZ   è ø€ õ 	 à!ŸZ™Z›\×)ˆØ#'§:¡:°ZÈ=È/ÑeiÐjoÓepÑAqÐ4r :Ó#s×sˆÜ�1�e˜kÑ)Ó*Ð*ð *øØsús!   ‚AœA�%AÁAÁAÁAÚ
user_aliasÚpasswordrD   Ú	user_roleÚ
max_budgetr   r   Úmax_parallel_requestsÚ	tpm_limitÚ	rpm_limitÚbudget_durationÚallowed_cache_controlsÚpoliciesÚobject_permission_idc              ƒ   ój  K  — d|i}|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	|d
<   |
�|
|d<   |�||d<   |�t        j                  |«      |d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   | j                  |«      ƒ d{  –—† S 7 Œ­w)zCreate a new user.r+   NrS   rB   r:   r?   rT   rD   rU   rV   r2   r   r   rW   rX   rY   rZ   r[   r\   r]   )r&   ÚdumpsÚcreate©r   r+   rS   rB   r:   r?   rT   rD   rU   rV   r2   r   r   rW   rX   rY   rZ   r[   r\   r]   Údatas                        r   Úcreate_userzUserRepository.create_userL   sR  è ø€ ð. +4°WÐ)=ˆØÐ!Ø!+ˆD�ÑØÐØ%ˆD�‰OØÐ"Ø"-ˆD�ÑØÐ&Ø&5ˆDÐ"Ñ#ØÐØ'ˆD�ÑØÐØ!ˆD�‰MØÐ Ø )ˆD�ÑØÐ!Ø!+ˆD�ÑØÐ!Ø!+ˆD�ÑØÐØ#ˆD�‰NØÐÜ#Ÿz™z¨(Ó3ˆD�ÑØ Ð,Ø,AˆDÐ(Ñ)ØÐ Ø )ˆD�ÑØÐ Ø )ˆD�ÑØÐ&Ø&5ˆDÐ"Ñ#Ø!Ð-Ø-CˆDÐ)Ñ*ØÐØ'ˆD�ÑØÐ+Ø+?ˆDÐ'Ñ(à—[‘[ Ó&×&Ð&Ð&ús   ‚B*B3Â,B1Â-B3c              ƒ   ól  K  — i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |	�|	|d	<   |
�|
|d
<   |�||d<   |�t        j                  |«      |d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   | j                  ||d¬«      ƒ d{  –—† S 7 Œ­w)zUpdate a user.NrS   rB   r:   r?   rT   rD   rU   rV   r2   r   r   rW   rX   rY   rZ   r[   r\   r]   r+   r<   )r&   r_   Úupdatera   s                        r   Úupdate_userzUserRepository.update_user‹   sS  è ø€ ð. *,ˆØÐ!Ø!+ˆD�ÑØÐØ%ˆD�‰OØÐ"Ø"-ˆD�ÑØÐ&Ø&5ˆDÐ"Ñ#ØÐØ'ˆD�ÑØÐØ!ˆD�‰MØÐ Ø )ˆD�ÑØÐ!Ø!+ˆD�ÑØÐ!Ø!+ˆD�ÑØÐØ#ˆD�‰NØÐÜ#Ÿz™z¨(Ó3ˆD�ÑØ Ð,Ø,AˆDÐ(Ñ)ØÐ Ø )ˆD�ÑØÐ Ø )ˆD�ÑØÐ&Ø&5ˆDÐ"Ñ#Ø!Ð-Ø-CˆDÐ)Ñ*ØÐØ'ˆD�ÑØÐ+Ø+?ˆDÐ'Ñ(à—[‘[ ¨$¸�[ÓC×CÐCÐCús   ‚B+B4Â-B2Â.B4c              ƒ   óf   K  — | j                   j                  |ddœd|i¬«      ƒ d{  –—† }|S 7 Œ­w)z±Set user_email only when the stored value is null, atomically at the database.

        Returns the number of rows updated: 0 means another writer already set an email.
        N)r+   r2   r2   )r5   rb   )r   Úupdate_many)r   r+   r2   Úupdated_counts       r   Úbackfill_null_user_emailz'UserRepository.backfill_null_user_emailÊ   sD   è ø€ ð
 +/¯*©*×*@Ñ*@Ø%°TÑ:Ø 
Ð+ð +Aó +
÷ %
ˆð Ðð	%
ús   ‚&1¨/©1c              ƒ   óD   K  — | j                  |d¬«      ƒ d{  –—† S 7 Œ­w)zDelete a user.r+   r<   N)Údelete)r   r+   s     r   Údelete_userzUserRepository.delete_userÕ   s   è ø€ à—[‘[ °9�[Ó=×=Ð=Ð=úr>   Úspendc              ƒ   óJ   K  — | j                  |d|id¬«      ƒ d{  –—† S 7 Œ­w)zUpdate user spend.rn   r+   r<   N)re   )r   r+   rn   s      r   Úupdate_spendzUserRepository.update_spendÙ   s&   è ø€ à—[‘[ ¨7°EÐ*:ÀY�[ÓO×OÐOÐOúrG   c              ƒ   óŠ   K  — | j                  |d¬«      ƒ d{  –—† sy| j                  |dd|iid¬«      ƒ d{  –—† S 7 Œ%7 Œ­w)z7Add a user to a team using atomic array push operation.r+   r<   NrD   Úpush)Úexistsre   )r   r+   rB   s      r   Úadd_to_teamzUserRepository.add_to_teamÝ   sN   è ø€ à—[‘[ °9�[Ó=×=Ð=Øà—[‘[ ¨7°V¸WÐ4EÐ*FÐQZ�[Ó[×[Ð[ð >øð \ús   ‚A™?š AºA»AÁAc              ƒ   óÎ   K  — | j                  |«      ƒ d{  –—† }|€y|j                  D �cg c]
  }||k7  sŒ	|‘Œ }}| j                  |d|id¬«      ƒ d{  –—† S 7 ŒDc c}w 7 Œ­w)zçRemove a user from a team.

        Note: Prisma doesn't support atomic array removal, so we use a
        read-modify-write pattern here. For high-concurrency scenarios,
        consider using raw SQL with array_remove().
        NrD   r+   r<   )r0   rD   re   )r   r+   rB   ÚuserÚtrD   s         r   Úremove_from_teamzUserRepository.remove_from_teamä   sh   è ø€ ð !ŸO™O¨GÓ4×4ˆØˆ<Øà#'§:¡:Ö>˜a°°g³šÐ>ˆÐ>Ø—[‘[ ¨7°EÐ*:ÀY�[ÓO×OÐOð 5úò ?ØOús0   ‚A%—A˜A%­
A¸A¼A%ÁA#ÁA%ÁA%)r+   )NNNNNNNNNNNNNNNNNN) Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   Útyper   r   r	   r*   r%   r0   r9   r=   ÚlistrA   rF   ÚintrR   Úfloatr   Úobjectrc   rf   rj   rm   rp   rt   rx   Ú__classcell__)r1   s   @r   r   r      s�  ø„ Ù2àð7�|Ð$EÑFò 7ó ð7ð ð!˜TÐ"3Ñ4ò !ó ð!ð

 ¨4¡ð 

Ð4EÈÑ4Ló 

ñ<¨ð <¸ð <ÐL]Ð`dÑLdõ <ð/¨cð /Ð6GÈ$Ñ6Nó /ð
J°ð JÐ8IÈDÑ8Pó JðP¸Sð PÀTÐJ[ÑE\ó PðG¨Sð G°TÐ:KÑ5Ló Gð+¨Có +ð" "&Ø"Ø"&Ø&*Ø#Ø"&Ø $Ø#'Ø!%Ø#'Ø04Ø,0Ø $Ø $Ø&*Ø37Ø%)Ø+/ñ)='àð='ð ˜$‘Jð='ð �t‘ð	='ð
 ˜4‘Zð='ð ˜t™ð='ð ˜‘*ð='ð �C‰y˜4Ñð='ð ˜‘:ð='ð ˜D‘Lð='ð ˜$‘Jð='ð �S‘	˜DÑ ð='ð ˜#˜v˜+Ñ&¨Ñ-ð='ð  # T™zð='ð ˜‘:ð='ð  ˜‘:ð!='ð" ˜t™ð#='ð$ !% S¡	¨DÑ 0ð%='ð& �s‘)˜dÑ"ð'='ð( " D™jð)='ð* 
ó+='ðD "&Ø"Ø"&Ø&*Ø#Ø"&Ø $Ø#'Ø!%Ø#'Ø04Ø,0Ø $Ø $Ø&*Ø37Ø%)Ø+/ñ)=Dàð=Dð ˜$‘Jð=Dð �t‘ð	=Dð
 ˜4‘Zð=Dð ˜t™ð=Dð ˜‘*ð=Dð �C‰y˜4Ñð=Dð ˜‘:ð=Dð ˜D‘Lð=Dð ˜$‘Jð=Dð �S‘	˜DÑ ð=Dð ˜#˜v˜+Ñ&¨Ñ-ð=Dð  # T™zð=Dð ˜‘:ð=Dð  ˜‘:ð!=Dð" ˜t™ð#=Dð$ !% S¡	¨DÑ 0ð%=Dð& �s‘)˜dÑ"ð'=Dð( " D™jð)=Dð* 
˜TÑ	!ó+=Dð~	°cð 	Àsð 	Èsó 	ð>¨ð >Ð1BÀTÑ1Ió >ðP¨#ð P°eð PÐ@QÐTXÑ@Xó Pð\¨ð \°sð \Ð?PÐSWÑ?Wó \ðP¨cð P¸Cð PÐDUÐX\ÑD\÷ Pr   r   )r|   r&   Úcollections.abcr   Útypingr   r   Úlitellm.models.userr   Ú$litellm.repositories.base_repositoryr   r	   r
   Ú%litellm.repositories.prisma_protocolsr   rM   r   Úprisma_modelsÚ	frozensetr   Ú__annotations__r   © r   r   ú<module>r�      sN   ðòó Ý #ß 'å 1ß YÑ YÝ >áÝ.á(Ò)XÓYÐ �uÓ Yô]P�^Ð$5Ñ6õ ]Pr   