
    hH                     X   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 ddlmZmZ dd	lmZ dd
lmZ ddlZddlZddlZddlZddlmZ  eddg      ZdedefdZdedee   fdZejA                  d       ee       ee      fdededefd       Z!ejA                  d       edd       edd       ed       ed       ee       ee      fdededee   d ee   dedefd!       Z"ejG                  d"       ee       ee      fdededefd#       Z$ejA                  d$       ee       ee      fdedefd%       Z%ejA                  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&d,ed-ed)efd.Z'y)/uI   
OAuth авторизация для CRM систем (AmoCRM, Bitrix24)
    )	APIRouterDependsHTTPExceptionQuery)Session)and_N)Optional)get_db)UserIntegration)get_current_user)get_settings)datetimez/oauthoauth)prefixtags	tenant_idreturnc                 h   t        j                  d      }|  d| }t        j                  t	               j
                  j                         |j                         t        j                        j                         }t        j                  | d| j                               j                         S )uH   Генерирует безопасный state с HMAC подписью    :)secretstoken_urlsafehmacnewr   
SECRET_KEYencodehashlibsha256	hexdigestbase64urlsafe_b64encodedecode)r   noncedata	signatures       +/var/www/notifications/app/api/oauth_crm.py_generate_secure_stater(      s    !!"%E[%!D!!((* ik	 
 ##tfAi[$9$@$@$BCJJLL    statec                    	 t        j                  | j                               j                         }|j	                  dd      \  }}|j                  dd      \  }}t        j                  t               j                  j                         |j                         t        j                        j                         }t        j                  ||      syt        |      S # t        $ r Y yw xY w)uN   Проверяет HMAC подпись state и возвращает tenant_idr      N)r!   urlsafe_b64decoder   r#   rsplitsplitr   r   r   r   r   r   r    compare_digestint	Exception)r*   decodedr%   r&   tenant_id_strr$   expected_signatures          r'   _verify_secure_stater6   #   s    **5<<>:AAC!..a0i#zz#q1u!XXN%%,,.KKMNN
 )+	 	 ""9.@A=!! s   CC  
C   	C,+C,z/amocrm/authorizeintegration_idcurrent_userdbc                    |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(  t        j                  dk(              j                         }|st        dd      |j                  }|j                  d      }|j                  d      }|r|st        dd      |j                  d	d
      j                  d      }| d| d|  d}|| |dS )uL   
    Получить URL для OAuth авторизации в AmoCRM
    amocrm  /   Интеграция AmoCRM не найденаstatus_codedetail	client_idredirect_uri  uQ   Не заполнены client_id или redirect_uri в конфигурацииapi_url /z/oauth?client_id=&state=z&mode=post_message)authorization_urlr*   rB   )queryr   filterr   idr   typefirstr   configgetrstrip)	r7   r8   r9   integrationrN   rA   rB   base_urlauth_urls	            r'   amocrm_authorizerT   8   s    ((;'..NNn,!!\%;%;;(	
 eg  4effF

;'I::n-LLf
 	
 zz)R(//4H* [
.!
	  &$ r)   z/amocrm/callback.zAuthorization code from AmoCRM)descriptionzIntegration IDcoderefererplatformc           
      L  K   |j                  t              j                  t        t        j                  |k(  t        j
                  |j
                  k(  t        j                  dk(              j                         }|st        dd      |j                  }|j                  d      }|j                  d      }	|j                  d      }
|j                  dd	      j                  d
      }t        j                         4 d{   }	 |j                  | d||	d| |
d       d{   }|j                  dk7  rt        dd|j                          |j#                         }|j                  d      |d<   |j                  d      |d<   |j                  d      |d<   |j                  d      |d<   ||_	        d|_        d|_        |j)                          d|j                   d}ddlm}  ||      cddd      d{    S 7 7 7 
# t.        $ rp}d|_        dt1        |       |_        |j)                          dt1        |       d t1        |       d!}ddlm}  ||      cY d}~cddd      d{  7   S d}~ww xY w# 1 d{  7  sw Y   yxY ww)"u7   
    Обработка OAuth callback от AmoCRM
    r;   r<   r=   r>   rA   client_secretrB   rD   rE   rF   N/oauth2/access_tokenauthorization_code)rA   rZ   
