
    haB                     J   d Z ddlmZmZmZmZ ddlmZ ddlm	Z	 ddl
Z
ddlmZ ddlmZ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 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 G d de      Z  G d de      Z!ejE                  de       ee       ee      fdededefd       Z#ejI                  d        ee       ee      fd!e%dedefd"       Z&ejI                  d#       ed$d%&       ed$d'&       ed       ed       ee      fd(e'd)e%d*ee'   d+ee'   def
d,       Z(ejE                  d-       ee       ee      fd!e%dedefd.       Z)ejI                  d/e       ee       ee      fdedefd0       Z*ejW                  d1       ee       ee      fd!e%dedefd2       Z,ejE                  d3       ee       ee      fd!e%dedefd4       Z-ej]                  d5e!       ee       ee      fd!e%de dedefd6       Z/y)7ux   
Bitrix24 BYO-Keys API endpoints
Реализует подключение Bitrix24 в режиме Bring Your Own Keys
    )	APIRouterDependsHTTPExceptionQuery)Session)and_N)Optional)datetime	timedelta)	BaseModelHttpUrl)get_db)UserCRMConnectionIntegration)get_current_user)get_settingsz/bitrixz
bitrix-byo)prefixtagsc                   ,    e Zd ZU eed<   eed<   eed<   y)BitrixConnectRequest
portal_url	client_idclient_secretN)__name__
__module____qualname__r   __annotations__str     ,/var/www/notifications/app/api/bitrix_byo.pyr   r      s    Nr!   r   c                   "    e Zd ZU eed<   eed<   y)BitrixConnectResponseredirect_urlconnection_idN)r   r   r   r   r   intr    r!   r"   r$   r$      s    r!   r$   c                   r    e Zd ZU eed<   eed<   dZee   ed<   dZee   ed<   dZ	ee
   ed<   dZee   ed<   y)BitrixStatusResponser&   statusNdomainr   connected_aterror_message)r   r   r   r'   r   r   r+   r	   r   r,   r
   r-   r    r!   r"   r)   r)       sF    K FHSM  $J$'+L(8$+#'M8C='r!   r)   c                   J    e Zd ZU dZee   ed<   dZee   ed<   dZ	ee   ed<   y)BitrixUpdateRequestNr   r   r   )
r   r   r   r   r	   r   r   r   r   r   r    r!   r"   r/   r/   )   s-    $(J!(#Ix}##'M8C='r!   r/   c                   ,    e Zd ZU eed<   eed<   eed<   y)BitrixUpdateResponser&   r*   messageN)r   r   r   r'   r   r   r    r!   r"   r1   r1   /   s    KLr!   r1   z/connect)response_modelrequestcurrent_userdbc                 t   t               }|j                  t              j                  t	        t        j
                  |j
                  k(  t        j                  dk(              j                         }|rt        dd      t        |j
                  t        | j                        | j                  | j                  d      }|j                  |       |j                          |j                  |       |j                    d}d| j                   d	| d
|j"                   }t%        ||j"                        S )uQ   
    Создает подключение Bitrix24 в режиме BYO-Keys
    	connected  ut   У вас уже есть активное подключение к Bitrix24. Сначала удалите его.status_codedetailpending)	tenant_idr   r   r   r*   /api/bitrix/oauth/callbackz4https://oauth.bitrix.info/oauth/authorize?client_id=z!&response_type=code&redirect_uri=z&state=)r%   r&   )r   queryr   filterr   r>   r*   firstr   r   r   r   r   addcommitrefresh
APP_DOMAINidr$   )r4   r5   r6   settingsexisting_connection
connectionredirect_uri	oauth_urls           r"   bitrix_connectrM   5   s1    ~H ((=188##|'='==  K/	

 eg   J
 	
 ((w))*##++J FF:IIKJJz ))**DEL''(%
