diff --git a/components/gorgias/gorgias.app.mjs b/components/gorgias/gorgias.app.mjs index 8a3310f1755ef..76a379d044092 100644 --- a/components/gorgias/gorgias.app.mjs +++ b/components/gorgias/gorgias.app.mjs @@ -153,6 +153,35 @@ export default { cursor = meta.next_cursor; } while (cursor); }, + async createWebhook({ + url, + eventType, + }) { + return this._makeRequest({ + path: "integrations", + method: "post", + data: { + name: `pipedream-${url}`, + type: "http", + http: { + url, + method: "POST", + request_content_type: "application/json", + response_content_type: "application/json", + form: "{{context}}", + triggers: { + [eventType]: true, + }, + }, + }, + }); + }, + async deleteWebhook({ id }) { + return this._makeRequest({ + path: `integrations/${id}`, + method: "delete", + }); + }, async getEvents({ $, params, }) { @@ -218,5 +247,13 @@ export default { params, }); }, + async retrieveTicket({ + $, id, + }) { + return this._makeRequest({ + $, + path: `tickets/${id}`, + }); + }, }, }; diff --git a/components/gorgias/sources/common/base.mjs b/components/gorgias/sources/common/base.mjs index 1f6b70c5f6d53..a35d9ad4bea15 100644 --- a/components/gorgias/sources/common/base.mjs +++ b/components/gorgias/sources/common/base.mjs @@ -5,49 +5,82 @@ export default { props: { gorgias, db: "$.service.db", - timer: { - type: "$.interface.timer", - default: { - intervalSeconds: 15 * 60, - }, + http: "$.interface.http", + }, + hooks: { + async deploy() { + console.log("Retrieving historical events..."); + const events = this.gorgias.paginate({ + fn: this.gorgias.getEvents, + params: { + types: this.getEventType(), + }, + }); + for await (const event of events) { + await this.processHistoricalEvent(event); + } + }, + async activate() { + console.log("Creating webhook..."); + const { id } = await this.gorgias.createWebhook({ + url: this.http.endpoint, + eventType: this.getEventType(), + }); + this.setWebhookId(id); + console.log(`Webhook ${id} created successfully`); + }, + async deactivate() { + const id = this.getWebhookId(); + console.log(`Deleting webhook ${id}...`); + await this.gorgias.deleteWebhook({ + id, + }); + this.setWebhookId(); + console.log(`Webhook ${id} deleted successfully`); }, }, methods: { - getNextCursor() { - return this.db.get("nextCursor"); + getTimestampKey() { + return this.getEventType().includes("updated") + ? "updated_datetime" + : "created_datetime"; }, - setNextCursor(nextCursor) { - if (nextCursor) { - this.db.set("nextCursor", nextCursor); - } + getEventType() { + throw new Error("getEventType is not implemented"); }, - getEventTypes() { - throw new Error("getEventTypes is not implemented"); + processEvent() { + throw new Error("processEvent is not implemented"); }, - async emitEvents(events) { - for (const event of events) { - this.$emit(event, { - id: event.id, - ts: Date.parse(event.created_datetime), - summary: `New ${event.type} event: ${event.id}`, - }); - } + processHistoricalEvent() { + throw new Error("processHistoricalEvent is not implemented"); + }, + getWebhookId() { + return this.db.get("webhookId"); + }, + setWebhookId(webhookId) { + this.db.set("webhookId", webhookId); + }, + async retrieveTicket(id) { + console.log(`Received ${this.getEventType()} for ticket ${id}`); + console.log(`Fetching data for ticket ${id}`); + return this.gorgias.retrieveTicket({ + id, + }); + }, + emitEvent(event) { + console.log(`Emitting event ${event.id}:`); + console.log(event); + const ts = Date.parse(event[this.getTimestampKey()]); + this.$emit(event, { + id: `${event.id}_${ts}`, + ts, + summary: `New ${this.getEventType()}: ${event.id}`, + }); }, }, - async run() { - const params = { - cursor: this.getNextCursor(), - ...this.getEventTypes(), - }; - - const { - data: events, - meta, - } = await this.gorgias.getEvents({ - params, - }); - - this.emitEvents(events); - this.setNextCursor(meta.next_cursor); + async run(event) { + console.log("Raw received event:"); + console.log(event); + return this.processEvent(event.body); }, }; diff --git a/components/gorgias/sources/new-events/new-events.mjs b/components/gorgias/sources/new-events/new-events.mjs deleted file mode 100644 index 5877f4d6904ef..0000000000000 --- a/components/gorgias/sources/new-events/new-events.mjs +++ /dev/null @@ -1,16 +0,0 @@ -import base from "../common/base.mjs"; - -export default { - ...base, - key: "gorgias-new-events", - name: "New Events", - description: "Emit new Gorgias event. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.1.0", - type: "source", - methods: { - ...base.methods, - getEventTypes() { - return {}; - }, - }, -}; diff --git a/components/gorgias/sources/ticket-created/ticket-created.mjs b/components/gorgias/sources/ticket-created/ticket-created.mjs index d617adbf4a65d..d6eee55a18c47 100644 --- a/components/gorgias/sources/ticket-created/ticket-created.mjs +++ b/components/gorgias/sources/ticket-created/ticket-created.mjs @@ -6,14 +6,19 @@ export default { key: "gorgias-ticket-created", name: "New Ticket", description: "Emit new event when a ticket is created. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", + version: "0.1.0", type: "source", methods: { ...base.methods, - getEventTypes() { - return { - types: eventTypes.TICKET_CREATED, - }; + getEventType() { + return eventTypes.TICKET_CREATED; + }, + async processHistoricalEvent(event) { + const ticket = await this.retrieveTicket(event.object_id); + this.emitEvent(ticket); + }, + async processEvent(event) { + this.emitEvent(event.ticket); }, }, }; diff --git a/components/gorgias/sources/ticket-message-created/ticket-message-created.mjs b/components/gorgias/sources/ticket-message-created/ticket-message-created.mjs index ffde1035225fc..61107035b3b23 100644 --- a/components/gorgias/sources/ticket-message-created/ticket-message-created.mjs +++ b/components/gorgias/sources/ticket-message-created/ticket-message-created.mjs @@ -6,14 +6,19 @@ export default { key: "gorgias-ticket-messaged-created", name: "New Ticket Message", description: "Emit new event when a ticket message is created. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", + version: "0.1.0", type: "source", methods: { ...base.methods, - getEventTypes() { - return { - types: eventTypes.TICKET_MESSAGE_CREATED, - }; + getEventType() { + return eventTypes.TICKET_MESSAGE_CREATED; + }, + async processHistoricalEvent(event) { + // event doesn't contain ticket id to fetch message + this.emitEvent(event); + }, + async processEvent(event) { + this.emitEvent(event.message); }, }, }; diff --git a/components/gorgias/sources/ticket-updated/ticket-updated.mjs b/components/gorgias/sources/ticket-updated/ticket-updated.mjs index d2b7e1a090661..cb3b48044e9a9 100644 --- a/components/gorgias/sources/ticket-updated/ticket-updated.mjs +++ b/components/gorgias/sources/ticket-updated/ticket-updated.mjs @@ -6,14 +6,19 @@ export default { key: "gorgias-ticket-updated", name: "New Updated Ticket", description: "Emit new event when a ticket is updated. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", + version: "0.1.0", type: "source", methods: { ...base.methods, - getEventTypes() { - return { - types: eventTypes.TICKET_UPDATED, - }; + getEventType() { + return eventTypes.TICKET_UPDATED; + }, + async processHistoricalEvent(event) { + const ticket = await this.retrieveTicket(event.object_id); + this.emitEvent(ticket); + }, + async processEvent(event) { + this.emitEvent(event.ticket); }, }, }; diff --git a/components/gorgias_oauth/actions/create-customer/create-customer.mjs b/components/gorgias_oauth/actions/create-customer/create-customer.mjs index f17934d54c8a2..0c187514ddc39 100644 --- a/components/gorgias_oauth/actions/create-customer/create-customer.mjs +++ b/components/gorgias_oauth/actions/create-customer/create-customer.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-create-customer", name: "Create Customer", description: "Create a new customer. [See the docs](https://developers.gorgias.com/reference/post_api-customers)", - version: "0.0.1", type: "action", }; diff --git a/components/gorgias_oauth/actions/create-ticket/create-ticket.mjs b/components/gorgias_oauth/actions/create-ticket/create-ticket.mjs index e4562eaa0a5f7..18b3f692521b2 100644 --- a/components/gorgias_oauth/actions/create-ticket/create-ticket.mjs +++ b/components/gorgias_oauth/actions/create-ticket/create-ticket.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-create-ticket", name: "Create Ticket", description: "Create a new ticket. [See the docs](https://developers.gorgias.com/reference/post_api-tickets)", - version: "0.0.1", type: "action", }; diff --git a/components/gorgias_oauth/actions/list-tickets/list-tickets.mjs b/components/gorgias_oauth/actions/list-tickets/list-tickets.mjs index 07f411e2a9d0f..e5785acdc36c5 100644 --- a/components/gorgias_oauth/actions/list-tickets/list-tickets.mjs +++ b/components/gorgias_oauth/actions/list-tickets/list-tickets.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-list-tickets", name: "List Tickets", description: "List all tickets. [See the docs](https://developers.gorgias.com/reference/get_api-tickets)", - version: "0.0.1", type: "action", }; diff --git a/components/gorgias_oauth/actions/retrieve-customer/retrieve-customer.mjs b/components/gorgias_oauth/actions/retrieve-customer/retrieve-customer.mjs index d4af0c745fef7..b5a2ccf7ceb78 100644 --- a/components/gorgias_oauth/actions/retrieve-customer/retrieve-customer.mjs +++ b/components/gorgias_oauth/actions/retrieve-customer/retrieve-customer.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-retrieve-customer", name: "Retrieve a Customer", description: "Retrieve a customer. [See the docs](https://developers.gorgias.com/reference/get_api-customers-id-)", - version: "0.0.1", type: "action", }; diff --git a/components/gorgias_oauth/actions/update-customer/update-customer.mjs b/components/gorgias_oauth/actions/update-customer/update-customer.mjs index 2b3c01dbcdabc..32402a445705b 100644 --- a/components/gorgias_oauth/actions/update-customer/update-customer.mjs +++ b/components/gorgias_oauth/actions/update-customer/update-customer.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-update-customer", name: "Update Customer", description: "Update a customer. [See the docs](https://developers.gorgias.com/reference/put_api-customers-id-)", - version: "0.0.1", type: "action", }; diff --git a/components/gorgias_oauth/sources/new-events/new-events.mjs b/components/gorgias_oauth/sources/new-events/new-events.mjs deleted file mode 100644 index f5a5d8cd550f5..0000000000000 --- a/components/gorgias_oauth/sources/new-events/new-events.mjs +++ /dev/null @@ -1,13 +0,0 @@ -import base from "../../../gorgias/sources/new-events/new-events.mjs"; -import overrideApp from "../../common/override-app.mjs"; - -overrideApp(base); - -export default { - ...base, - key: "gorgias_oauth-new-events", - name: "New Events", - description: "Emit new Gorgias event. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", - type: "source", -}; diff --git a/components/gorgias_oauth/sources/ticket-created/ticket-created.mjs b/components/gorgias_oauth/sources/ticket-created/ticket-created.mjs index de43ef8ba8dad..3f4b31a72cfe9 100644 --- a/components/gorgias_oauth/sources/ticket-created/ticket-created.mjs +++ b/components/gorgias_oauth/sources/ticket-created/ticket-created.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-ticket-created", name: "New Ticket", description: "Emit new event when a ticket is created. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", type: "source", }; diff --git a/components/gorgias_oauth/sources/ticket-message-created/ticket-message-created.mjs b/components/gorgias_oauth/sources/ticket-message-created/ticket-message-created.mjs index b13b60d5ea82d..c063585092c35 100644 --- a/components/gorgias_oauth/sources/ticket-message-created/ticket-message-created.mjs +++ b/components/gorgias_oauth/sources/ticket-message-created/ticket-message-created.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-ticket-messaged-created", name: "New Ticket Message", description: "Emit new event when a ticket message is created. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", type: "source", }; diff --git a/components/gorgias_oauth/sources/ticket-updated/ticket-updated.mjs b/components/gorgias_oauth/sources/ticket-updated/ticket-updated.mjs index b560fdfd8f62f..a5ff73a5b8417 100644 --- a/components/gorgias_oauth/sources/ticket-updated/ticket-updated.mjs +++ b/components/gorgias_oauth/sources/ticket-updated/ticket-updated.mjs @@ -3,11 +3,12 @@ import overrideApp from "../../common/override-app.mjs"; overrideApp(base); +// same version as base +// eslint-disable-next-line pipedream/required-properties-version export default { ...base, key: "gorgias_oauth-ticket-updated", name: "New Updated Ticket", description: "Emit new event when a ticket is updated. [See the docs](https://developers.gorgias.com/reference/the-event-object)", - version: "0.0.1", type: "source", };