o
    Ci}                     @   s  d dl mZmZ d dlZd dlmZ d dlmZ G dd deZG dd deZ	d d	l
mZ G d
d deZG dd deZG dd deZG dd deZG dd deZG dd de	ZG dd de	ZG dd de	ZG dd de	Zd dlmZ G dd deZd dlZG dd  d eZG d!d" d"eZG d#d$ d$e	ZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZ G d-d. d.Z!G d/d0 d0eZ"G d1d2 d2eZ#G d3d4 d4eZ$G d5d6 d6eZ%dS )7    )ABCabstractmethodN)	b64encode)Integration_Credentialsc                   @   sr   e Zd Ze Zg ZdefddZdefddZe	defddZ
defd	d
ZdedefddZdefddZdS )BaseAuthpayloadc                 C      || _ i | _d S Nr   final_resultselfr    r   -/var/www/Datamplify/Integration_controller.py__init__       
zBaseAuth.__init__c                 C   s,   |r| j |  }|rtd| d S d S )NzMissing fields: )REQUIRED_FIELDSkeys
ValueError)r   r   missingr   r   r   validate_payload$   s   zBaseAuth.validate_payloadreturnc                 C      d S r	   r   r   r   r   r   build_headers*   s   zBaseAuth.build_headersc              	   C   sn   |  | j |  }| jD ]'}ztj| ||dd}|jdks%|jdkr)W  dS W q tjy4   Y qw dS )N   )headerstimeout     TF)	r   r   r   TEST_ENDPOINTSrequestsget	build_urlstatus_codeRequestException)r   r   endpointresponser   r   r   validate_credentials.   s    
zBaseAuth.validate_credentialsr&   c                 C   s*   | j d u r| jd | _ | j d | S Nsite_url/)SITE_URLr   rstrip)r   r&   r   r   r   r#   B   s   
zBaseAuth.build_urlc                 C   s   | j | jd< | jS )Ncredentialsr
   r   r   r   r   export_credentialsG   s   zBaseAuth.export_credentialsN)__name__
__module____qualname__setr   r    dictr   r   r   r   boolr(   strr#   r/   r   r   r   r   r      s    r   c                   @   sF   e Zd ZdZdZdZdd Zdd Zdd	 Zd
e	fddZ
dd ZdS )	TokenAuthN Authorizationc                 C   s0   || _ | jd u r| j d | _i | _| | d S )Nr*   )r   r,   r   r   r   r   r   r   r   S   s
   
zTokenAuth.__init__c                 C   s"   | j | jd< | j d | j S r)   )r,   r   r-   TEST_ENDPOINTr   r   r   r   r#   Z   s   zTokenAuth.build_urlc                 C   s   | j d| jd  ddiS )NBearer 	api_tokenContent-Typeapplication/json
TOKEN_NAMEr   r   r   r   r   r   ^   s   zTokenAuth.build_headersr   c              
   C   s   |  | j |  }ztj|  |d}W n ty( } zW Y d }~dS d }~ww | jdkr;|jdkr;| 	  |
 S |jdkrH| 	  |
 S dS )Nr   Fhttps://api.hubapi.comr   r   )r   r   r   r!   r"   r#   	Exceptionr,   r$   store_tokenjson)r   r   r'   er   r   r   r(   d   s   
zTokenAuth.validate_credentialsc                 C   s   i | j d< d S Ntoken_metadatar   r   r   r   r   rD   t      zTokenAuth.store_token)r0   r1   r2   r,   r:   r@   r   r#   r   r5   r(   rD   r   r   r   r   r7   M   s    r7   )HTTPBasicAuthc                   @   sb   e Zd ZdZdZdZdZdefddZdefddZ	de
fd	d
ZdefddZdefddZdS )OAuthBaseAuthr8   client_credentialsNr   c                 C      ddiS )Nr=   z!application/x-www-form-urlencodedr   r   r   r   r   r      s   zOAuthBaseAuth.build_headersc                 C   sR   | j dd p	| j}|d urd|}| j| j d | j d d|r&d|iS i S )Nscopes 	client_idclient_secret)
grant_typerQ   rR   scoper   r"   SCOPEjoin
GRANT_TYPEr   rT   r   r   r   token_payload   s   

