From e648e86f7741a09b956f397380bddcd9195dc98d Mon Sep 17 00:00:00 2001 From: Tom Owers Date: Thu, 5 Sep 2024 11:45:19 +0100 Subject: [PATCH] Added vitally Source --- frontend/public/services/vitally.png | Bin 0 -> 103217 bytes .../data-warehouse/new/sourceWizardLogic.tsx | 39 +++ .../DataWarehouseManagedSourcesTable.tsx | 4 +- frontend/src/types.ts | 1 + latest_migrations.manifest | 2 +- ...66_alter_externaldatasource_source_type.py | 30 +++ .../data_imports/pipelines/schemas.py | 8 + .../pipelines/vitally/__init__.py | 246 ++++++++++++++++++ .../pipelines/vitally/settings.py | 17 ++ .../workflow_activities/import_data.py | 21 ++ posthog/warehouse/api/external_data_source.py | 34 +++ .../warehouse/models/external_data_schema.py | 4 +- .../warehouse/models/external_data_source.py | 1 + 13 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 frontend/public/services/vitally.png create mode 100644 posthog/migrations/0466_alter_externaldatasource_source_type.py create mode 100644 posthog/temporal/data_imports/pipelines/vitally/__init__.py create mode 100644 posthog/temporal/data_imports/pipelines/vitally/settings.py diff --git a/frontend/public/services/vitally.png b/frontend/public/services/vitally.png new file mode 100644 index 0000000000000000000000000000000000000000..867ed5e10e9080df1cfe5ab4d4464b59f00561d3 GIT binary patch literal 103217 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 loVATl9cv = { ], caption: 'Select an existing Salesforce account to link to PostHog or create a new connection', }, + Vitally: { + name: 'Vitally', + fields: [ + { + name: 'secret_token', + label: 'Secret token', + type: 'text', + required: true, + placeholder: 'sk_live_...', + }, + { + type: 'select', + name: 'region', + label: 'Vitally region', + required: true, + defaultValue: 'EU', + options: [ + { + label: 'EU', + value: 'EU', + }, + { + label: 'US', + value: 'US', + fields: [ + { + name: 'subdomain', + label: 'Vitally subdomain', + type: 'text', + required: true, + placeholder: '', + }, + ], + }, + ], + }, + ], + caption: '', + }, } export const buildKeaFormDefaultFromSourceDetails = ( diff --git a/frontend/src/scenes/data-warehouse/settings/DataWarehouseManagedSourcesTable.tsx b/frontend/src/scenes/data-warehouse/settings/DataWarehouseManagedSourcesTable.tsx index d18657892fd22..4d1fc0f20b4cd 100644 --- a/frontend/src/scenes/data-warehouse/settings/DataWarehouseManagedSourcesTable.tsx +++ b/frontend/src/scenes/data-warehouse/settings/DataWarehouseManagedSourcesTable.tsx @@ -14,6 +14,7 @@ import IconSalesforce from 'public/services/salesforce.png' import IconSnowflake from 'public/services/snowflake.png' import IconMSSQL from 'public/services/sql-azure.png' import IconStripe from 'public/services/stripe.png' +import IconVitally from 'public/services/vitally.png' import IconZendesk from 'public/services/zendesk.png' import { urls } from 'scenes/urls' @@ -189,6 +190,7 @@ export function RenderDataWarehouseSourceIcon({ azure: Iconazure, Salesforce: IconSalesforce, MSSQL: IconMSSQL, + Vitally: IconVitally, }[type] return ( @@ -203,7 +205,7 @@ export function RenderDataWarehouseSourceIcon({ } > - {type} + {type} diff --git a/frontend/src/types.ts b/frontend/src/types.ts index a4e8187d755de..61d6072f17d21 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -3861,6 +3861,7 @@ export const externalDataSources = [ 'Zendesk', 'Snowflake', 'Salesforce', + 'Vitally', ] as const export type ExternalDataSourceType = (typeof externalDataSources)[number] diff --git a/latest_migrations.manifest b/latest_migrations.manifest index 85b48ed0ed16f..54f01686c7aee 100644 --- a/latest_migrations.manifest +++ b/latest_migrations.manifest @@ -5,7 +5,7 @@ contenttypes: 0002_remove_content_type_name ee: 0016_rolemembership_organization_member otp_static: 0002_throttling otp_totp: 0002_auto_20190420_0723 -posthog: 0465_datawarehouse_stripe_account +posthog: 0466_alter_externaldatasource_source_type sessions: 0001_initial social_django: 0010_uid_db_index two_factor: 0007_auto_20201201_1019 diff --git a/posthog/migrations/0466_alter_externaldatasource_source_type.py b/posthog/migrations/0466_alter_externaldatasource_source_type.py new file mode 100644 index 0000000000000..4a4b2f522f68b --- /dev/null +++ b/posthog/migrations/0466_alter_externaldatasource_source_type.py @@ -0,0 +1,30 @@ +# Generated by Django 4.2.15 on 2024-09-05 10:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("posthog", "0465_datawarehouse_stripe_account"), + ] + + operations = [ + migrations.AlterField( + model_name="externaldatasource", + name="source_type", + field=models.CharField( + choices=[ + ("Stripe", "Stripe"), + ("Hubspot", "Hubspot"), + ("Postgres", "Postgres"), + ("Zendesk", "Zendesk"), + ("Snowflake", "Snowflake"), + ("Salesforce", "Salesforce"), + ("MySQL", "MySQL"), + ("MSSQL", "MSSQL"), + ("Vitally", "Vitally"), + ], + max_length=128, + ), + ), + ] diff --git a/posthog/temporal/data_imports/pipelines/schemas.py b/posthog/temporal/data_imports/pipelines/schemas.py index 0acd00e8bd6f3..15214f939b78a 100644 --- a/posthog/temporal/data_imports/pipelines/schemas.py +++ b/posthog/temporal/data_imports/pipelines/schemas.py @@ -17,6 +17,11 @@ INCREMENTAL_ENDPOINTS as SALESFORCE_INCREMENTAL_ENDPOINTS, INCREMENTAL_FIELDS as SALESFORCE_INCREMENTAL_FIELDS, ) +from posthog.temporal.data_imports.pipelines.vitally.settings import ( + ENDPOINTS as VITALLY_ENDPOINTS, + INCREMENTAL_ENDPOINTS as VITALLY_INCREMENTAL_ENDPOINTS, + INCREMENTAL_FIELDS as VITALLY_INCREMENTAL_FIELDS, +) PIPELINE_TYPE_SCHEMA_DEFAULT_MAPPING = { ExternalDataSource.Type.STRIPE: STRIPE_ENDPOINTS, @@ -29,6 +34,7 @@ ExternalDataSource.Type.SALESFORCE: SALESFORCE_ENDPOINTS, ExternalDataSource.Type.MYSQL: (), ExternalDataSource.Type.MSSQL: (), + ExternalDataSource.Type.VITALLY: VITALLY_ENDPOINTS, } PIPELINE_TYPE_INCREMENTAL_ENDPOINTS_MAPPING = { @@ -40,6 +46,7 @@ ExternalDataSource.Type.SALESFORCE: SALESFORCE_INCREMENTAL_ENDPOINTS, ExternalDataSource.Type.MYSQL: (), ExternalDataSource.Type.MSSQL: (), + ExternalDataSource.Type.VITALLY: VITALLY_INCREMENTAL_ENDPOINTS, } PIPELINE_TYPE_INCREMENTAL_FIELDS_MAPPING: dict[ExternalDataSource.Type, dict[str, list[IncrementalField]]] = { @@ -51,4 +58,5 @@ ExternalDataSource.Type.SALESFORCE: SALESFORCE_INCREMENTAL_FIELDS, ExternalDataSource.Type.MYSQL: {}, ExternalDataSource.Type.MSSQL: {}, + ExternalDataSource.Type.VITALLY: VITALLY_INCREMENTAL_FIELDS, } diff --git a/posthog/temporal/data_imports/pipelines/vitally/__init__.py b/posthog/temporal/data_imports/pipelines/vitally/__init__.py new file mode 100644 index 0000000000000..4691f12a3d150 --- /dev/null +++ b/posthog/temporal/data_imports/pipelines/vitally/__init__.py @@ -0,0 +1,246 @@ +import base64 +from typing import Any, Optional +import dlt +from dlt.sources.helpers.rest_client.paginators import BasePaginator +from dlt.sources.helpers.requests import Response, Request +import requests +from posthog.temporal.data_imports.pipelines.rest_source import RESTAPIConfig, rest_api_resources +from posthog.temporal.data_imports.pipelines.rest_source.typing import EndpointResource + + +def get_resource(name: str, is_incremental: bool) -> EndpointResource: + resources: dict[str, EndpointResource] = { + "Organizations": { + "name": "Organizations", + "table_name": "organizations", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/organizations", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Accounts": { + "name": "Accounts", + "table_name": "accounts", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/accounts", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Users": { + "name": "Users", + "table_name": "users", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/users", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Conversations": { + "name": "Conversations", + "table_name": "conversations", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/conversations", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Notes": { + "name": "Notes", + "table_name": "notes", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/notes", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Projects": { + "name": "Projects", + "table_name": "projects", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/projects", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Tasks": { + "name": "Tasks", + "table_name": "tasks", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/tasks", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "NPS_Responses": { + "name": "NPS_Responses", + "table_name": "nps_responses", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/npsResponses", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + "Custom_Objects": { + "name": "Custom_Objects", + "table_name": "custom_objects", + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + "endpoint": { + "data_selector": "results", + "path": "/resources/customObjects", + "params": {"limit": 100, "sortBy": "updatedAt"}, + }, + "table_format": "delta", + }, + } + + return resources[name] + + +class VitallyPaginator(BasePaginator): + def __init__(self) -> None: + super().__init__() + + def update_state(self, response: Response, data: Optional[list[Any]] = None) -> None: + res = response.json() + + self._cursor = None + + if not res: + self._has_next_page = False + return + + if res["next"]: + self._has_next_page = True + self._cursor = res["next"] + else: + self._has_next_page = False + + def update_request(self, request: Request) -> None: + if request.params is None: + request.params = {} + + request.params["from"] = self._cursor + + +def get_base_url(region: str, subdomain: Optional[str]) -> str: + if region == "US" and subdomain: + return f"https://{subdomain}.rest.vitally.io/" + + return "https://rest.vitally-eu.io/" + + +@dlt.source(max_table_nesting=0) +def vitally_source( + secret_token: str, + region: str, + subdomain: Optional[str], + endpoint: str, + team_id: int, + job_id: str, + is_incremental: bool = False, +): + config: RESTAPIConfig = { + "client": { + "base_url": get_base_url(region, subdomain), + "auth": { + "type": "http_basic", + "username": secret_token, + "password": "", + }, + "paginator": VitallyPaginator(), + }, + "resource_defaults": { + "primary_key": "id", + "write_disposition": { + "disposition": "merge", + "strategy": "upsert", + } + if is_incremental + else "replace", + }, + "resources": [get_resource(endpoint, is_incremental)], + } + + yield from rest_api_resources(config, team_id, job_id) + + +def validate_credentials(secret_token: str, region: str, subdomain: Optional[str]) -> bool: + basic_token = base64.b64encode(f"{secret_token}:".encode("ascii")).decode("ascii") + res = requests.get( + f"{get_base_url(region, subdomain)}resources/users?limit=1", + headers={"Authorization": f"Basic {basic_token}"}, + ) + + return res.status_code == 200 diff --git a/posthog/temporal/data_imports/pipelines/vitally/settings.py b/posthog/temporal/data_imports/pipelines/vitally/settings.py new file mode 100644 index 0000000000000..fb715ad011032 --- /dev/null +++ b/posthog/temporal/data_imports/pipelines/vitally/settings.py @@ -0,0 +1,17 @@ +from posthog.warehouse.types import IncrementalField + +ENDPOINTS = ( + "Organizations", + "Accounts", + "Users", + "Conversations", + "Notes", + "Projects", + "Tasks", + "NPS_Responses", + "Custom_Objects", +) + +INCREMENTAL_ENDPOINTS = () + +INCREMENTAL_FIELDS: dict[str, list[IncrementalField]] = {} diff --git a/posthog/temporal/data_imports/workflow_activities/import_data.py b/posthog/temporal/data_imports/workflow_activities/import_data.py index 6ce4237f53711..73706e1191589 100644 --- a/posthog/temporal/data_imports/workflow_activities/import_data.py +++ b/posthog/temporal/data_imports/workflow_activities/import_data.py @@ -283,6 +283,27 @@ async def import_data_activity(inputs: ImportDataActivityInputs): is_incremental=schema.is_incremental, ) + return await _run( + job_inputs=job_inputs, + source=source, + logger=logger, + inputs=inputs, + schema=schema, + reset_pipeline=reset_pipeline, + ) + elif model.pipeline.source_type == ExternalDataSource.Type.VITALLY: + from posthog.temporal.data_imports.pipelines.vitally import vitally_source + + source = vitally_source( + secret_token=model.pipeline.job_inputs.get("secret_token"), + region=model.pipeline.job_inputs.get("region"), + subdomain=model.pipeline.job_inputs.get("subdomain"), + endpoint=schema.name, + team_id=inputs.team_id, + job_id=inputs.run_id, + is_incremental=schema.is_incremental, + ) + return await _run( job_inputs=job_inputs, source=source, diff --git a/posthog/warehouse/api/external_data_source.py b/posthog/warehouse/api/external_data_source.py index 2e3f66de9c630..24439fcecdc19 100644 --- a/posthog/warehouse/api/external_data_source.py +++ b/posthog/warehouse/api/external_data_source.py @@ -24,6 +24,7 @@ from posthog.hogql.database.database import create_hogql_database from posthog.temporal.data_imports.pipelines.stripe import validate_credentials as validate_stripe_credentials from posthog.temporal.data_imports.pipelines.zendesk import validate_credentials as validate_zendesk_credentials +from posthog.temporal.data_imports.pipelines.vitally import validate_credentials as validate_vitally_credentials from posthog.temporal.data_imports.pipelines.schemas import ( PIPELINE_TYPE_INCREMENTAL_ENDPOINTS_MAPPING, PIPELINE_TYPE_INCREMENTAL_FIELDS_MAPPING, @@ -280,6 +281,8 @@ def create(self, request: Request, *args: Any, **kwargs: Any) -> Response: new_source_model = self._handle_zendesk_source(request, *args, **kwargs) elif source_type == ExternalDataSource.Type.SALESFORCE: new_source_model = self._handle_salesforce_source(request, *args, **kwargs) + elif source_type == ExternalDataSource.Type.VITALLY: + new_source_model = self._handle_vitally_source(request, *args, **kwargs) elif source_type in [ ExternalDataSource.Type.POSTGRES, ExternalDataSource.Type.MYSQL, @@ -395,6 +398,28 @@ def _handle_stripe_source(self, request: Request, *args: Any, **kwargs: Any) -> return new_source_model + def _handle_vitally_source(self, request: Request, *args: Any, **kwargs: Any) -> ExternalDataSource: + payload = request.data["payload"] + secret_token = payload.get("secret_token") + region = payload.get("region") + subdomain = payload.get("subdomain", None) + prefix = request.data.get("prefix", None) + source_type = request.data["source_type"] + + # TODO: remove dummy vars + new_source_model = ExternalDataSource.objects.create( + source_id=str(uuid.uuid4()), + connection_id=str(uuid.uuid4()), + destination_id=str(uuid.uuid4()), + team=self.team, + status="Running", + source_type=source_type, + job_inputs={"secret_token": secret_token, "region": region, "subdomain": subdomain}, + prefix=prefix, + ) + + return new_source_model + def _handle_zendesk_source(self, request: Request, *args: Any, **kwargs: Any) -> ExternalDataSource: payload = request.data["payload"] api_key = payload.get("api_key") @@ -690,6 +715,15 @@ def database_schema(self, request: Request, *arg: Any, **kwargs: Any): status=status.HTTP_400_BAD_REQUEST, data={"message": "Invalid credentials: Zendesk credentials are incorrect"}, ) + elif source_type == ExternalDataSource.Type.VITALLY: + secret_token = request.data.get("secret_token", "") + region = request.data.get("region", "") + subdomain = request.data.get("subdomain", "") + if not validate_vitally_credentials(subdomain=subdomain, secret_token=secret_token, region=region): + return Response( + status=status.HTTP_400_BAD_REQUEST, + data={"message": "Invalid credentials: Zendesk credentials are incorrect"}, + ) # Get schemas and validate SQL credentials if source_type in [ diff --git a/posthog/warehouse/models/external_data_schema.py b/posthog/warehouse/models/external_data_schema.py index 83f16eaa9aa1f..a3ba7730aaaa3 100644 --- a/posthog/warehouse/models/external_data_schema.py +++ b/posthog/warehouse/models/external_data_schema.py @@ -90,7 +90,9 @@ def aget_schema_if_exists(schema_name: str, team_id: int, source_id: uuid.UUID) @database_sync_to_async def aget_schema_by_id(schema_id: str, team_id: int) -> ExternalDataSchema | None: - return ExternalDataSchema.objects.prefetch_related("source").get(id=schema_id, team_id=team_id) + return ( + ExternalDataSchema.objects.prefetch_related("source").exclude(deleted=True).get(id=schema_id, team_id=team_id) + ) @database_sync_to_async diff --git a/posthog/warehouse/models/external_data_source.py b/posthog/warehouse/models/external_data_source.py index 6f9fe14e01dd9..14dd7c99dd88c 100644 --- a/posthog/warehouse/models/external_data_source.py +++ b/posthog/warehouse/models/external_data_source.py @@ -23,6 +23,7 @@ class Type(models.TextChoices): SALESFORCE = "Salesforce", "Salesforce" MYSQL = "MySQL", "MySQL" MSSQL = "MSSQL", "MSSQL" + VITALLY = "Vitally", "Vitally" class Status(models.TextChoices): RUNNING = "Running", "Running"