diff --git a/components/zendesk/actions/create-ticket/create-ticket.mjs b/components/zendesk/actions/create-ticket/create-ticket.mjs index e6564375ef518..5075d106e59ad 100644 --- a/components/zendesk/actions/create-ticket/create-ticket.mjs +++ b/components/zendesk/actions/create-ticket/create-ticket.mjs @@ -5,7 +5,7 @@ export default { name: "Create Ticket", description: "Creates a ticket. [See the documentation](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#create-ticket).", type: "action", - version: "0.1.2", + version: "0.1.3", props: { app, ticketCommentBody: { diff --git a/components/zendesk/actions/delete-ticket/delete-ticket.mjs b/components/zendesk/actions/delete-ticket/delete-ticket.mjs index 6f5a7f20040bf..3df93352a7156 100644 --- a/components/zendesk/actions/delete-ticket/delete-ticket.mjs +++ b/components/zendesk/actions/delete-ticket/delete-ticket.mjs @@ -5,7 +5,7 @@ export default { name: "Delete Ticket", description: "Deletes a ticket. [See the documentation](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#delete-ticket).", type: "action", - version: "0.1.2", + version: "0.1.3", props: { app, ticketId: { diff --git a/components/zendesk/actions/get-ticket-info/get-ticket-info.mjs b/components/zendesk/actions/get-ticket-info/get-ticket-info.mjs new file mode 100644 index 0000000000000..58ec278df0b47 --- /dev/null +++ b/components/zendesk/actions/get-ticket-info/get-ticket-info.mjs @@ -0,0 +1,40 @@ +import app from "../../zendesk.app.mjs"; + +export default { + key: "zendesk-get-ticket-info", + name: "Get Ticket Info", + description: "Retrieves information about a specific ticket. [See the documentation](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#show-ticket).", + type: "action", + version: "0.0.1", + props: { + app, + ticketId: { + propDefinition: [ + app, + "ticketId", + ], + }, + customSubdomain: { + propDefinition: [ + app, + "customSubdomain", + ], + }, + }, + async run({ $: step }) { + const { + ticketId, + customSubdomain, + } = this; + + const response = await this.app.getTicketInfo({ + step, + ticketId, + customSubdomain, + }); + + step.export("$summary", `Successfully retrieved ticket with ID ${response.ticket.id}`); + + return response; + }, +}; diff --git a/components/zendesk/actions/list-tickets/list-tickets.mjs b/components/zendesk/actions/list-tickets/list-tickets.mjs new file mode 100644 index 0000000000000..3960b97d7f6a1 --- /dev/null +++ b/components/zendesk/actions/list-tickets/list-tickets.mjs @@ -0,0 +1,67 @@ +import app from "../../zendesk.app.mjs"; + +export default { + key: "zendesk-list-tickets", + name: "List Tickets", + description: "Retrieves a list of tickets. [See the documentation](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#list-tickets).", + type: "action", + version: "0.0.1", + props: { + app, + sortBy: { + propDefinition: [ + app, + "sortBy", + ], + }, + sortOrder: { + propDefinition: [ + app, + "sortOrder", + ], + }, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + customSubdomain: { + propDefinition: [ + app, + "customSubdomain", + ], + }, + }, + async run({ $: step }) { + const { + sortBy, + sortOrder, + limit, + customSubdomain, + } = this; + + const results = this.app.paginate({ + fn: this.app.listTickets, + args: { + step, + customSubdomain, + params: { + sort_by: sortBy, + sort_order: sortOrder, + }, + }, + resourceKey: "tickets", + max: limit, + }); + + const tickets = []; + for await (const ticket of results) { + tickets.push(ticket); + } + + step.export("$summary", `Successfully retrieved ${tickets.length} tickets`); + + return tickets; + }, +}; diff --git a/components/zendesk/actions/search-tickets/search-tickets.mjs b/components/zendesk/actions/search-tickets/search-tickets.mjs new file mode 100644 index 0000000000000..95a073a64ae47 --- /dev/null +++ b/components/zendesk/actions/search-tickets/search-tickets.mjs @@ -0,0 +1,74 @@ +import app from "../../zendesk.app.mjs"; + +export default { + key: "zendesk-search-tickets", + name: "Search Tickets", + description: "Searches for tickets using Zendesk's search API. [See the documentation](https://developer.zendesk.com/api-reference/ticketing/ticket-management/search/#search-tickets).", + type: "action", + version: "0.0.1", + props: { + app, + query: { + type: "string", + label: "Search Query", + description: "The search query to find tickets. You can use Zendesk's search syntax. Example: `type:ticket status:open priority:high`. [See the documentation](https://developer.zendesk.com/documentation/ticketing/using-the-zendesk-api/searching-with-the-zendesk-api/)", + }, + sortBy: { + propDefinition: [ + app, + "sortBy", + ], + }, + sortOrder: { + propDefinition: [ + app, + "sortOrder", + ], + }, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + customSubdomain: { + propDefinition: [ + app, + "customSubdomain", + ], + }, + }, + async run({ $: step }) { + const { + query, + sortBy, + sortOrder, + limit, + customSubdomain, + } = this; + + const results = this.app.paginate({ + fn: this.app.searchTickets, + args: { + step, + customSubdomain, + params: { + query, + sort_by: sortBy, + sort_order: sortOrder, + }, + }, + resourceKey: "results", + max: limit, + }); + + const tickets = []; + for await (const ticket of results) { + tickets.push(ticket); + } + + step.export("$summary", `Successfully found ${tickets.length} tickets matching the search query`); + + return tickets; + }, +}; diff --git a/components/zendesk/actions/update-ticket/update-ticket.mjs b/components/zendesk/actions/update-ticket/update-ticket.mjs index 3f43ca5418a4f..f3e44b6566f68 100644 --- a/components/zendesk/actions/update-ticket/update-ticket.mjs +++ b/components/zendesk/actions/update-ticket/update-ticket.mjs @@ -5,7 +5,7 @@ export default { name: "Update Ticket", description: "Updates a ticket. [See the documentation](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#update-ticket).", type: "action", - version: "0.1.2", + version: "0.1.3", props: { app, ticketId: { diff --git a/components/zendesk/common/constants.mjs b/components/zendesk/common/constants.mjs index dfa7abf34a84c..67e1801a4f89b 100644 --- a/components/zendesk/common/constants.mjs +++ b/components/zendesk/common/constants.mjs @@ -222,6 +222,19 @@ const TICKET_FIELD_OPTIONS = [ }, ]; +const SORT_BY_OPTIONS = [ + "assignee", + "assignee.name", + "created_at", + "group", + "id", + "requester", + "requester.name", + "status", + "subject", + "updated_at", +]; + export default { SUBDOMAIN_PLACEHOLDER, BASE_URL, @@ -242,4 +255,5 @@ export default { TICKET_PRIORITY_OPTIONS, TICKET_STATUS_OPTIONS, TICKET_FIELD_OPTIONS, + SORT_BY_OPTIONS, }; diff --git a/components/zendesk/package.json b/components/zendesk/package.json index 8c992b9638a46..55ece4d9e89e2 100644 --- a/components/zendesk/package.json +++ b/components/zendesk/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/zendesk", - "version": "0.6.1", + "version": "0.7.0", "description": "Pipedream Zendesk Components", "main": "zendesk.app.mjs", "keywords": [ @@ -14,7 +14,7 @@ "access": "public" }, "dependencies": { - "@pipedream/platform": "^0.9.0", + "@pipedream/platform": "^3.0.3", "crypto": "^1.0.1" } } diff --git a/components/zendesk/sources/new-ticket/new-ticket.mjs b/components/zendesk/sources/new-ticket/new-ticket.mjs index 273b8e29d6fcb..69f2fef27b52c 100644 --- a/components/zendesk/sources/new-ticket/new-ticket.mjs +++ b/components/zendesk/sources/new-ticket/new-ticket.mjs @@ -6,7 +6,7 @@ export default { key: "zendesk-new-ticket", type: "source", description: "Emit new event when a ticket is created", - version: "0.2.2", + version: "0.2.3", dedupe: "unique", methods: { ...common.methods, diff --git a/components/zendesk/sources/ticket-added-to-view/ticket-added-to-view.mjs b/components/zendesk/sources/ticket-added-to-view/ticket-added-to-view.mjs index f1c6f01d4fb90..3e98f2c161bae 100644 --- a/components/zendesk/sources/ticket-added-to-view/ticket-added-to-view.mjs +++ b/components/zendesk/sources/ticket-added-to-view/ticket-added-to-view.mjs @@ -5,7 +5,7 @@ export default { key: "zendesk-ticket-added-to-view", name: "New Ticket Added to View (Instant)", description: "Emit new event when a ticket is added to the specified view", - version: "0.0.2", + version: "0.0.3", type: "source", dedupe: "unique", props: { diff --git a/components/zendesk/sources/ticket-closed/ticket-closed.mjs b/components/zendesk/sources/ticket-closed/ticket-closed.mjs index 8656bbe46576e..bca4550f688db 100644 --- a/components/zendesk/sources/ticket-closed/ticket-closed.mjs +++ b/components/zendesk/sources/ticket-closed/ticket-closed.mjs @@ -6,7 +6,7 @@ export default { key: "zendesk-ticket-closed", type: "source", description: "Emit new event when a ticket has changed to closed status", - version: "0.2.2", + version: "0.2.3", dedupe: "unique", methods: { ...common.methods, diff --git a/components/zendesk/sources/ticket-pended/ticket-pended.mjs b/components/zendesk/sources/ticket-pended/ticket-pended.mjs index 1d47d93e3e7b8..bdd7d09d70e59 100644 --- a/components/zendesk/sources/ticket-pended/ticket-pended.mjs +++ b/components/zendesk/sources/ticket-pended/ticket-pended.mjs @@ -6,7 +6,7 @@ export default { key: "zendesk-ticket-pended", type: "source", description: "Emit new event when a ticket has changed to pending status", - version: "0.2.2", + version: "0.2.3", dedupe: "unique", methods: { ...common.methods, diff --git a/components/zendesk/sources/ticket-solved/ticket-solved.mjs b/components/zendesk/sources/ticket-solved/ticket-solved.mjs index e54286a7c77ee..4e893068b3f68 100644 --- a/components/zendesk/sources/ticket-solved/ticket-solved.mjs +++ b/components/zendesk/sources/ticket-solved/ticket-solved.mjs @@ -6,7 +6,7 @@ export default { key: "zendesk-ticket-solved", type: "source", description: "Emit new event when a ticket has changed to solved status", - version: "0.2.2", + version: "0.2.3", dedupe: "unique", methods: { ...common.methods, diff --git a/components/zendesk/sources/ticket-updated/ticket-updated.mjs b/components/zendesk/sources/ticket-updated/ticket-updated.mjs index 3382ead185b30..e8b41a7ef58cb 100644 --- a/components/zendesk/sources/ticket-updated/ticket-updated.mjs +++ b/components/zendesk/sources/ticket-updated/ticket-updated.mjs @@ -6,7 +6,7 @@ export default { key: "zendesk-ticket-updated", type: "source", description: "Emit new event when a ticket has been updated", - version: "0.2.2", + version: "0.2.3", dedupe: "unique", methods: { ...common.methods, diff --git a/components/zendesk/zendesk.app.mjs b/components/zendesk/zendesk.app.mjs index ae9aadb17e07b..f2b60ed78f3ba 100644 --- a/components/zendesk/zendesk.app.mjs +++ b/components/zendesk/zendesk.app.mjs @@ -144,6 +144,30 @@ export default { optional: true, options: Object.values(constants.TICKET_STATUS_OPTIONS), }, + sortBy: { + type: "string", + label: "Sort By", + description: "Field to sort tickets by", + optional: true, + options: constants.SORT_BY_OPTIONS, + }, + sortOrder: { + type: "string", + label: "Sort Order", + description: "Sort order (ascending or descending)", + optional: true, + options: [ + "asc", + "desc", + ], + }, + limit: { + type: "integer", + label: "Limit", + description: "Maximum number of tickets to return", + optional: true, + default: 100, + }, customSubdomain: { type: "string", label: "Custom Subdomain", @@ -181,6 +205,20 @@ export default { }; return axios(step, config); }, + getTicketInfo({ + ticketId, ...args + } = {}) { + return this.makeRequest({ + path: `/tickets/${ticketId}`, + ...args, + }); + }, + searchTickets(args = {}) { + return this.makeRequest({ + path: "/search", + ...args, + }); + }, create(args = {}) { return this.makeRequest({ method: "post", @@ -231,5 +269,36 @@ export default { ...args, }); }, + async *paginate({ + fn, args, resourceKey, max, + }) { + args = { + ...args, + params: { + ...args?.params, + per_page: constants.DEFAULT_LIMIT, + page: 1, + }, + }; + let hasMore = true; + let count = 0; + while (hasMore) { + const response = await fn(args); + const items = resourceKey + ? response[resourceKey] + : response; + if (!items?.length) { + return; + } + for (const item of items) { + yield item; + if (max && ++count >= max) { + return; + } + } + hasMore = !!response.next_page; + args.params.page += 1; + } + }, }, }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e34e33e8f9b6..0138a4933f07e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12886,8 +12886,7 @@ importers: components/systeme_io: {} - components/szybkisms: - specifiers: {} + components/szybkisms: {} components/t2m_url_shortener: {} @@ -14828,8 +14827,8 @@ importers: components/zendesk: dependencies: '@pipedream/platform': - specifier: ^0.9.0 - version: 0.9.0 + specifier: ^3.0.3 + version: 3.0.3 crypto: specifier: ^1.0.1 version: 1.0.1