*--		"  ! mm r!   z /get-integration/{connection_id}r&   c           
      p   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      |j                  t              j                  t        t        j
                  |j
                  k(  t        j                  dk(  t        j                  j                  d      d      t        |       k(              j                         }|st        dd      |j                  | |j                  dS )	u2   Получить integration_id по connection_id  *   Подключение не найденоr:   bitrix24->>r&   u(   Интеграция не найдена)integration_idr&   r*   )r@   r   rA   r   rG   r>   rB   r   r   typeconfigopr   r*   )r&   r5   r6   rJ   integrations        r"   get_integration_by_connectionrX   l   s    -(//-##|'='==	

 eg  4`aa ((;'..!!\%;%;;
*!!%(9S=OO	
 eg  4^__ &..&$$ r!   z/oauth/callback.z Authorization code from Bitrix24)descriptionzConnection IDcodestater+   	member_idc                   K   |j                  t              j                  t        j                  |k(        j	                         }|st        dd      t        j                         4 d{   }	 t               }|j                   d}|j                  dd|j                  |j                  | |d	       d{   }	|	j                  d
k7  rLd|	j                   }
d|_        t!        j"                         |_        |j'                          t        d|
      |	j)                         }|j+                  d      |_        |j+                  d      |_        ||_        ||_        d|_        |j+                  dd      }t!        j"                         t5        |      z   |_        t!        j"                         |_        |j'                          |j                  t8              j                  t;        t8        j<                  |j<                  k(  t8        j>                  dk(  t9        j@                  jC                  d      d      tE        |j                        k(              j	                         }|rVi |j@                  |j,                  |j0                  |j                  |jF                  d|_         d|_        |j                  }nt9        |j<                  dd|jF                   |j,                  |j.                  |j0                  |j                  |jF                  |j                  dd      }|jI                  |       |j                  }|j'                          dd|j                  ||dcddd      d{    S 7 7 7 # tJ        $ rN}d|_        t!        j"                         |_        |j'                          t        ddtE        |             d}~ww xY w# 1 d{  7  sw Y   yxY ww)u9   
    Обработка OAuth callback от Bitrix24
    rO   rP   r:   Nr?   %https://oauth.bitrix.info/oauth/tokenauthorization_code)
grant_typer   r   rZ   rK   data   u.   Ошибка получения токена: errorr9   access_tokenrefresh_tokenr8   
expires_in  secondsrQ   rR   r&   )re   r+   r&   r   zBitrix24 - )re   rf   r+   r&   r   r   )r>   rT   namerU   r*   Tu*   Bitrix24 успешно подключен)successr2   r&   rS   r+   zOAuth error: )&r@   r   rA   rG   rB   r   httpxAsyncClientr   rF   postr   r   r;   textr*   r
   utcnow
updated_atrD   jsongetre   rf   r+   r\   r   
expires_atr   r   r>   rT   rU   rV   r   r   rC   	Exception)rZ   r[   r+   r\   r6   rJ   clientrH   rK   responseerror_detail
token_datarg   existing_integrationrS   new_integrationes                    r"   bitrix_oauth_callbackr~      s     -(//E!eg  4`aa   " ^R ^Rf]	R#~H&1122LML#[[7"6!+!5!5%/%=%= $0 ) 	 	H ##s*!OPXP]P]_$+
!(0(9
%		#LII!J '1nn^&DJ#'1~~o'FJ$ &J#,J  +J $d;J$,OO$5	*8U$UJ!$,OO$5J!IIK $&88K#8#?#?))Z-A-AA$$
2&&))%0ASEWW$ eg ! $/*11/$.$;$;(//%/]]","7"7/$+ /:$+!5!8!8 #.(22#&z'<'<&=>(2(?(?)3)A)A","3"3)3&0&;&;%/%9%9 '# '!0!3!3IIK  G!+"0 c^R ^R ^R
	^Rr  	R 'J$,OO$5J!IIKC-Ax8PQQ	Rs^R ^R ^Rs{   A+O8-N.O81O#3A	N	<N=J2N	/O8;N<O8N	O8		O A	OO  O##O5)O,*O51O8z/refresh/{connection_id}c           
      .  K   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      |j                  st        dd      t        j                         4 d{   }	 t               }|j                   d}|j                  dd	|j                  |j                  |j                  |d
       d{   }|j                   dk7  rLd|j"                   }d|_        t'        j(                         |_        |j-                          t        d|      |j/                         }	|	j1                  d      |_        |	j1                  d	      |_        d|_        |	j1                  dd      }
t'        j(                         t5        |
      z   |_        t'        j(                         |_        |j-                          dddcddd      d{    S 7 s7 7 # t8        $ rN}d|_        t'        j(                         |_        |j-                          t        ddt;        |             d}~ww xY w# 1 d{  7  sw Y   yxY ww)u7   
    Обновить access token для Bitrix24
    rO   rP   r:   r9   u   Refresh token не найденNr?   r^   rf   )r`   r   r   rf   rK   ra   rc   u0   Ошибка обновления токена: rd   re   r8   rg   rh   ri   Tu*   Токен успешно обновленrl   r2   zToken refresh error: )r@   r   rA   r   rG   r>   rB   r   rf   rm   rn   r   rF   ro   r   r   r;   rp   r*   r
   rq   rr   rD   rs   rt   re   r   ru   rv   r   )r&   r5   r6   rJ   rw   rH   rK   rx   ry   rz   rg   r}   s               r"   bitrix_refresh_tokenr     sY     -(//-##|'='==	

 eg  4`aa##4UVV  " 0Z 0Zf/	Z#~H&1122LML#[[7"1!+!5!5%/%=%=%/%=%=$0 ) 	 	H ##s*!QRZR_R_Q`a$+
!(0(9
%		#LII!J '1nn^&DJ#'1~~o'FJ$ +J $d;J$,OO$5	*8U$UJ!$,OO$5J!IIK  GM0Z 0Z 0Z
	0ZV  	Z 'J$,OO$5J!IIKC:OPSTUPVx8XYY	ZW0Z 0Z 0Zs{   B)J+H,J/J 1AH&H!DH&JH$J!H&$J&	I=/A	I88I==J  JJ	JJz/statusc           	         |j                  t              j                  t        t        j                  | j                  k(  t        j
                  j                  g d                  j                  t        j                  j                               j                         }|st        dd      t        |j                  |j
                  |j                  |j                  |j
                  dk(  r|j                   d      S dd      S )uG   
    Получить статус подключения Bitrix24
    )r8   r=   rd   rO   rP   r:   r8   N)r&   r*   r+   r   r,   r-   )r@   r   rA   r   r>   r*   in_order_by
created_atdescrB   r   r)   rG   r+   r   rr   )r5   r6   rJ   s      r"   bitrix_statusr   N  s     -(//##|'='==  $$%FG	

 h}'',,./  4`aa mm    ((.8.?.?;.NZ** 
 UY r!   z/disconnect/{connection_id}c                 <   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      |j                  |       |j                          dddS )u8   
    Удалить подключение Bitrix24
    rO   rP   r:   Tu%   Подключение удаленоr   )
r@   r   rA   r   rG   r>   rB   r   deleterD   )r&   r5   r6   rJ   s       r"   bitrix_disconnectr   j  s     -(//-##|'='==	

 eg  4`aaIIjIIK(OPPr!   z/test/{connection_id}c           	        K   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      |j                  st        dd      t        j                         4 d{   }	 |j                  |j                   dd|j                  i	       d{   }|j                  d
k(  r7|j                         }dd|j                  di       dcddd      d{    S d|_        t!        j"                         |_        |j'                          t        dd|j(                         7 7 7 S# t*        $ rN}d|_        t!        j"                         |_        |j'                          t        ddt-        |             d}~ww xY w# 1 d{  7  sw Y   yxY ww)uC   
    Тестировать подключение к Bitrix24
    rO   rP   r:   r9   u+   Токен доступа не найденNz/rest/user.current.jsonauth)paramsrc   Tu'   Подключение работаетresult)rl   r2   userrd   u%   Ошибка подключения: zTest error: )r@   r   rA   r   rG   r>   rB   r   re   rm   rn   rt   r   r;   rs   r*   r
   rq   rr   rD   rp   rv   r   )r&   r5   r6   rJ   rw   rx   	user_datar}   s           r"   bitrix_test_connectionr     s     -(//-##|'='==	

 eg  4`aa""4abb  " Q Qf	Q#ZZ(())@A
 7 78 (  H
 ##s*$MMO	#H%MM(B7Q Q Q  %,
!(0(9
%		# #B8==/R )QQ2  	Q 'J$,OO$5J!IIKC,s1vh8OPP	Q3Q Q Qs   B)G*+E5,G*/G1/E; E7!8E;G*%E9&G*+A
E;5G*7E;9G*;	GA	GGGG'GG'#G*z/update/{connection_id}c                   K   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(              j                         }|st        dd      |j                  t        |j                        |_        |j                  |j                  |_
        |j                  |j                  |_        d|_        d|_        d|_        d|_        t!        j"                         |_        |j'                          |j)                  |       t+        |j                  |j                  d      S w)uM   
    Обновить настройки подключения Bitrix24
    rO   rP   r:   Nr=   ud   Настройки обновлены. Требуется повторное подключение.)r&   r*   r2   )r@   r   rA   r   rG   r>   rB   r   r   r   r   r   re   rf   ru   r*   r
   rq   rr   rD   rE   r1   )r&   r4   r5   r6   rJ   s        r"   update_bitrix_connectionr     s%     -(//-##|'='==	

 eg  4`aa % #G$6$6 7
$&00
(#*#8#8
  #J#J J!J$OO-JIIKJJz mm  v s   EE)0__doc__fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr   rm   typingr	   r
   r   pydanticr   r   app.db.sessionr   app.db.modelsr   r   r   app.api.depsr   app.core.configr   routerr   r$   r)   r/   r1   ro   rM   rt   r'   rX   r   r~   r   r   r   r   r   putr   r    r!   r"   <module>r      s4   = < "    ( ' ! : : ) (	)<.	99 I 
(9 (() (9  Z(=> !!12&/3!33 	3 ?3l ./ !!12&/    	  0 F c'IJs8!$K$T{&/qR
qRqR SMqR }	qR
 	qR qRh '( !!12&/EZEZEZ 	EZ )EZP I&:; !12&/ <6 ,- !!12&/QQQ 	Q .Q0 $% !!12&/3Q3Q3Q 	3Q &3Ql %6JK !!12&/	)) ) ) 		) L)r!   