Skip to content

Commit 918aa31

Browse files
authored
✨ Source Zendesk Support: Migrate to low code (#36823)
1 parent 3b5c44a commit 918aa31

File tree

20 files changed

+1407
-486
lines changed

20 files changed

+1407
-486
lines changed

airbyte-integrations/connectors/source-zendesk-support/integration_tests/configured_catalog.json

+12
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,18 @@
128128
"sync_mode": "full_refresh",
129129
"destination_sync_mode": "append"
130130
},
131+
{
132+
"stream": {
133+
"name": "ticket_activities",
134+
"json_schema": {},
135+
"supported_sync_modes": ["full_refresh", "incremental"],
136+
"source_defined_cursor": true,
137+
"default_cursor_field": ["created_at"],
138+
"source_defined_primary_key": [["id"]]
139+
},
140+
"sync_mode": "full_refresh",
141+
"destination_sync_mode": "append"
142+
},
131143
{
132144
"stream": {
133145
"name": "ticket_comments",

airbyte-integrations/connectors/source-zendesk-support/integration_tests/expected_records.jsonl

+78-71
Large diffs are not rendered by default.

airbyte-integrations/connectors/source-zendesk-support/metadata.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ data:
1111
connectorSubtype: api
1212
connectorType: source
1313
definitionId: 79c1aa37-dae3-42ae-b333-d1c105477715
14-
dockerImageTag: 2.5.0
14+
dockerImageTag: 2.6.0
1515
dockerRepository: airbyte/source-zendesk-support
1616
documentationUrl: https://docs.airbyte.com/integrations/sources/zendesk-support
1717
githubIssueLabel: source-zendesk-support
@@ -57,5 +57,5 @@ data:
5757
supportLevel: certified
5858
tags:
5959
- language:python
60-
- cdk:python
60+
- cdk:low-code
6161
metadataSpecVersion: "1.0"

airbyte-integrations/connectors/source-zendesk-support/poetry.lock

+30-30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

airbyte-integrations/connectors/source-zendesk-support/pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",]
33
build-backend = "poetry.core.masonry.api"
44

55
[tool.poetry]
6-
version = "2.5.0"
6+
version = "2.6.0"
77
name = "source-zendesk-support"
88
description = "Source implementation for Zendesk Support."
99
authors = [ "Airbyte <[email protected]>",]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
2+
3+
from dataclasses import dataclass
4+
from typing import Any, List, Mapping, MutableMapping, Optional
5+
6+
import requests
7+
from airbyte_cdk.sources.declarative.extractors.record_extractor import RecordExtractor
8+
from airbyte_cdk.sources.declarative.incremental import DatetimeBasedCursor
9+
from airbyte_cdk.sources.declarative.migrations.state_migration import StateMigration
10+
from airbyte_cdk.sources.declarative.requesters.request_option import RequestOptionType
11+
from airbyte_cdk.sources.declarative.types import StreamSlice, StreamState
12+
13+
14+
@dataclass
15+
class ZendeskSupportAuditLogsIncrementalSync(DatetimeBasedCursor):
16+
"""
17+
This class is created for the Audit Logs stream. List with time range is used for record filtering.
18+
"""
19+
20+
def get_request_params(
21+
self,
22+
*,
23+
stream_state: Optional[StreamState] = None,
24+
stream_slice: Optional[StreamSlice] = None,
25+
next_page_token: Optional[Mapping[str, Any]] = None,
26+
) -> Mapping[str, Any]:
27+
option_type = RequestOptionType.request_parameter
28+
options: MutableMapping[str, Any] = {}
29+
if not stream_slice:
30+
return options
31+
32+
# set list with time range
33+
if self.start_time_option and self.start_time_option.inject_into == option_type:
34+
start_time = stream_slice.get(self._partition_field_start.eval(self.config))
35+
options[self.start_time_option.field_name.eval(config=self.config)] = [start_time] # type: ignore # field_name is always casted to an interpolated string
36+
if self.end_time_option and self.end_time_option.inject_into == option_type:
37+
options[self.end_time_option.field_name.eval(config=self.config)].append(stream_slice.get(self._partition_field_end.eval(self.config))) # type: ignore # field_name is always casted to an interpolated string
38+
return options
39+
40+
41+
class ZendeskSupportExtractorEvents(RecordExtractor):
42+
def extract_records(self, response: requests.Response) -> List[Mapping[str, Any]]:
43+
try:
44+
records = response.json().get("ticket_events") or []
45+
except requests.exceptions.JSONDecodeError:
46+
records = []
47+
48+
events = []
49+
for record in records:
50+
for event in record.get("child_events", []):
51+
if event.get("event_type") == "Comment":
52+
for prop in ["via_reference_id", "ticket_id", "timestamp"]:
53+
event[prop] = record.get(prop)
54+
55+
# https://github.com/airbytehq/oncall/issues/1001
56+
if not isinstance(event.get("via"), dict):
57+
event["via"] = None
58+
events.append(event)
59+
return events
60+
61+
62+
class ZendeskSupportAttributeDefinitionsExtractor(RecordExtractor):
63+
def extract_records(self, response: requests.Response) -> List[Mapping[str, Any]]:
64+
try:
65+
records = []
66+
for definition in response.json()["definitions"]["conditions_all"]:
67+
definition["condition"] = "all"
68+
records.append(definition)
69+
for definition in response.json()["definitions"]["conditions_any"]:
70+
definition["condition"] = "any"
71+
records.append(definition)
72+
except requests.exceptions.JSONDecodeError:
73+
records = []
74+
return records

0 commit comments

Comments
 (0)