zOAuthBaseAuth.token_payloadc           	   
   C   sT  |  | j | jdkrU|  d dkrdnd}ztj|  fd|  i||  iddi}W n tjyH } zt	| W Y d }~d	S d }~ww |j
d
krPd	S | }nN| jdkrdd l}|j| jd }d | jd< dd l}d|jd< t| j| j| jd}z|j| j|t| j| jd}W n ty } zW Y d }~d	S d }~ww | | dS )NrM   r=   r>   rE   datar   r      Fr   authorization_coder   coder*   1OAUTHLIB_RELAX_TOKEN_SCOPEredirect_urirT   r^   authT)r   r   rX   r   r!   post	token_urlrZ   r%   printr$   rE   urllib.parseparseunquoteosenvironOAuth2SessionrQ   rb   rO   fetch_tokenTOKEN_ENDPOINTrK   rR   rC   rD   )	r   body_argrrF   
token_dataurllib
clean_coderk   oauthr   r   r   r(      sH   






 
z"OAuthBaseAuth.validate_credentialsc                 C   s0   | j dp| j}|| j d< |d | j S r)   )r   r"   r,   r-   ro   )r   r*   r   r   r   rf      s   
zOAuthBaseAuth.token_urlrr   c                 C   s   || j d< d S rG   rI   )r   rr   r   r   r   rD      rJ   zOAuthBaseAuth.store_token)r0   r1   r2   ro   rX   rV   r,   r4   r   rZ   r5   r(   r6   rf   rD   r   r   r   r   rL   y   s    !rL   c                   @   s.   e Zd Zh dZg dZdZdefddZdS )ConnectWiseAuth>   r*   
company_id
public_keyprivate_key)z(/v4_6_release/apis/3.0/company/companiesz-/v4_6_release/apis/3.0/company/configurationsz&/v4_6_release/apis/3.0/service/ticketsz$006d3e9d-26aa-461b-914c-1b6901beea3br   c                 C   sF   t | jd  d| jd  d| jd    }d| | jddS )	Nrw   +rx   :ry   Basic r>   )r9   clientIDr=   )r   r   encodedecode	CLIENT_ID)r   tokenr   r   r   r      s   (zConnectWiseAuth.build_headersN)r0   r1   r2   r   r    r   r4   r   r   r   r   r   rv      s
    rv   c                   @   s"   e Zd Zh dZdZdZdgZdS )HaloPsaAuth>   r*   rQ   rR   z/auth/tokenrM   allN)r0   r1   r2   r   ro   rX   rV   r   r   r   r   r      s
    
r   c                   @   s6   e Zd ZddhZdZdZdZdd Zdefd	d
Z	dS )Pax8AuthrQ   rR   rM   z	/v1/tokenhttps://api.pax8.comc                 C   s
   dddS )Nr>   )r=   acceptr   r   r   r   r   r     s   zPax8Auth.build_headersr   c                 C   sT   | j dd p	| j}|d urd|}| j| j d | j d dd|r'd|iS i S )NrO   rP   rQ   rR   r   )rS   rQ   rR   audiencerT   rU   rY   r   r   r   rZ     s   

zPax8Auth.token_payloadN)
r0   r1   r2   r   rX   ro   r,   r   r4   rZ   r   r   r   r   r     s    r   c                   @   s    e Zd Zh dZdZdZdZdS )	NinjaAuth>   rO   rQ   rR   z/oauth/tokenzhttps://api.ninjaone.comrM   N)r0   r1   r2   r   ro   r,   rX   r   r   r   r   r   $  s
    r   c                   @   s<   e Zd ZddhZdZdee dZdZdd Zd	d
 Z	dS )ShopifyAuthr<   	shop_namez2024-01z/admin/api/z