grant_typerV   rB   json   rC   .   Ошибка получения токена: access_tokenrefresh_token
token_type
expires_in	connectedu  
            <!DOCTYPE html>
            <html>
            <head>
                <title>amoCRM авторизация</title>
                <style>
                    body {
                        font-family: Arial, sans-serif;
                        text-align: center;
                        padding: 50px;
                        background-color: #f5f5f5;
                    }
                    .success {
                        color: #52c41a;
                        font-size: 18px;
                        margin-bottom: 20px;
                    }
                    .loading {
                        color: #1890ff;
                        font-size: 16px;
                    }
                </style>
            </head>
            <body>
                <div class="success">✅ amoCRM успешно подключен!</div>
                <div class="loading">Закрытие окна...</div>
                <script>
                    // Отправляем сообщение в родительское окно
                    if (window.opener) {
                        window.opener.postMessage({
                            type: 'amocrm_auth_success',
                            integration_id: uj  
                        }, window.location.origin);
                    }
                    
                    // Закрываем окно через 2 секунды
                    setTimeout(() => {
                        window.close();
                    }, 2000);
                </script>
            </body>
            </html>
            r   )HTMLResponse)contenterrorOAuth error: u  
            <!DOCTYPE html>
            <html>
            <head>
                <title>amoCRM авторизация - Ошибка</title>
                <style>
                    body {
                        font-family: Arial, sans-serif;
                        text-align: center;
                        padding: 50px;
                        background-color: #f5f5f5;
                    }
                    .error {
                        color: #ff4d4f;
                        font-size: 18px;
                        margin-bottom: 20px;
                    }
                    .loading {
                        color: #1890ff;
                        font-size: 16px;
                    }
                </style>
            </head>
            <body>
                <div class="error">❌ Ошибка авторизации amoCRM</div>
                <div style="color: #666; margin-bottom: 20px;">u  </div>
                <div class="loading">Закрытие окна...</div>
                <script>
                    // Отправляем сообщение об ошибке в родительское окно
                    if (window.opener) {
                        window.opener.postMessage({
                            type: 'amocrm_auth_error',
                            error: 'uk  '
                        }, window.location.origin);
                    }
                    
                    // Закрываем окно через 3 секунды
                    setTimeout(() => {
                        window.close();
                    }, 3000);
                </script>
            </body>
            </html>
            )rI   r   rJ   r   rK   r   rL   rM   r   rN   rO   rP   httpxAsyncClientpostr?   textr_   status
last_errorcommitfastapi.responsesrg   r2   str)rV   r*   rW   rX   r8   r9   rQ   rN   rA   rZ   rB   rR   clientresponse
token_datahtml_contentrg   es                     r'   amocrm_callbackry   f   s     ((;'..NNe#!!\%;%;;(	
 eg  4effF

;'IJJ/M::n-Lzz)R(//4H   " E6 E6fD	6#[[*01!*%2"6 $0 ) 	 	H ##s*# #KHMM?[ 
 "J &0^^N%CF>"&0nn_&EF?##->>,#?F< #->>,#?F< !'K!,K%)K"IIK -> .9^^,< =?*LX 75_E6 E6 E6	E6b  4	6!(K'4SVH%=K"IIK @2 ADAx H% &)VH -A+LZ 755KE6 E6 E6b4	6cE6 E6 E6s   DJ$HJ$J
H)H*CH:J$HJ$HJ$	JAJ/J0J4J$ JJ$JJJ!JJ!J$z/amocrm/refreshc           
        K   |j                  t              j                  t        t        j                  | k(  t        j
                  |j
                  k(  t        j                  dk(              j                         }|st        dd      |j                  }|j                  d      }|st        dd      |j                  d      }|j                  d	      }|j                  d
      }|j                  dd      j                  d      }	t        j                         4 d{   }
	 |
