
    )i                        d dl 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  ed
dg      Z G d de
      Z G d de
      Z G d de
      ZdefdZdedefdZej9                  ded       ee       ee      fdededefd       Zej=                  dee          ee       ee      fdedefd       ZejA                  d        ee       ee      fd!e!dedefd"       Z"y)#    N)datetime)	APIRouterDependsHTTPException)Session)	BaseModel)ListOptional)get_db)ApiKeyUser)get_current_userz	/api-keyszapi-keys)prefixtagsc                   @    e Zd ZU eed<   g Zee   ed<   dZee   ed<   y)ApiKeyCreatenamescopesN
expires_at)	__name__
__module____qualname__str__annotations__r   r	   r   r
        */var/www/notifications/app/api/api_keys.pyr   r      s#    
IFDI $J$r   r   c                   n    e Zd ZU eed<   eed<   eed<   ee   ed<   eed<   dZe	e   ed<    G d d	      Z
y)
	ApiKeyOutidr   
key_prefixr   
created_atNr   c                       e Zd ZdZy)ApiKeyOut.ConfigTN)r   r   r   from_attributesr   r   r   Configr$      s    r   r&   )r   r   r   intr   r   r	   r   r   r
   r&   r   r   r   r   r      s:    G
IOI%)J") r   r   c                   Z    e Zd ZU eed<   eed<   eed<   ee   ed<   eed<   dZe	e   ed<   y)ApiKeyCreateResponser    r   keyr   r"   Nr   )
r   r   r   r'   r   r   r	   r   r   r
   r   r   r   r)   r)   #   s0    G
I	HI%)J")r   r)   returnc                  V    t        j                  d      } d| j                          }|S )u0   Генерировать новый API ключ    sk_live_)secretstoken_byteshex)random_bytesr*   s     r   generate_api_keyr3   ,   s-    &&r*L\%%'(
)CJr   r*   c                 d    t        j                  | j                               j                         S )uP   Хешировать API ключ для безопасного хранения)hashlibsha256encode	hexdigest)r*   s    r   hash_api_keyr9   3   s     >>#**,'1133r       )response_modelstatus_codedatacurrent_userdbc                   K   t               }t        |      }d}| j                  rW	 t        | j                  t              r0t        j                  | j                  j                  dd            }n| j                  }t        |j                  |j                  | j                  || j                  |      }|j                  |       |j!                          |j#                  |       t%        |j                  |j                  ||j                  |j&                  |j                        S # t        $ r t        dd      w xY ww)	u&   Создать новый API ключNZz+00:00i  u&   Неверный формат датыr=   detail)	tenant_iduser_idr   key_hashr   r   )r    r   r*   r   r"   r   )r3   r9   r   
isinstancer   r   fromisoformatreplace	Exceptionr   r   rE   r    r   r   addcommitrefreshr)   r"   )r>   r?   r@   api_keyrG   r   db_keys          r   create_api_keyrQ   8   s      GG$H J	b$//3/%33DOO4K4KCQY4Z[
!__

 ((YY{{F FF6NIIKJJv99[[}}$$$$ !  	bC8`aa	bs   $EAD+ =B.E+EE)r<   c                   K   |j                  t              j                  t        j                  | j                  k(        j	                         }g }|D ]  }t        |j                        dkD  r|j                  dd dz   n|j                  }|j                  t        |j                  |j                  ||j                  xs g |j                  |j                                |S w)u.   Получить список API ключей   Nz...)r    r   r!   r   r"   r   )queryr   filterrE   alllenrG   appendr   r    r   r   r"   r   )r?   r@   keysresultr*   r!   s         r   list_api_keysr[   g   s      88F""L222	ce 	 F 14S\\1BQ1FS\\"1%-CLL
ivv!::#~~~~
 		 Ms   C%C'z	/{key_id}key_idc                 2  K   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        dd      |j                  |       |j                          dddS w)u   Удалить API ключi  u   API ключ не найденrC   Tu   API ключ удален)okmessage)	rT   r   rU   r    rE   firstr   deleterM   )r\   r?   r@   r*   s       r   delete_api_keyrb      s      ((6

!
!		VL222 eg 
 4TUUIIcNIIK#>??s   BB)#r/   r5   r   fastapir   r   r   sqlalchemy.ormr   pydanticr   typingr	   r
   app.db.sessionr   app.db.modelsr   r   app.api.depsr   routerr   r   r)   r   r3   r9   postrQ   getr[   ra   r'   rb   r   r   r   <module>rm      s^      5 5 "  ! ! & ) 
+ZL	9%9 %		 	*9 *# 4c 4c 4
 R 4#F !!12&/+
++ 	+ G+\ BtI/ !12&/ 06 { !!12&/@@@ 	@ @r   