/shop.jsonzX-Shopify-Access-Tokenc                 C   s   || _ | j d | _i | _d S )Nr   )r   r,   r   r   r   r   r   r   :  s   
zShopifyAuth.__init__c                 C   s   | j | jd ddiS )Nr<   r=   r>   r?   r   r   r   r   r   ?  s   zShopifyAuth.build_headersN)
r0   r1   r2   r   API_VERSIONr6   r:   r@   r   r   r   r   r   r   r   1  s    r   c                   @   s(   e Zd ZddhZdZdd Zdd ZdS )	BambooHrAuthr<   domainz(https://api.bamboohr.com/api/gateway.phpc                 C   s4   || _ i | _| | d| j d d d| _d S )Nr+   r   z/v1/company_information)r   r   r   r-   r:   r   r   r   r   r   N  s   
zBambooHrAuth.__init__c                 C   s:   dd l }|| jd  d  }| jd| ddiS )Nr   r<   z:xr|   r=   r>   )base64r   r   r~   r   r@   )r   r   encoded_keyr   r   r   r   U  s
   zBambooHrAuth.build_headersN)r0   r1   r2   r   r,   r   r   r   r   r   r   r   G  s    r   c                   @   s   e Zd ZddhZdZdS )DbtAuth
account_idr<   z/api/v2/accounts/N)r0   r1   r2   r   r:   r   r   r   r   r   ^  s
    r   c                   @      e Zd ZdhZdZdZdS )	TallyAuthr<   z	/users/mezhttps://api.tally.so/N)r0   r1   r2   r   r:   r,   r   r   r   r   r   g  
    r   )rm   c                   @   sX   e Zd ZddhZdZdZed d Zed d Zed d Z	g d	Z
d
ZdZdd ZdS )QuickbooksAuthr^   stater]   z9https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer
QUICKBOOKSr   CLIENT_SECRETREDIRECT_URI)z com.intuit.quickbooks.accountingzcom.intuit.quickbooks.paymentopenidprofileemailphoneaddressz)https://sandbox-quickbooks.api.intuit.comz+https://appcenter.intuit.com/connect/oauth2c                 C   6   t | j| j| jd}|| j\}}d| di}|S Nra   redirection_url&prompt=loginrm   rQ   rb   rO   authorization_urlauthorization_base_urlr   ru   r   r   r[   r   r   r   get_token_url  
   
zQuickbooksAuth.get_token_urlNr0   r1   r2   r   rX   ro   r   rQ   rR   rb   rO   apir   r   r   r   r   r   r   o  s    r   c                   @   s^   e Zd ZdhZdZdZed d Zed d Zed d Z	g dZ
d	Zd	Zd
d Zdd ZdS )JiraAuthr^   r]   z&https://auth.atlassian.com/oauth/tokenJIRAr   r   r   )offline_accesszread:accountzread:mezread:jira-workzread:jira-userzmanage:jira-configurationzmanage:jira-projectz$https://auth.atlassian.com/authorizec                 C   sj   dd l }dtt|   }ddd}t| j| j| j|d}|| j\}}d| dt	j
| i}|S )	Nr   
anti_csrf_zapi.atlassian.comconsent)r   promptrb   rT   r   r   ?timer6   intrm   rQ   rb   rO   r   r   rs   ri   	urlencoder   r   r   paramsru   r   r[   r   r   r   r     s   zJiraAuth.get_token_urlc              
   C   s   |  | j dd l}|j| jd }d | jd< dd l}d|jd< t| j| j	| j
d}z|j| j|t| j| jd}W n tyN } zW Y d }~dS d }~ww d	}|d
 }d| dd}	tj||	d}