j                  |	 d||d||d       d{   }|j                  dk7  rt        dd|j                          |j#                         }|j                  d      |d<   |j                  d      |d<   |j                  d      |d<   ||_	        d|_        d|_        |j)                          dddcddd      d{    S 7 7 7 	# t*        $ rE}d|_        dt-        |       |_        |j)                          t        dt-        |            d}~ww xY w# 1 d{  7  sw Y   yxY ww)u5   
    Обновить access token для AmoCRM
    r;   r<   r=   r>   rc   rC   u   Refresh token не найденrA   rZ   rB   rD   rE   rF   Nr[   )rA   rZ   r]   rc   rB   r^   r`   u0   Ошибка обновления токена: rb   re   rf   Tu*   Токен успешно обновлен)successmessageri   zToken refresh error: )rI   r   rJ   r   rK   r   rL   rM   r   rN   rO   rP   rk   rl   rm   r?   rn   r_   ro   rp   rq   r2   rs   )r7   r8   r9   rQ   rN   rc   rA   rZ   rB   rR   rt   ru   rv   rx   s                 r'   amocrm_refresh_tokenr}     s]     ((;'..NNn,!!\%;%;;(	
 eg  4effFJJ/M4UVV

;'IJJ/M::n-Lzz)R(//4H  " *@ *@f)	@#[[*01!*%2"1%2$0 ) 	 	H ##s*# #Mhmm_] 
 "J &0^^N%CF>"&0nn_&EF?##->>,#?F< !'K!,K%)K"IIK  GA*@ *@ *@	*@J  	@!(K'<SVH%EK"IIKCA??	@K*@ *@ *@sz   D"I*$G>%I*(I*H	H 
B"H,I*8H9I* HI*	IA IIII'II'#I*z/bitrix24/authorizec                     t               }|j                  st        dd      t        | j                        }d|j                   d|j
                   d| }||dS )u{   
    Получить URL для OAuth авторизации в Bitrix24 через единое приложение
      u:   BITRIX_CLIENT_ID не настроен на сервереr>   z4https://oauth.bitrix.info/oauth/authorize?client_id=z!&response_type=code&redirect_uri=rG   )rH   r*   )r   BITRIX_CLIENT_IDr   r(   r   BITRIX_REDIRECT_URI)r8   r9   settingsr*   rS   s        r'   bitrix24_authorizer   X  s~     ~H$$O
 	
 #<#9#9:E//0!556
%		  & r)   z/bitrix24/callbackz Authorization code from Bitrix24zSecure state parameterdomain	member_idc           
        K   t               }|j                  r|j                  st        dd      t	        |      }|st        dd      |j                  t              j                  t        j                  |k(        j                         }|st        dd      t        j                         4 d{   }	 |j                  d	d
|j                  |j                  | |j                  d       d{   }	|	j                  dk7  rt        dd|	j                         |	j!                         }
|j                  t"              j                  t%        t"        j                  |k(  t"        j&                  dk(              j                         }|s!t#        |ddi d      }|j)                  |       |j*                  j-                  |
j/                  d      |
j/                  d      |
j/                  d      ||t1        j2                         j5                         d       d|_        d|_        |j;                          t=        ||
j/                  d      |       d{    dd|j>                  |dcddd      d{    S 7 7 7 ,7 # t@        $ rG}r*d|_        dtC        |       |_        |j;                          t        dtC        |            d}~ww xY w# 1 d{  7  sw Y   yxY ww)uf   
    Обработка OAuth callback от Bitrix24 через единое приложение
    r   uX   BITRIX_CLIENT_ID или BITRIX_CLIENT_SECRET не настроены на сервереr>   rC   u'   Неверный state параметрr<   u*   Пользователь не найденNz%https://oauth.bitrix.info/oauth/tokenr\   )r]   rA   rZ   rV   rB   )r%   r`   ra   bitrix24zBitrix24 Marketplace Apppending)r   rL   namerN   ro   rb   rc   re   )rb   rc   re   r   r   connected_atrf   Tu*   Bitrix24 успешно подключен)r{   r|   r7   r   ri   rj   )"r   r   BITRIX_CLIENT_SECRETr   r6   rI   r   rJ   r   rM   rk   rl   rm   r   r?   rn   r_   r   r   rL   addrN   updaterO   r   utcnow	isoformatro   rp   rq   _register_bitrix24_webhooksrK   r2   rs   )rV   r*   r   r   r9   r   r   userrt   ru   rv   rQ   rx   s                r'   bitrix24_callbackr   z  s     ~H$$H,I,Im
 	
 %U+I4]^^ 88D>  9!<=CCED4`aa   " F@ F@fE	@#[[7"6!)!:!:%-%B%B $,$@$@ ) 	 	H ##s*# #KHMM?[ 
 "J ((;/66))Y6$$
2
 eg  )'#3$ {# %% *~ >!+!@(nn\:&  ( 1 ; ; ='  "-K%)K"IIK .k:>>.;Y[abbb  G"-.. 	sF@ F@ F@	j coF@@  	@%,"+8Q)A&		CA??	@AF@ F@ F@s   B4K:6J7K::K%<:J6J7E*J!J"J6K:JK:JJK:	K"AKK""K%%K7+K.,K73K:rQ   rb   c           	        K   |syd}g d}t        j                         4 d{   }|D ]b  }	 |j                  d| d|||d       d{   }|j                  dk(  rt	        d	| d
|        nt	        d| d|j
                          d ddd      d{    y7 |7 U# t        $ r}t	        d| d|        Y d}~d}~ww xY w7 0# 1 d{  7  sw Y   yxY ww)uH   Автоматически регистрирует webhooks в Bitrix24Nz<https://your-domain.com/api/v1/integrations/bitrix24/webhook)onCrmDealAddonCrmDealUpdateonCrmContactAddonCrmContactUpdatezhttps://z/rest/event.bind.json)autheventhandler)paramsr`   zWebhook u'    зарегистрирован для u,   Ошибка регистрации webhook z: u3   Ошибка при регистрации webhook )rk   rl   rm   r?   printrn   r2   )	rQ   rb   r   webhook_urleventsrt   r   ru   rx   s	            r'   r   r     s&    PKF   " Z Zf 	ZEZ!'vh&;< ,!&#. "- "  ''3.HUG+RSYRZ[\HrRZR_R_Q`ab	ZZ Z Z  ZKE7RTUVTWXYYZ#Z Z Z Zs   "C#B!C#CB%B#A B%CC#CC##B%%	C	.C?CC		CC#C CC C#)(__doc__fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr   rk   typingr	   app.db.sessionr
   app.db.modelsr   r   app.api.depsr   app.core.configr   r   r   r   r!   r   routerr1   rs   r(   r6   rO   rT   ry   rm   r}   r   r   r    r)   r'   <module>r      s   = < "    ! + ) (     	('	3	Mc 	Mc 	M  *   !!12&/*** 	* !*Z c'GHs(89"4[#Dk !12&/b6
b6b6 c]b6 sm	b6
 b6 	b6  b6J  !!12&/H@H@H@ 	H@  H@V !" !12&/ #B  !c'IJs(@A!$K$T{&/c@
c@c@ SMc@ }	c@
 	c@ "c@LZ; Zc Z[^ Zr)   