|
jdkrkdS |
 }|d d |d< | | dS )Nr   r^   r*   r_   r`   ra   rc   Fz:https://api.atlassian.com/oauth/token/accessible-resourcesaccess_tokenr;   r>   r9   r=   rA   r   idcloud_idT)r   r   rh   ri   rj   rk   rl   rm   rQ   rb   rO   rn   ro   rK   rR   rC   r!   r"   r$   rE   rD   )r   rs   rt   rk   ru   rr   rF   	cloud_urlr   r   cloud_responsecl_respr   r   r   r(     s2   

 

zJiraAuth.validate_credentialsN)r0   r1   r2   r   rX   ro   r   rQ   rR   rb   rO   r   r   r   r(   r   r   r   r   r     s    r   c                   @   sB   e Zd ZdhZdZdZdZdZdZg d Z	Z
dZdZd	d
 ZdS )GoogleSheetsAuthr^   r]   #https://oauth2.googleapis.com/tokenzH651576155260-4v9d0nii8qbtun6ntnif5n05cm9l3u6u.apps.googleusercontent.comz#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z=https://app.analytify.ai/analytify/datasources/google-sheets/)z5https://www.googleapis.com/auth/spreadsheets.readonlyz7https://www.googleapis.com/auth/drive.metadata.readonlyz.https://www.googleapis.com/auth/userinfo.emailz0https://www.googleapis.com/auth/userinfo.profile)https://accounts.google.com/o/oauth2/authc                 C   sl   dd l }dtt|   }dddd}t| j| j| j|d}|| j\}}d| d	t	j
| i}|S )
Nr   r   r^   offliner   response_typeaccess_typer   r   r   r   r   r   r   r   r   r     s   zGoogleSheetsAuth.get_token_urlN)r0   r1   r2   r   rX   ro   rQ   rR   rb   rO   GOOGLE_AUTH_SCOPEr   r   r   r   r   r   r   r     s    	r   c                   @   r   )HubSpotAuthr<   rB   z0/crm/v3/objects/contacts?limit=10&archived=falseN)r0   r1   r2   REQUIRED_FIELDr,   r:   r   r   r   r   r     r   r   c                   @   sP   e Zd Zh dZdZdZdZdZdZg dZ	g dZ
d	Zd	Zd
d Zdd ZdS )HubspotAuth>   rO   rQ   rR   rM   z%https://api.hubapi.com/oauth/v1/tokenz$4ead0fa0-1b53-42e7-ad62-38db62caf7e7z$3dcaead8-9d93-4534-9233-c47ab6c9344ez0https://qa.insightapps.ai/authentication/hubspot)zcrm.schemas.contacts.readzcrm.objects.deals.readzcrm.objects.custom.readzcrm.objects.courses.readzcrm.schemas.companies.readzcrm.schemas.quotes.readzcrm.objects.owners.readz!crm.objects.marketing_events.readzconversations.readzcrm.objects.users.readzsettings.users.readzcrm.lists.readcontentticketsz
crm.importzaccount-info.security.readzsettings.currencies.readzcommunication_preferences.readzcrm.objects.companies.readzcrm.objects.contacts.readzcrm.objects.goals.readzcrm.objects.leads.readzcrm.objects.line_items.readzcrm.objects.orders.readzcrm.objects.products.readzcrm.objects.subscriptions.readzcrm.schemas.custom.read)#zcrm.schemas.listings.readz%crm.objects.feedback_submissions.readz-communication_preferences.statuses.batch.readzmarketing.campaigns.readzcrm.schemas.carts.readzcrm.schemas.invoices.readzcrm.objects.services.readhubdbzcms.domains.readzcrm.objects.listings.readz!cms.membership.access_groups.readz cms.knowledge_base.articles.readzcrm.schemas.deals.readz!crm.objects.commercepayments.readz cms.knowledge_base.settings.readzcrm.objects.carts.readz	ctas.readzcrm.objects.quotes.readz crm.objects.partner-clients.readzcrm.dealsplits.read_writezcrm.pipelines.orders.readzcrm.objects.appointments.readzcrm.schemas.line_items.readz"conversations.custom_channels.readzcms.performance.readzsettings.users.teams.readzcms.functions.readzcrm.schemas.services.readzcrm.schemas.orders.readzcrm.schemas.courses.readz!crm.schemas.commercepayments.readzcrm.schemas.subscriptions.readzcrm.schemas.appointments.readz marketing.campaigns.revenue.readzcrm.objects.invoices.readz'https://app.hubspot.com/oauth/authorizec                 C   s>   t | j| j| jd}|| j\}}d| d| j di}|S )Nra   r   z&optional_scope=r   )rm   rQ   rb   rO   r   r   options_scopesr   r   r   r   r   X  s
   zHubspotAuth.get_token_urlc                 C   sL   d| j | j| j| jd d}tj| j|d}|jdkr$| |	  dS dS )Nr]   r^   )rS   rQ   rR   rb   r^   )r[   r   TF)
rQ   rR   rb   r   r!   re   ro   r$   rD   rE   )r   r[   rr   r   r   r   r(   a  s   
z HubspotAuth.validate_credentialsN)r0   r1   r2   r   rX   ro   rQ   rR   rb   rO   r   r   r   r   r(   r   r   r   r   r     s    -	r   c                   @   sT   e Zd ZdhZdZdZed d Zed d Zed d Z	dgZ
d	Zd	Zd
d ZdS )SalesforceAuthr^   r]   z2https://login.salesforce.com/services/oauth2/token
SALESFORCEr   r   r   zfull refresh_tokenz6https://login.salesforce.com/services/oauth2/authorizec                 C   r   r   r   r   r   r   r   r     r   zSalesforceAuth.get_token_urlNr   r   r   r   r   r   t  s    r   c                   @   sR   e Zd ZdhZdZed d Zed d Zed d Zdd Z	d	d
 Z
dd ZdS )ZohoAuthr^   r]   ZOHOr   r   r   c                 C   s   || _ || _i | _| j   dkr dg| _n dkr" ddg| _ndkr*g d| _| | jd  | _| j| jd	< | j| jd
< | j | jd< d| j d| _d S )Nzoho_crmzZohoCRM.modules.ALL
zoho_bookszZohoBooks.fullaccess.allzZohoBooks.settings.READzoho_inventory)zZohoInventory.contacts.READzZohoInventory.items.READz!ZohoInventory.compositeitems.READz'ZohoInventory.inventoryadjustments.READz!ZohoInventory.transferorders.READzZohoInventory.settings.READzZohoInventory.salesorders.READzZohoInventory.packages.READz!ZohoInventory.shipmentorders.READzZohoInventory.invoices.READz#ZohoInventory.customerpayments.READzZohoInventory.salesreturns.READzZohoInventory.creditnotes.READz!ZohoInventory.purchaseorders.READz#ZohoInventory.purchasereceives.READzZohoInventory.bills.READcountryrO   r   zohotypehttps://accounts.zohoz/oauth/v2/token)integrationr   r   lowerrO   domain_mappingr   ro   r   integration_typer   r   r   r   r     s   



zZohoAuth.__init__c                 C   s^   d| j  d| _t| j| j| jd}|| j\}}dddd}d| d	tj	| i}|S )
Nr   z/oauth/v2/authra   r^   r   r   r   r   r   )
r   r   rm   rQ   rb   rO   r   rs   ri   r   )r   ru   r   r   r   r[   r   r   r   r     s   zZohoAuth.get_token_urlc              	   C   s6   ddddddddd	}t |  }||d}|S )
Nz.comz.euz.inz.com.auz.jpz.caz.com.cnz.sa)zunited stateseuropeindia	australiajapancanadachinazsaudi arabia)r6   stripr   r"   )r   r   country_domain_mapcountry_normalizedr   r   r   r   r     s   
zZohoAuth.domain_mappingN)r0   r1   r2   r   rX   r   rQ   rR   rb   r   r   r   r   r   r   r   r     s    r   c                   @   s(   e Zd Zh dZdZdd Zdd ZdS )ImmyBotAuth>   rQ   azure_domainrR   instance_subdomainrM   c                 C   s   || _ i | _|  | _d S r	   )r   r   r   ro   r   r   r   r   r     s   zImmyBotAuth.__init__c              
   C   s   z,d| j d  d}t| d }|dd | _d| j d  d	| _d
| j dW S  ty? } zW Y d }~dS d }~ww )Nzhttps://login.windows.net/r   z!/.well-known/openid-configurationtoken_endpointr+      zhttps://r   z.immy.bot/.defaultz"https://login.microsoftonline.com/z/oauth2/v2.0/tokenF)r   r!   r"   rE   split	tenant_idrV   rC   )r   openid_config_urlr   rF   r   r   r   rf     s   zImmyBotAuth.token_urlN)r0   r1   r2   r   rX   r   rf   r   r   r   r   r     s
    r   c                   @   s4   e Zd ZdededefddZdedefddZdS )	IntegrationAuthOrchestratorr   r   r   c                 C   s*   |  ||}| stdd| dS )NzInvalid credentialsT)	connectedr.   )_get_auth_handlerr(   r   r/   )r   r   r   rd   r   r   r   authenticate  s   z(IntegrationAuthOrchestrator.authenticatec                 C   sx  |   dkr t|S  dkr t|S  dkr t|S  dkr' t|S  dkr0 t|S  dkr9 t|S  dkrB t|S  dkrK t|S  d	krT t	|S  d
kr] t
|S  dkrf t|S  dkro t|S  dkrx t|S  dkr t||S  dkr t||S  dkr t||S  dkr t|S  dkr t|S  dkr t|S dkrt|S td)Nconnectwiseninjahalopsashopifytally
quickbooks
salesforcejirahubspotgooglesheetdbtpax8bamboohrr   r   r   googleanalyticgeminideepseekopenaizUnsupported integration type)r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   GoogleAnalyticsAuth
GeminiAuthDeepseekAuth
OpenAIAuthr   r   r   r   r   r     sT   





















z-IntegrationAuthOrchestrator._get_auth_handlerN)r0   r1   r2   r6   r4   r   r   r   r   r   r   r     s    r   c                   @   sB   e Zd Zg dZdd Zdd Zdd Zdd	 Zd
efddZ	dS )r  )type
project_idprivate_key_idry   client_emailrQ   client_x509_cert_urlc                 C   r   r	   r
   r   r   r   r   r   N  r   zGoogleAnalyticsAuth.__init__c                 C   s0   | j r| j| j   }|rtd| d S d S )Nz'Missing fields':)r   r   r   r   )r   r   r   r   r   r   S  s   z$GoogleAnalyticsAuth.validate_payloadc                 C   r   r	   r   r   r   r   r   r   Y  s   z!GoogleAnalyticsAuth.build_headersc                 C   sL   | j d | j d | j d | j d dd| j d | j d d	d
d| j d d
S )Nr  r	  r
  ry   z\n
r  rQ   r   r   z*https://www.googleapis.com/oauth2/v1/certsr  )
r  r	  r
  ry   r  rQ   auth_uri	token_uriauth_provider_x509_cert_urlr  )r   replacer   r   r   r   get_service_info[  s   z$GoogleAnalyticsAuth.get_service_infor   c           	   
   C   sv   |    ddlm}m}m}m} ddlm} ddlm	} z|j
|  }W dS  ty: } zW Y d }~dS d }~ww )Nr   )RunReportRequest	DateRange	DimensionMetric)BetaAnalyticsDataClient)service_accountFT)r   "google.analytics.data_v1beta.typesr  r  r  r  google.analytics.data_v1betar  google.oauth2r  Credentialsfrom_service_account_infor  rC   )	r   r  r  r  r  r  r  r.   rF   r   r   r   r(   i  s   z(GoogleAnalyticsAuth.validate_credentialsN)
r0   r1   r2   r   r   r   r   r  r5   r(   r   r   r   r   r  C  s    
r  c                   @   $   e Zd ZdhZdZdgZdd ZdS )r  r<   zhttps://api.openai.com/v1//modelsc                 C   s   dd| j d  iS )Nr9   r;   r<   r   r   r   r   r   r     s   zOpenAIAuth.build_headersNr0   r1   r2   r   r,   r    r   r   r   r   r   r    
    r  c                   @   r  )r  r<   zhttps://api.deepseek.com/v1/r  c                 C   s   d| j d  ddS )Nr;   r<   r>   r   r   r   r   r   r   r     s   zDeepseekAuth.build_headersNr!  r   r   r   r   r    r"  r  c                   @   s*   e Zd ZdhZdZdgZdefddZdS )r  r<   z1https://generativelanguage.googleapis.com/v1beta/r  r   c                 C   rN   )Nr=   r>   r   r   r   r   r   r     s   zGeminiAuth.build_headersN)r0   r1   r2   r   r,   r    r4   r   r   r   r   r   r    s
    r  )&abcr   r   r!   r   r   Datamplify.settingsr   r   r7   requests.authrK   rL   rv   r   r   r   r   r   r   r   requests_oauthlibrm   r   rh   rs   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   s>   2*G&!	?(zHSF	