diff --git a/components/webflow/actions/get-order/get-order.mjs b/components/webflow/actions/get-order/get-order.mjs deleted file mode 100644 index 25785b53fbfb1..0000000000000 --- a/components/webflow/actions/get-order/get-order.mjs +++ /dev/null @@ -1,34 +0,0 @@ -import webflow from "../../webflow.app.mjs"; - -export default { - key: "webflow-get-order", - name: "Get Order", - description: "Get an order. [See the docs here](https://developers.webflow.com/#get-order)", - version: "0.0.4", - type: "action", - props: { - webflow, - siteId: { - propDefinition: [ - webflow, - "sites", - ], - }, - orderId: { - propDefinition: [ - webflow, - "orders", - ], - }, - }, - async run({ $ }) { - const response = await this.webflow.getOrder({ - siteId: this.siteId, - orderId: this.orderId, - }); - - $.export("$summary", "Successfully retrieved order"); - - return response; - }, -}; diff --git a/components/webflow/actions/publish-site/publish-site.mjs b/components/webflow/actions/publish-site/publish-site.mjs deleted file mode 100644 index 152c3f3162bd1..0000000000000 --- a/components/webflow/actions/publish-site/publish-site.mjs +++ /dev/null @@ -1,39 +0,0 @@ -import webflow from "../../webflow.app.mjs"; - -export default { - key: "webflow-publish-site", - name: "Publish Site", - description: "Get a site in a specific domain. [See the docs here](https://developers.webflow.com/#publish-site)", - version: "0.0.4", - type: "action", - props: { - webflow, - siteId: { - propDefinition: [ - webflow, - "sites", - ], - }, - domains: { - propDefinition: [ - webflow, - "domains", - (c) => ({ - siteId: c.siteId, - }), - ], - }, - }, - async run({ $ }) { - const webflow = this.webflow._createApiClient(); - - const response = await webflow.publishSite({ - siteId: this.siteId, - domains: this.domains, - }); - - $.export("$summary", "Successfully published site"); - - return response; - }, -}; diff --git a/components/webflow/actions/update-collection-item/update-collection-item.mjs b/components/webflow/actions/update-collection-item/update-collection-item.mjs deleted file mode 100644 index 5ad131a1f4313..0000000000000 --- a/components/webflow/actions/update-collection-item/update-collection-item.mjs +++ /dev/null @@ -1,93 +0,0 @@ -import webflow from "../../webflow.app.mjs"; - -export default { - key: "webflow-update-collection-item", - name: "Update Collection Item", - description: "Update collection item. [See the documentation](https://developers.webflow.com/#update-collection-item)", - version: "0.1.7", - type: "action", - props: { - webflow, - siteId: { - propDefinition: [ - webflow, - "sites", - ], - }, - collectionId: { - propDefinition: [ - webflow, - "collections", - (c) => ({ - siteId: c.siteId, - }), - ], - reloadProps: true, - }, - itemId: { - propDefinition: [ - webflow, - "items", - (c) => ({ - collectionId: c.collectionId, - }), - ], - }, - }, - async additionalProps() { - const props = {}; - if (!this.collectionId) { - return props; - } - const { fields } = await this.webflow.getCollection(this.collectionId); - for (const field of fields) { - if (field.editable && field.slug !== "_archived" && field.slug !== "_draft") { - props[field.slug] = { - type: "string", - label: field.name, - description: field.slug === "name" - ? "Name given to the Item." - : field.slug === "slug" - ? "URL structure of the Item in your site. Note: Updates to an item slug will break all links referencing the old slug." - : "See the documentation for additional information about [Field Types & Item Values](https://developers.webflow.com/reference/field-types-item-values).", - optional: true, - }; - } - } - - return props; - }, - async run({ $ }) { - const { - webflow, - // eslint-disable-next-line no-unused-vars - siteId, - collectionId, - itemId, - name, - slug, - ...customFields - } = this; - - const webflowClient = webflow._createApiClient(); - - const item = await webflowClient.item({ - collectionId, - itemId, - }); - - const response = await webflowClient.updateItem({ - collectionId, - itemId, - name: name || item.name, - slug: slug || item.slug, - _archived: false, - _draft: false, - ...customFields, - }); - - $.export("$summary", "Successfully updated collection item"); - - return response; - }, -}; diff --git a/components/webflow/sources/common/collection-common.mjs b/components/webflow/sources/common/collection-common.mjs deleted file mode 100644 index 3149a11e30e93..0000000000000 --- a/components/webflow/sources/common/collection-common.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import common from "./common.mjs"; -import webflow from "../../webflow.app.mjs"; - -export default { - ...common, - props: { - ...common.props, - collectionIds: { - label: "Collections", - description: "The collections to monitor for item changes", - type: "string[]", - optional: true, - propDefinition: [ - webflow, - "collections", - (c) => ({ - siteId: c.siteId, - }), - ], - }, - }, - methods: { - ...common.methods, - isEventRelevant(event) { - if (!this.collectionIds?.length) return true; - const { body: { _cid: collectionId } } = event; - return this.collectionIds.includes(collectionId); - }, - }, -}; diff --git a/components/webflow/sources/common/common.mjs b/components/webflow/sources/common/common.mjs deleted file mode 100644 index 8bbc816812e0f..0000000000000 --- a/components/webflow/sources/common/common.mjs +++ /dev/null @@ -1,87 +0,0 @@ -import webflow from "../../webflow.app.mjs"; -import { v4 as uuid } from "uuid"; -import { axios } from "@pipedream/platform"; -import constants from "../../common/constants.mjs"; - -export default { - dedupe: "unique", - props: { - webflow, - siteId: { - propDefinition: [ - webflow, - "sites", - ], - }, - db: "$.service.db", - http: "$.interface.http", - }, - methods: { - async _makeRequest(path, params = {}) { - return axios(this, { - url: "https://api.webflow.com" + path, - headers: { - "Authorization": `Bearer ${this.webflow.$auth.oauth_access_token}`, - "Accept-Version": "1.0.0", - }, - params, - }); - }, - _getWebhookId() { - return this.db.get("webhookId"); - }, - _setWebhookId(webhookId) { - this.db.set("webhookId", webhookId); - }, - getWebhookTriggerType() { - throw new Error("getWebhookTriggerType is not implemented"); - }, - getWebhookFilter() { - return {}; - }, - isEventRelevant(event) { - if (event) return true; - }, - generateMeta(data) { - return { - id: data.id || uuid(), - summary: "New event", - ts: Date.now(), - }; - }, - processEvent(event) { - if (!this.isEventRelevant(event)) { - return; - } - - const { body } = event; - const meta = this.generateMeta(body); - this.$emit(body, meta); - }, - emitHistoricalEvents(events, limit = constants.DEPLOY_OFFSET) { - for (const event of events.slice(0, limit)) { - const meta = this.generateMeta(event); - this.$emit(event, meta); - } - }, - }, - hooks: { - async activate() { - const { endpoint } = this.http; - const triggerType = this.getWebhookTriggerType(); - const filter = this.getWebhookFilter(); - const webhook = await this.webflow.createWebhook( - this.siteId, endpoint, triggerType, filter, - ); - - this._setWebhookId(webhook._id); - }, - async deactivate() { - const webhookId = this._getWebhookId(); - await this.webflow.removeWebhook(this.siteId, webhookId); - }, - }, - async run(event) { - await this.processEvent(event); - }, -}; diff --git a/components/webflow/sources/new-collection-item/new-collection-item.mjs b/components/webflow/sources/new-collection-item/new-collection-item.mjs deleted file mode 100644 index 5364ff0f38e22..0000000000000 --- a/components/webflow/sources/new-collection-item/new-collection-item.mjs +++ /dev/null @@ -1,57 +0,0 @@ -import constants from "../../common/constants.mjs"; -import common from "../common/collection-common.mjs"; - -export default { - type: "source", - key: "webflow-new-collection-item", - name: "New Collection Item", - description: "Emit new event when a collection item is created. [See the docs here](https://developers.webflow.com/#item-model)", - version: "0.2.3", - ...common, - hooks: { - ...common.hooks, - async deploy() { - if (this.collectionIds?.length !== 1) { - console.log("Skipping retrieval of historical events for multiple or no Collection ID"); - return; - } - - const path = `/collections/${this.collectionIds[0]}/items`; - console.log("Retrieving historical events..."); - - let { - total, - items: events, - } = await this._makeRequest(path); - - if (total > constants.LIMIT) { - const offset = Math.floor(total / constants.LIMIT); - - events = (await this._makeRequest(path, { - offset, - })).items.reverse(); - - events.push(...(await this._makeRequest(path, { - offset: offset - 1, - })).items.reverse()); - } else { - events.reverse(); - } - - this.emitHistoricalEvents(events); - }, - }, - methods: { - ...common.methods, - getWebhookTriggerType() { - return "collection_item_created"; - }, - generateMeta(data) { - return { - id: data._id, - summary: `New collection item ${data.slug} created`, - ts: Date.parse(data["created-on"]), - }; - }, - }, -}; diff --git a/components/webflow/sources/new-ecommerce-order/new-ecommerce-order.mjs b/components/webflow/sources/new-ecommerce-order/new-ecommerce-order.mjs deleted file mode 100644 index d7c3e709439c0..0000000000000 --- a/components/webflow/sources/new-ecommerce-order/new-ecommerce-order.mjs +++ /dev/null @@ -1,79 +0,0 @@ -import common from "../common/common.mjs"; - -export default { - type: "source", - key: "webflow-new-ecommerce-order", - name: "New E-commerce Order", - description: "Emit new event when an e-commerce order is created. [See the docs here](https://developers.webflow.com/#order-model)", - version: "0.2.3", - ...common, - props: { - ...common.props, - historicalEventsNumber: { - type: "integer", - label: "Number of Historical Events to Emit", - description: "Defaults to `0`. Number of historical events to fetch and emit. Maximum is `100`.", - optional: true, - default: 0, - min: 0, - max: 100, - }, - emitMostRecent: { - type: "boolean", - label: "Emit Most Recent Events", - description: "Defaults to `false`. **Warning**: if `true`, will need to request all orders to extract the most recent ones.", - default: false, - }, - }, - hooks: { - ...common.hooks, - async deploy() { - if (!this.historicalEventsNumber) { - return; - } - - const path = `/sites/${this.siteId}/orders`; - console.log("Retrieving historical events..."); - - if (!this.emitMostRecent) { - const events = await this._makeRequest(path, { - limit: this.historicalEventsNumber, - }); - this.emitHistoricalEvents(events); - return; - } - - let toEmit = []; - let events = []; - const params = { - offset: 0, - }; - - do { - events = await this._makeRequest(path, params); - - if (toEmit.push(...events) > 100) { - toEmit = toEmit.slice(toEmit.length - 100, toEmit.length); - } - - params.offset += 1; - } while (events.length > 0); - - toEmit.reverse(); - this.emitHistoricalEvents(toEmit, this.historicalEventsNumber); - }, - }, - methods: { - ...common.methods, - getWebhookTriggerType() { - return "ecomm_new_order"; - }, - generateMeta(data) { - return { - id: data.orderId, - summary: `New ${data.orderId} e-commerce order`, - ts: Date.parse(data.acceptedOn), - }; - }, - }, -}; diff --git a/components/webflow/sources/new-site-published/new-site-published.mjs b/components/webflow/sources/new-site-published/new-site-published.mjs deleted file mode 100644 index 571cec7662565..0000000000000 --- a/components/webflow/sources/new-site-published/new-site-published.mjs +++ /dev/null @@ -1,45 +0,0 @@ -import constants from "../../common/constants.mjs"; -import common from "../common/common.mjs"; - -export default { - type: "source", - key: "webflow-new-site-published", - name: "New Site Published", - description: "Emit new event when a site is published. [See the docs here](https://developers.webflow.com/#trigger-types)", - version: "0.2.3", - ...common, - hooks: { - ...common.hooks, - async deploy() { - console.log("Retrieving historical events..."); - - const sites = await this._makeRequest("/sites", { - limit: this.historicalEventsNumber, - }); - - const filtered = sites.filter((site) => site.lastPublished); - const sliced = filtered.slice( - filtered.length - constants.DEPLOY_OFFSET, - constants.DEPLOY_OFFSET, - ); - const sorted = sliced.sort((a, b) => Date.parse(a.lastPublished) > Date.parse(b.lastPublished) - ? -1 - : 1); - - this.emitHistoricalEvents(sorted); - }, - }, - methods: { - ...common.methods, - getWebhookTriggerType() { - return "site_publish"; - }, - generateMeta(data) { - return { - id: `${data.site}-${data.publishTime}`, - summary: `The site ${data.site} has been published.`, - ts: data.publishTime, - }; - }, - }, -}; diff --git a/components/webflow/actions/common/constants.mjs b/components/webflow_v2/actions/common/constants.mjs similarity index 100% rename from components/webflow/actions/common/constants.mjs rename to components/webflow_v2/actions/common/constants.mjs diff --git a/components/webflow/actions/create-collection-item/create-collection-item.mjs b/components/webflow_v2/actions/create-collection-item/create-collection-item.mjs similarity index 59% rename from components/webflow/actions/create-collection-item/create-collection-item.mjs rename to components/webflow_v2/actions/create-collection-item/create-collection-item.mjs index 40ee7857d9fb8..b9d091eb708e8 100644 --- a/components/webflow/actions/create-collection-item/create-collection-item.mjs +++ b/components/webflow_v2/actions/create-collection-item/create-collection-item.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-create-collection-item", + key: "webflow_v2-create-collection-item", name: "Create Collection Item", description: "Create new collection item. [See the docs here](https://developers.webflow.com/#create-new-collection-item)", - version: "0.1.7", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -24,21 +24,15 @@ export default { ], reloadProps: true, }, - live: { - label: "Live", - description: "Indicate if the item should be published to the live site", - type: "boolean", - default: false, - }, }, async additionalProps() { const props = {}; if (!this.collectionId) { return props; } - const { fields } = await this.webflow.getCollection(this.collectionId); + const { fields } = await this.app.getCollection(this.collectionId); for (const field of fields) { - if (field.editable && field.slug !== "_archived" && field.slug !== "_draft") { + if (field.isEditable && field.slug !== "isArchived" && field.slug !== "isDraft") { props[field.slug] = { type: "string", label: field.name, @@ -47,7 +41,7 @@ export default { : field.slug === "slug" ? "URL structure of the Item in your site." : "See the documentation for additional information about [Field Types & Item Values](https://developers.webflow.com/reference/field-types-item-values).", - optional: !field.required, + optional: !field.isRequired, }; } } @@ -55,29 +49,23 @@ export default { }, async run({ $ }) { const { - webflow, + app, // eslint-disable-next-line no-unused-vars siteId, - // eslint-disable-next-line no-unused-vars collectionId, - live, - ...fields + ...fieldData } = this; - const webflowClient = webflow._createApiClient(); - - const response = await webflowClient.createItem({ - collectionId: this.collectionId, - fields: { - ...fields, - _archived: false, - _draft: false, + const response = await app.createCollectionItem( + collectionId, + { + fieldData, + isArchived: false, + isDraft: false, }, - }, { - live, - }); + ); - $.export("$summary", `Successfully created collection item ${fields.name}`); + $.export("$summary", `Successfully created collection item ${this.name ?? ""}`); return response; }, diff --git a/components/webflow/actions/delete-collection-item/delete-collection-item.mjs b/components/webflow_v2/actions/delete-collection-item/delete-collection-item.mjs similarity index 65% rename from components/webflow/actions/delete-collection-item/delete-collection-item.mjs rename to components/webflow_v2/actions/delete-collection-item/delete-collection-item.mjs index cf329275da710..be0d12f906afa 100644 --- a/components/webflow/actions/delete-collection-item/delete-collection-item.mjs +++ b/components/webflow_v2/actions/delete-collection-item/delete-collection-item.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-delete-collection-item", + key: "webflow_v2-delete-collection-item", name: "Delete Collection Item", description: "Delete Item of a Collection. [See the docs here](https://developers.webflow.com/#remove-collection-item)", - version: "0.0.5", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -25,7 +25,7 @@ export default { }, itemId: { propDefinition: [ - webflow, + app, "items", (c) => ({ collectionId: c.collectionId, @@ -34,12 +34,10 @@ export default { }, }, async run({ $ }) { - const webflow = this.webflow._createApiClient(); - - const response = await webflow.removeItem({ - collectionId: this.collectionId, - itemId: this.itemId, - }); + const { + collectionId, itemId, + } = this; + const response = await this.app.deleteCollectionItem(collectionId, itemId); $.export("$summary", "Successfully deleted item"); diff --git a/components/webflow/actions/fulfill-order/fulfill-order.mjs b/components/webflow_v2/actions/fulfill-order/fulfill-order.mjs similarity index 61% rename from components/webflow/actions/fulfill-order/fulfill-order.mjs rename to components/webflow_v2/actions/fulfill-order/fulfill-order.mjs index 860cd41233a97..036cf7e9fde82 100644 --- a/components/webflow/actions/fulfill-order/fulfill-order.mjs +++ b/components/webflow_v2/actions/fulfill-order/fulfill-order.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-fulfill-order", + key: "webflow_v2-fulfill-order", name: "Fulfill Order", description: "Fulfill an order. [See the docs here](https://developers.webflow.com/#fulfill-order)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, orderId: { propDefinition: [ - webflow, + app, "orders", ], }, @@ -28,13 +28,10 @@ export default { }, }, async run({ $ }) { - const apiClient = this.webflow._createApiClient(); - - const response = await apiClient.post(`/sites/${this.siteId}/order/${this.orderId}/fulfill`, { - data: { - sendOrderFulfilledEmail: this.sendOrderFulfilledEmail, - }, - }); + const { + app, siteId, orderId, ...data + } = this; + const response = await app.fulfillOrder(siteId, orderId, data); $.export("$summary", "Successfully fulfilled order"); diff --git a/components/webflow/actions/get-collection-item/get-collection-item.mjs b/components/webflow_v2/actions/get-collection-item/get-collection-item.mjs similarity index 66% rename from components/webflow/actions/get-collection-item/get-collection-item.mjs rename to components/webflow_v2/actions/get-collection-item/get-collection-item.mjs index 55875f7e15b38..7d687378800b4 100644 --- a/components/webflow/actions/get-collection-item/get-collection-item.mjs +++ b/components/webflow_v2/actions/get-collection-item/get-collection-item.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-get-collection-item", + key: "webflow_v2-get-collection-item", name: "Get Collection Item", description: "Get a Collection Item. [See the docs here](https://developers.webflow.com/#get-single-item)", - version: "0.1.7", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -25,7 +25,7 @@ export default { }, itemId: { propDefinition: [ - webflow, + app, "items", (c) => ({ collectionId: c.collectionId, @@ -34,12 +34,7 @@ export default { }, }, async run({ $ }) { - const webflow = this.webflow._createApiClient(); - - const response = await webflow.item({ - collectionId: this.collectionId, - itemId: this.itemId, - }); + const response = await this.app.getCollectionItem(this.collectionId, this.itemId); $.export("$summary", "Successfully retrieved collection item"); diff --git a/components/webflow/actions/get-collection/get-collection.mjs b/components/webflow_v2/actions/get-collection/get-collection.mjs similarity index 70% rename from components/webflow/actions/get-collection/get-collection.mjs rename to components/webflow_v2/actions/get-collection/get-collection.mjs index 6464bb1601ee8..ad69e2dc63b75 100644 --- a/components/webflow/actions/get-collection/get-collection.mjs +++ b/components/webflow_v2/actions/get-collection/get-collection.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-get-collection", + key: "webflow_v2-get-collection", name: "Get Collection", description: "Get a collection. [See the docs here](https://developers.webflow.com/#get-collection-with-full-schema)", - version: "0.0.5", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -25,7 +25,7 @@ export default { }, }, async run({ $ }) { - const response = await this.webflow.getCollection(this.collectionId); + const response = await this.app.getCollection(this.collectionId); $.export("$summary", "Successfully retrieved collection"); diff --git a/components/webflow/actions/get-item-inventory/get-item-inventory.mjs b/components/webflow_v2/actions/get-item-inventory/get-item-inventory.mjs similarity index 66% rename from components/webflow/actions/get-item-inventory/get-item-inventory.mjs rename to components/webflow_v2/actions/get-item-inventory/get-item-inventory.mjs index 5dace536d6139..85538cbb6b318 100644 --- a/components/webflow/actions/get-item-inventory/get-item-inventory.mjs +++ b/components/webflow_v2/actions/get-item-inventory/get-item-inventory.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-get-item-inventory", + key: "webflow_v2-get-item-inventory", name: "Get Item Inventory", description: "Get the inventory of a specific item. [See the docs here](https://developers.webflow.com/#item-inventory)", - version: "0.0.5", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -25,7 +25,7 @@ export default { }, itemId: { propDefinition: [ - webflow, + app, "items", (c) => ({ collectionId: c.collectionId, @@ -34,9 +34,7 @@ export default { }, }, async run({ $ }) { - const apiClient = this.webflow._createApiClient(); - - const response = await apiClient.apiClient.get(`/collections/${this.collectionId}/items/${this.itemId}/inventory`); + const response = await this.app.getCollectionItemInventory(this.collectionId, this.itemId); $.export("$summary", "Successfully retrieved item inventory"); diff --git a/components/webflow_v2/actions/get-order/get-order.mjs b/components/webflow_v2/actions/get-order/get-order.mjs new file mode 100644 index 0000000000000..fa8aa041b7970 --- /dev/null +++ b/components/webflow_v2/actions/get-order/get-order.mjs @@ -0,0 +1,31 @@ +import app from "../../webflow_v2.app.mjs"; + +export default { + key: "webflow_v2-get-order", + name: "Get Order", + description: "Get info on an order. [See the docs here](https://developers.webflow.com/#get-order)", + version: "0.0.1", + type: "action", + props: { + app, + siteId: { + propDefinition: [ + app, + "sites", + ], + }, + orderId: { + propDefinition: [ + app, + "orders", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getOrder(this.siteId, this.orderId); + + $.export("$summary", "Successfully retrieved order"); + + return response; + }, +}; diff --git a/components/webflow/actions/get-site/get-site.mjs b/components/webflow_v2/actions/get-site/get-site.mjs similarity index 65% rename from components/webflow/actions/get-site/get-site.mjs rename to components/webflow_v2/actions/get-site/get-site.mjs index 2af7c05bdbad0..ddcfeaff96918 100644 --- a/components/webflow/actions/get-site/get-site.mjs +++ b/components/webflow_v2/actions/get-site/get-site.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-get-site", + key: "webflow_v2-get-site", name: "Get Site", description: "Get a site. [See the docs here](https://developers.webflow.com/#get-specific-site)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, }, async run({ $ }) { - const response = await this.webflow.getSite(this.siteId); + const response = await this.app.getSite(this.siteId); $.export("$summary", "Successfully retrieved site"); diff --git a/components/webflow/actions/list-collection-items/list-collection-items.mjs b/components/webflow_v2/actions/list-collection-items/list-collection-items.mjs similarity index 61% rename from components/webflow/actions/list-collection-items/list-collection-items.mjs rename to components/webflow_v2/actions/list-collection-items/list-collection-items.mjs index 12bcf43885ce3..7801319f5dcc9 100644 --- a/components/webflow/actions/list-collection-items/list-collection-items.mjs +++ b/components/webflow_v2/actions/list-collection-items/list-collection-items.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-list-collection-items", + key: "webflow_v2-list-collection-items", name: "List Collection Items", description: "List Items of a collection. [See the docs here](https://developers.webflow.com/#get-all-items-for-a-collection)", - version: "0.0.5", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -25,9 +25,9 @@ export default { }, }, async run({ $ }) { - const response = await this.webflow.getItems(0, this.collectionId); + const response = await this.app.listCollectionItems(0, this.collectionId); - $.export("$summary", "Successfully retrieved collections items"); + $.export("$summary", "Successfully retrieved collection's items"); return response; }, diff --git a/components/webflow/actions/list-collections/list-collections.mjs b/components/webflow_v2/actions/list-collections/list-collections.mjs similarity index 65% rename from components/webflow/actions/list-collections/list-collections.mjs rename to components/webflow_v2/actions/list-collections/list-collections.mjs index 84077c56f1f6d..3cc625e8fd03d 100644 --- a/components/webflow/actions/list-collections/list-collections.mjs +++ b/components/webflow_v2/actions/list-collections/list-collections.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-list-collections", + key: "webflow_v2-list-collections", name: "List Collections", description: "List collections. [See the docs here](https://developers.webflow.com/#list-collections)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, }, async run({ $ }) { - const response = await this.webflow.getCollections(this.siteId); + const response = await this.app.listCollections(this.siteId); $.export("$summary", "Successfully retrieved collections"); diff --git a/components/webflow/actions/list-orders/list-orders.mjs b/components/webflow_v2/actions/list-orders/list-orders.mjs similarity index 56% rename from components/webflow/actions/list-orders/list-orders.mjs rename to components/webflow_v2/actions/list-orders/list-orders.mjs index 2d489ebeca791..4768ee641b631 100644 --- a/components/webflow/actions/list-orders/list-orders.mjs +++ b/components/webflow_v2/actions/list-orders/list-orders.mjs @@ -1,35 +1,35 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; import constants from "../common/constants.mjs"; export default { - key: "webflow-list-orders", + key: "webflow_v2-list-orders", name: "List Orders", description: "List orders. [See the docs here](https://developers.webflow.com/#get-all-orders)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, status: { label: "Status", - description: "The status to filter the orders.", + description: "If specified, only orders with this status will be listed.", type: "string", options: constants.ORDER_STATUSES, optional: true, }, }, async run({ $ }) { - const response = await this.webflow.getOrders({ - siteId: this.siteId, - status: this.status, - }); + const { + app, ...data + } = this; + const response = await app.listOrders(data); - $.export("$summary", "Successfully retrieved orders"); + $.export("$summary", `Successfully retrieved ${response?.length} orders`); return response; }, diff --git a/components/webflow/actions/list-sites/list-sites.mjs b/components/webflow_v2/actions/list-sites/list-sites.mjs similarity index 63% rename from components/webflow/actions/list-sites/list-sites.mjs rename to components/webflow_v2/actions/list-sites/list-sites.mjs index 6ef0ec3ef218d..c14fbb796c54d 100644 --- a/components/webflow/actions/list-sites/list-sites.mjs +++ b/components/webflow_v2/actions/list-sites/list-sites.mjs @@ -1,16 +1,16 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-list-sites", + key: "webflow_v2-list-sites", name: "List Sites", description: "List sites. [See the docs here](https://developers.webflow.com/#list-sites)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, }, async run({ $ }) { - const response = await this.webflow.getSites(); + const response = await this.app.listSites(); $.export("$summary", "Successfully retrieved sites"); diff --git a/components/webflow_v2/actions/publish-site/publish-site.mjs b/components/webflow_v2/actions/publish-site/publish-site.mjs new file mode 100644 index 0000000000000..9b252874b3678 --- /dev/null +++ b/components/webflow_v2/actions/publish-site/publish-site.mjs @@ -0,0 +1,34 @@ +import app from "../../webflow_v2.app.mjs"; + +export default { + key: "webflow_v2-publish-site", + name: "Publish Site", + description: "Publish a site. [See the docs here](https://developers.webflow.com/#publish-site)", + version: "0.0.1", + type: "action", + props: { + app, + siteId: { + propDefinition: [ + app, + "sites", + ], + }, + domains: { + propDefinition: [ + app, + "domains", + (c) => ({ + siteId: c.siteId, + }), + ], + }, + }, + async run({ $ }) { + const response = await this.app.publishSite(this.siteId, this.domains); + + $.export("$summary", "Successfully published site"); + + return response; + }, +}; diff --git a/components/webflow/actions/refund-order/refund-order.mjs b/components/webflow_v2/actions/refund-order/refund-order.mjs similarity index 59% rename from components/webflow/actions/refund-order/refund-order.mjs rename to components/webflow_v2/actions/refund-order/refund-order.mjs index d5b9e536072a8..4a63293db6cc1 100644 --- a/components/webflow/actions/refund-order/refund-order.mjs +++ b/components/webflow_v2/actions/refund-order/refund-order.mjs @@ -1,30 +1,28 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-refund-order", + key: "webflow_v2-refund-order", name: "Refund Order", description: "Refund an order. [See the docs here](https://developers.webflow.com/#refund-order)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, orderId: { propDefinition: [ - webflow, + app, "orders", ], }, }, async run({ $ }) { - const apiClient = this.webflow._createApiClient(); - - const response = apiClient.get(`/sites/${this.siteId}/order/${this.orderId}/refund`); + const response = await this.app.refundOrder(this.siteId, this.orderId); $.export("$summary", "Successfully refunded order"); diff --git a/components/webflow/actions/unfulfill-order/unfulfill-order.mjs b/components/webflow_v2/actions/unfulfill-order/unfulfill-order.mjs similarity index 59% rename from components/webflow/actions/unfulfill-order/unfulfill-order.mjs rename to components/webflow_v2/actions/unfulfill-order/unfulfill-order.mjs index 040d6b762ee40..e8f649395edd4 100644 --- a/components/webflow/actions/unfulfill-order/unfulfill-order.mjs +++ b/components/webflow_v2/actions/unfulfill-order/unfulfill-order.mjs @@ -1,30 +1,28 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-unfulfill-order", + key: "webflow_v2-unfulfill-order", name: "Unfulfill Order", description: "Unfulfill an order. [See the docs here](https://developers.webflow.com/#unfulfill-order)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, orderId: { propDefinition: [ - webflow, + app, "orders", ], }, }, async run({ $ }) { - const apiClient = this.webflow._createApiClient(); - - const response = apiClient.post(`/sites/${this.siteId}/order/${this.orderId}/unfulfill`); + const response = await this.app.unfulfillOrder(this.siteId, this.orderId); $.export("$summary", "Successfully unfulfilled order"); diff --git a/components/webflow_v2/actions/update-collection-item/update-collection-item.mjs b/components/webflow_v2/actions/update-collection-item/update-collection-item.mjs new file mode 100644 index 0000000000000..bc4d0cbb75575 --- /dev/null +++ b/components/webflow_v2/actions/update-collection-item/update-collection-item.mjs @@ -0,0 +1,95 @@ +import app from "../../webflow_v2.app.mjs"; + +export default { + key: "webflow_v2-update-collection-item", + name: "Update Collection Item", + description: + "Update collection item. [See the documentation](https://developers.webflow.com/#update-collection-item)", + version: "0.0.1", + type: "action", + props: { + app, + siteId: { + propDefinition: [ + app, + "sites", + ], + }, + collectionId: { + propDefinition: [ + app, + "collections", + (c) => ({ + siteId: c.siteId, + }), + ], + }, + itemId: { + propDefinition: [ + app, + "items", + (c) => ({ + collectionId: c.collectionId, + }), + ], + reloadProps: true, + }, + }, + async additionalProps() { + const props = {}; + if (!this.collectionId) { + return props; + } + const { fields } = await this.app.getCollection(this.collectionId); + for (const field of fields) { + if ( + field.isEditable && + field.slug !== "isArchived" && + field.slug !== "isDraft" + ) { + props[field.slug] = { + type: "string", + label: field.name, + description: + field.slug === "name" + ? "Name given to the Item." + : field.slug === "slug" + ? "URL structure of the Item in your site. Note: Updates to an item slug will break all links referencing the old slug." + : "See the documentation for additional information about [Field Types & Item Values](https://developers.webflow.com/reference/field-types-item-values).", + optional: true, + }; + } + } + + return props; + }, + async run({ $ }) { + const { + app, + // eslint-disable-next-line no-unused-vars + siteId, + collectionId, + itemId, + name, + slug, + ...customFields + } = this; + + const item = await app.getCollectionItem(collectionId, itemId); + + const response = await app.updateCollectionItem(collectionId, itemId, { + id: itemId, + isArchived: false, + isDraft: false, + fieldData: { + ...customFields, + name: name || item.fieldData.name, + slug: slug || item.fieldData.slug, + }, + }); + + $.export("$summary", "Successfully updated collection item"); + + return response; + }, +}; diff --git a/components/webflow/actions/update-item-inventory/update-item-inventory.mjs b/components/webflow_v2/actions/update-item-inventory/update-item-inventory.mjs similarity index 58% rename from components/webflow/actions/update-item-inventory/update-item-inventory.mjs rename to components/webflow_v2/actions/update-item-inventory/update-item-inventory.mjs index 443d8ddc897aa..059c39d0e6c19 100644 --- a/components/webflow/actions/update-item-inventory/update-item-inventory.mjs +++ b/components/webflow_v2/actions/update-item-inventory/update-item-inventory.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-update-item-inventory", + key: "webflow_v2-update-item-inventory", name: "Update Item Inventory", description: "Update the inventory of a specific item. [See the docs here](https://developers.webflow.com/#update-item-inventory)", version: "0.0.5", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, collectionId: { propDefinition: [ - webflow, + app, "collections", (c) => ({ siteId: c.siteId, @@ -25,7 +25,7 @@ export default { }, itemId: { propDefinition: [ - webflow, + app, "items", (c) => ({ collectionId: c.collectionId, @@ -43,35 +43,28 @@ export default { }, quantity: { label: "Quantity", - description: "The quantity will be seted with this value. This just can be used with `finite` option selected and without `updateQuantity` value.", + description: "If specified, sets quantity to this value. Can only be used with the `finite` inventory type, and if `Update Quantity` is not specified.", type: "integer", optional: true, }, updateQuantity: { label: "Update Quantity", - description: "This value will be added to the quantity. This just can be used with `finite` option selected and without `quantity` value.", + description: "If specified, adds this value to the current quantity. Can only be used with the `finite` inventory type, and if `Quantity` is not specified.", type: "integer", optional: true, }, }, async run({ $ }) { - const apiClient = this.webflow._createApiClient(); - const { - inventoryType, - quantity, - updateQuantity, + app, + // eslint-disable-next-line no-unused-vars + siteId, + collectionId, + itemId, + ...data } = this; - const response = await apiClient.patch(`/collections/${this.collectionId}/items/${this.itemId}/inventory`, { - data: { - fields: { - inventoryType, - quantity, - updateQuantity, - }, - }, - }); + const response = await app.updateCollectionItemInventory(collectionId, itemId, data); $.export("$summary", "Successfully updated item inventory"); diff --git a/components/webflow/actions/update-order/update-order.mjs b/components/webflow_v2/actions/update-order/update-order.mjs similarity index 65% rename from components/webflow/actions/update-order/update-order.mjs rename to components/webflow_v2/actions/update-order/update-order.mjs index 74a22137dcb1b..ddb3f0d44e350 100644 --- a/components/webflow/actions/update-order/update-order.mjs +++ b/components/webflow_v2/actions/update-order/update-order.mjs @@ -1,22 +1,22 @@ -import webflow from "../../webflow.app.mjs"; +import app from "../../webflow_v2.app.mjs"; export default { - key: "webflow-update-order", + key: "webflow_v2-update-order", name: "Update Order", description: "Update an order. [See the docs here](https://developers.webflow.com/#update-order)", - version: "0.0.4", + version: "0.0.1", type: "action", props: { - webflow, + app, siteId: { propDefinition: [ - webflow, + app, "sites", ], }, orderId: { propDefinition: [ - webflow, + app, "orders", ], }, @@ -40,23 +40,11 @@ export default { }, }, async run({ $ }) { - const apiClient = this.webflow._createApiClient(); - const { - comment, - shippingProvider, - shippingTracking, + app, siteId, orderId, ...data } = this; - const response = await apiClient.post(`/sites/${this.siteId}/order/${this.orderId}`, { - data: { - fields: { - comment, - shippingProvider, - shippingTracking, - }, - }, - }); + const response = await app.updateOrder(siteId, orderId, data); $.export("$summary", "Successfully updated order"); diff --git a/components/webflow/common/constants.mjs b/components/webflow_v2/common/constants.mjs similarity index 100% rename from components/webflow/common/constants.mjs rename to components/webflow_v2/common/constants.mjs diff --git a/components/webflow_v2/package.json b/components/webflow_v2/package.json index 9ea5fe8b75feb..b2808e9dcb729 100644 --- a/components/webflow_v2/package.json +++ b/components/webflow_v2/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/webflow_v2", - "version": "0.0.1", + "version": "0.1.0", "description": "Pipedream Webflow (v2) Components", "main": "webflow_v2.app.mjs", "keywords": [ @@ -9,7 +9,11 @@ ], "homepage": "https://pipedream.com/apps/webflow_v2", "author": "Pipedream (https://pipedream.com/)", + "dependencies": { + "@pipedream/platform": "^3.0.3", + "webflow-api": "2.4.2" + }, "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/components/webflow/sources/changed-collection-item/changed-collection-item.mjs b/components/webflow_v2/sources/changed-collection-item/changed-collection-item.mjs similarity index 50% rename from components/webflow/sources/changed-collection-item/changed-collection-item.mjs rename to components/webflow_v2/sources/changed-collection-item/changed-collection-item.mjs index 0e818f3537291..1464dce2ba8b6 100644 --- a/components/webflow/sources/changed-collection-item/changed-collection-item.mjs +++ b/components/webflow_v2/sources/changed-collection-item/changed-collection-item.mjs @@ -1,11 +1,11 @@ -import common from "../common/collection-common.mjs"; +import common from "../common/common.mjs"; export default { type: "source", - key: "webflow-changed-collection-item", - name: "New Changed Collection Item", + key: "webflow_v2-changed-collection-item", + name: "Collection Item Updated", description: "Emit new event when a collection item is changed. [See the docs here](https://developers.webflow.com/#model16)", - version: "0.2.3", + version: "0.0.1", ...common, methods: { ...common.methods, @@ -13,11 +13,14 @@ export default { return "collection_item_changed"; }, generateMeta(data) { - const ts = Date.parse(data["updated-on"]); + const { + id, fieldData, lastUpdated, + } = data; + const ts = Date.parse(lastUpdated); return { - id: `${data._id}-${ts}`, - summary: `Collection ${data.slug} item changed`, + id: `${id}-${ts}`, + summary: `Item updated: ${fieldData?.slug ?? fieldData?.name ?? id}`, ts, }; }, diff --git a/components/webflow/sources/changed-ecommerce-inventory/changed-ecommerce-inventory.mjs b/components/webflow_v2/sources/changed-ecommerce-inventory/changed-ecommerce-inventory.mjs similarity index 61% rename from components/webflow/sources/changed-ecommerce-inventory/changed-ecommerce-inventory.mjs rename to components/webflow_v2/sources/changed-ecommerce-inventory/changed-ecommerce-inventory.mjs index 8e04702ce88b6..155e43314e540 100644 --- a/components/webflow/sources/changed-ecommerce-inventory/changed-ecommerce-inventory.mjs +++ b/components/webflow_v2/sources/changed-ecommerce-inventory/changed-ecommerce-inventory.mjs @@ -2,10 +2,10 @@ import common from "../common/common.mjs"; export default { type: "source", - key: "webflow-changed-ecommerce-inventory", - name: "New Changed E-commerce Inventory", + key: "webflow_v2-changed-ecommerce-inventory", + name: "E-commerce Inventory Updated", description: "Emit new event when an e-commerce inventory level changes. [See the docs here](https://developers.webflow.com/#item-inventory)", - version: "0.2.3", + version: "0.0.1", ...common, methods: { ...common.methods, @@ -13,12 +13,13 @@ export default { return "ecomm_inventory_changed"; }, generateMeta(data) { - const now = Date.now(); + const ts = Date.now(); + const { id } = data; return { - id: `${data._id}-${now}`, - summary: `E-commerce ${data._id} inventory changed`, - ts: now, + id: `${id}-${ts}`, + summary: `E-comm inventory updated: ${id}`, + ts, }; }, }, diff --git a/components/webflow/sources/changed-ecommerce-order/changed-ecommerce-order.mjs b/components/webflow_v2/sources/changed-ecommerce-order/changed-ecommerce-order.mjs similarity index 57% rename from components/webflow/sources/changed-ecommerce-order/changed-ecommerce-order.mjs rename to components/webflow_v2/sources/changed-ecommerce-order/changed-ecommerce-order.mjs index 6f1a80be6af21..19833b42f3002 100644 --- a/components/webflow/sources/changed-ecommerce-order/changed-ecommerce-order.mjs +++ b/components/webflow_v2/sources/changed-ecommerce-order/changed-ecommerce-order.mjs @@ -2,23 +2,22 @@ import common from "../common/common.mjs"; export default { type: "source", - key: "webflow-changed-ecommerce-order", - name: "New Changed E-commerce Order", + key: "webflow_v2-changed-ecommerce-order", + name: "E-commerce Order Updated", description: "Emit new event when an e-commerce order is changed. [See the docs here](https://developers.webflow.com/#order-model)", - version: "0.2.3", + version: "0.0.1", ...common, methods: { ...common.methods, getWebhookTriggerType() { return "ecomm_order_changed"; }, - generateMeta(data) { - const now = Date.now(); - + generateMeta({ orderId }) { + const ts = Date.now(); return { - id: `${data.orderId}-${now}`, - summary: `E-commerce order ${data.orderId} changed`, - ts: now, + id: `${orderId}-${ts}`, + summary: `E-comm order updated: ${orderId}`, + ts, }; }, }, diff --git a/components/webflow_v2/sources/common/common.mjs b/components/webflow_v2/sources/common/common.mjs new file mode 100644 index 0000000000000..c5d08ccdce861 --- /dev/null +++ b/components/webflow_v2/sources/common/common.mjs @@ -0,0 +1,63 @@ +import app from "../../webflow_v2.app.mjs"; +import { v4 as uuid } from "uuid"; +import constants from "../../common/constants.mjs"; + +export default { + dedupe: "unique", + props: { + app, + siteId: { + propDefinition: [ + app, + "sites", + ], + }, + db: "$.service.db", + http: "$.interface.http", + }, + methods: { + _getWebhookId() { + return this.db.get("webhookId"); + }, + _setWebhookId(webhookId) { + this.db.set("webhookId", webhookId); + }, + getWebhookTriggerType() { + throw new Error("getWebhookTriggerType is not implemented"); + }, + generateMeta(data) { + return { + id: data.id || uuid(), + summary: "New event", + ts: Date.now(), + }; + }, + processEvent(event) { + const { body: { payload } } = event; + const meta = this.generateMeta(payload); + this.$emit(payload, meta); + }, + emitHistoricalEvents(events, limit = constants.DEPLOY_OFFSET) { + for (const event of events.slice(0, limit)) { + const meta = this.generateMeta(event); + this.$emit(event, meta); + } + }, + }, + hooks: { + async activate() { + const webhook = await this.app.createWebhook(this.siteId, { + url: this.http.endpoint, + triggerType: this.getWebhookTriggerType(), + }); + + this._setWebhookId(webhook?.id); + }, + async deactivate() { + await this.app.removeWebhook(this._getWebhookId()); + }, + }, + async run(event) { + await this.processEvent(event); + }, +}; diff --git a/components/webflow_v2/sources/new-collection-item/new-collection-item.mjs b/components/webflow_v2/sources/new-collection-item/new-collection-item.mjs new file mode 100644 index 0000000000000..463871690e238 --- /dev/null +++ b/components/webflow_v2/sources/new-collection-item/new-collection-item.mjs @@ -0,0 +1,26 @@ +import common from "../common/common.mjs"; + +export default { + type: "source", + key: "webflow_v2-new-collection-item", + name: "New Collection Item Created", + description: "Emit new event when a collection item is created. [See the docs here](https://developers.webflow.com/#item-model)", + version: "0.0.1", + ...common, + methods: { + ...common.methods, + getWebhookTriggerType() { + return "collection_item_created"; + }, + generateMeta(data) { + const { + id, fieldData, + } = data; + return { + id, + summary: `New item: ${fieldData?.slug ?? fieldData?.name ?? id}`, + ts: Date.parse(data["createdOn"]), + }; + }, + }, +}; diff --git a/components/webflow/sources/new-deleted-collection-item/new-deleted-collection-item.mjs b/components/webflow_v2/sources/new-deleted-collection-item/new-deleted-collection-item.mjs similarity index 63% rename from components/webflow/sources/new-deleted-collection-item/new-deleted-collection-item.mjs rename to components/webflow_v2/sources/new-deleted-collection-item/new-deleted-collection-item.mjs index 169c29d0203ff..4c0463ff7bafe 100644 --- a/components/webflow/sources/new-deleted-collection-item/new-deleted-collection-item.mjs +++ b/components/webflow_v2/sources/new-deleted-collection-item/new-deleted-collection-item.mjs @@ -2,10 +2,10 @@ import common from "../common/common.mjs"; export default { type: "source", - key: "webflow-new-deleted-collection-item", - name: "New Deleted Collection Item", + key: "webflow_v2-new-deleted-collection-item", + name: "Collection Item Deleted", description: "Emit new event when a collection item is deleted. [See the docs here](https://developers.webflow.com/#item-model)", - version: "0.2.3", + version: "0.0.1", ...common, methods: { ...common.methods, @@ -13,10 +13,11 @@ export default { return "collection_item_deleted"; }, generateMeta(data) { + const { id } = data; return { - id: data.itemId, - summary: `Collection item ${data.itemId} deleted.`, - ts: Date.parse(data["created-on"]), + id, + summary: `Item deleted: ${id}`, + ts: Date.now(), }; }, }, diff --git a/components/webflow_v2/sources/new-ecommerce-order/new-ecommerce-order.mjs b/components/webflow_v2/sources/new-ecommerce-order/new-ecommerce-order.mjs new file mode 100644 index 0000000000000..9b1c8adb29ec8 --- /dev/null +++ b/components/webflow_v2/sources/new-ecommerce-order/new-ecommerce-order.mjs @@ -0,0 +1,37 @@ +import common from "../common/common.mjs"; + +export default { + type: "source", + key: "webflow_v2-new-ecommerce-order", + name: "New E-commerce Order", + description: + "Emit new event when an e-commerce order is created. [See the docs here](https://developers.webflow.com/#order-model)", + version: "0.0.1", + ...common, + hooks: { + ...common.hooks, + async deploy() { + const { siteId } = this; + console.log("Retrieving historical events..."); + + const events = await this.app.listOrders({ + siteId, + limit: 10, + }); + this.emitHistoricalEvents(events); + }, + }, + methods: { + ...common.methods, + getWebhookTriggerType() { + return "ecomm_new_order"; + }, + generateMeta(data) { + return { + id: data.orderId, + summary: `New ${data.orderId} e-commerce order`, + ts: Date.parse(data.acceptedOn), + }; + }, + }, +}; diff --git a/components/webflow/sources/new-form-submission/new-form-submission.mjs b/components/webflow_v2/sources/new-form-submission/new-form-submission.mjs similarity index 50% rename from components/webflow/sources/new-form-submission/new-form-submission.mjs rename to components/webflow_v2/sources/new-form-submission/new-form-submission.mjs index d29791ef41bbd..461a0411ad526 100644 --- a/components/webflow/sources/new-form-submission/new-form-submission.mjs +++ b/components/webflow_v2/sources/new-form-submission/new-form-submission.mjs @@ -3,10 +3,10 @@ import sampleEmit from "./test-event.mjs"; export default { type: "source", - key: "webflow-new-form-submission", + key: "webflow_v2-new-form-submission", name: "New Form Submission", - description: "Emit new event when a new form is submitted. [See the docs here](https://developers.webflow.com/#trigger-types)", - version: "0.2.4", + description: "Emit new event when a form is submitted. [See the docs here](https://developers.webflow.com/#trigger-types)", + version: "0.0.1", ...common, methods: { ...common.methods, @@ -14,10 +14,13 @@ export default { return "form_submission"; }, generateMeta(data) { + const { + name, id, submittedAt, + } = data; return { - id: data._id, - summary: `New form ${data._id} submission`, - ts: Date.parse(data.date), + id, + summary: `Form submitted: ${name ?? id}`, + ts: Date.parse(submittedAt), }; }, }, diff --git a/components/webflow/sources/new-form-submission/test-event.mjs b/components/webflow_v2/sources/new-form-submission/test-event.mjs similarity index 100% rename from components/webflow/sources/new-form-submission/test-event.mjs rename to components/webflow_v2/sources/new-form-submission/test-event.mjs diff --git a/components/webflow_v2/sources/new-site-published/new-site-published.mjs b/components/webflow_v2/sources/new-site-published/new-site-published.mjs new file mode 100644 index 0000000000000..a1f1e5aaee9a8 --- /dev/null +++ b/components/webflow_v2/sources/new-site-published/new-site-published.mjs @@ -0,0 +1,25 @@ +import common from "../common/common.mjs"; + +export default { + type: "source", + key: "webflow_v2-new-site-published", + name: "Site Published", + description: "Emit new event when a site is published. [See the docs here](https://developers.webflow.com/#trigger-types)", + version: "0.0.1", + ...common, + methods: { + ...common.methods, + getWebhookTriggerType() { + return "site_publish"; + }, + generateMeta({ + siteId, publishedOn, + }) { + return { + id: `${siteId}-${publishedOn}`, + summary: `Site published: ${siteId}`, + ts: Date.parse(publishedOn), + }; + }, + }, +}; diff --git a/components/webflow_v2/webflow_v2.app.mjs b/components/webflow_v2/webflow_v2.app.mjs index 2773a1f8c4584..a0683c658dce7 100644 --- a/components/webflow_v2/webflow_v2.app.mjs +++ b/components/webflow_v2/webflow_v2.app.mjs @@ -1,11 +1,170 @@ +import { WebflowClient } from "webflow-api"; +import constants from "./common/constants.mjs"; + export default { type: "app", app: "webflow_v2", - propDefinitions: {}, + propDefinitions: { + domains: { + label: "Custom Domains", + description: "Select one or more custom domains to publish.", + type: "string[]", + async options({ siteId }) { + const domains = await this.listDomains(siteId); + return domains.map((id, url) => ({ + label: url, + id, + })); + }, + }, + sites: { + label: "Site", + description: "Select a site or provide a custom site ID.", + type: "string", + async options() { + const sites = await this.listSites(); + + return sites.map((site) => ({ + label: site.displayName || site.shortName, + value: site.id, + })); + }, + }, + collections: { + label: "Collection", + description: "Select a collection or provide a custom collection ID.", + type: "string", + async options({ siteId }) { + const collections = await this.listCollections(siteId); + + return collections.map((collection) => ({ + label: collection.displayName || collection.slug, + value: collection.id, + })); + }, + }, + items: { + label: "Item", + description: "Select an item or provide a custom item ID.", + type: "string", + async options({ + collectionId, page, + }) { + const items = await this.listCollectionItems(page, collectionId); + + return items.map((item) => ({ + label: item.fieldData?.name || item.fieldData?.slug, + value: item.id, + })); + }, + }, + orders: { + label: "Order", + description: "Select an order, or provide a custom order ID.", + type: "string", + async options({ + siteId, page, + }) { + const items = await this.listOrders({ + page, + siteId, + }); + + return items.map((item) => item.orderId); + }, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + _authToken() { + return this.$auth.oauth_access_token; + }, + webflowClient() { + return new WebflowClient({ + accessToken: this._authToken(), + }); + }, + async createWebhook(siteId, data) { + return this.webflowClient().webhooks.create(siteId, data); + }, + async removeWebhook(webhookId) { + return this.webflowClient().webhooks.delete(webhookId); + }, + async getOrder(siteId, orderId) { + return this.webflowClient().orders.get(siteId, orderId); + }, + async listOrders({ + page: offset = 0, siteId, status, + }) { + const response = await this.webflowClient().orders.list(siteId, { + offset, + status, + }); + return response?.orders; + }, + async listDomains(siteId) { + const response = await this.webflowClient().sites.getCustomDomain(siteId); + return response?.customDomains; + }, + getSite(siteId) { + return this.webflowClient().sites.get(siteId); + }, + async listSites() { + const response = await this.webflowClient().sites.list(); + return response?.sites; + }, + getCollection(collectionId) { + return this.webflowClient().collections.get(collectionId); + }, + async listCollections(siteId) { + if (!siteId) return []; + + const response = await this.webflowClient().collections.list(siteId); + return response?.collections; + }, + async listCollectionItems(page = 0, collectionId) { + if (!collectionId) return []; + + const response = await this.webflowClient().collections.items.listItems(collectionId, { + limit: constants.LIMIT, + offset: page, + }); + + return response?.items; + }, + getCollectionItem(collectionId, itemId) { + return this.webflowClient().collections.items.getItem(collectionId, itemId); + }, + deleteCollectionItem(collectionId, itemId) { + return this.webflowClient().collections.items.deleteItem(collectionId, itemId); + }, + createCollectionItem(collectionId, data) { + return this.webflowClient().collections.items.createItem(collectionId, data); + }, + updateCollectionItem(collectionId, itemId, data) { + return this.webflowClient().collections.items.updateItem(collectionId, itemId, data); + }, + getCollectionItemInventory(collectionId, itemId) { + return this.webflowClient().inventory.list(collectionId, itemId); + }, + updateCollectionItemInventory(collectionId, itemId, data) { + return this.webflowClient().inventory.update(collectionId, itemId, data); + }, + publishSite(siteId, customDomains) { + return this.webflowClient().sites.publish(siteId, { + customDomains, + }); + }, + fulfillOrder(siteId, orderId, data) { + return this.webflowClient().orders.updateFulfill(siteId, orderId, data); + }, + unfulfillOrder(siteId, orderId) { + return this.webflowClient().orders.updateUnfulfill(siteId, orderId); + }, + refundOrder(siteId, orderId) { + return this.webflowClient().orders.refund(siteId, orderId); + }, + updateOrder(siteId, orderId, data) { + return this.webflowClient().orders.update(siteId, orderId, data); }, }, -}; \ No newline at end of file +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e96d1d061a6a..eef0fd4306d24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1693,8 +1693,7 @@ importers: specifier: ^1.5.1 version: 1.6.6 - components/checkout_com: - specifiers: {} + components/checkout_com: {} components/checkvist: dependencies: @@ -11284,7 +11283,14 @@ importers: specifier: 1.3.1 version: 1.3.1 - components/webflow_v2: {} + components/webflow_v2: + dependencies: + '@pipedream/platform': + specifier: ^3.0.3 + version: 3.0.3 + webflow-api: + specifier: 2.4.2 + version: 2.4.2 components/webinarfuel: {} @@ -13393,12 +13399,12 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@definitelytyped/header-parser@0.2.15': - resolution: {integrity: sha512-SRUpmhQ7QZpsjLiA9SlwaD2Ct1xOc5Vt8cpZAqQ+P/puu4nNIsibCW87NKkyjCXG+MCUVFWEK7rVCTd12m2hTw==} + '@definitelytyped/header-parser@0.2.16': + resolution: {integrity: sha512-UFsgPft5bhZn07UNGz/9ck4AhdKgLFEOmi2DNr7gXcGL89zbe3u5oVafKUT8j1HOtSBjT8ZEQsXHKlbq+wwF/Q==} engines: {node: '>=18.18.0'} - '@definitelytyped/typescript-versions@0.1.5': - resolution: {integrity: sha512-XdLx3+S6zZCcG4jnG6Kqv/PlKBRTkz5M/xZUEEN9R2g6BlzbxyE+z5EzlezJqkUls53zjuOzgbkNNP4HQIfbJQ==} + '@definitelytyped/typescript-versions@0.1.6': + resolution: {integrity: sha512-gQpXFteIKrOw4ldmBZQfBrD3WobaIG1SwOr/3alXWkcYbkOWa2NRxQbiaYQ2IvYTGaZK26miJw0UOAFiuIs4gA==} engines: {node: '>=18.18.0'} '@definitelytyped/utils@0.1.8': @@ -23735,6 +23741,9 @@ packages: webflow-api@1.3.1: resolution: {integrity: sha512-ij/Y7t7VqeS2doOhHaCSToKkZeItFwkgCS003mqbG6d51eUmihcJ2ri4SOiR3zTxmUYZO+sg1sF+aAqsY7tgiA==} + webflow-api@2.4.2: + resolution: {integrity: sha512-+znE6V6E6YULwZIGIk8NLFZaimGFH7xVEAjCeivHz4gV13Zcg4FRXyhWxxTHnOYBwKjcjDoaWl8ZK1H9mUA5mQ==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -26715,13 +26724,13 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@definitelytyped/header-parser@0.2.15': + '@definitelytyped/header-parser@0.2.16': dependencies: - '@definitelytyped/typescript-versions': 0.1.5 + '@definitelytyped/typescript-versions': 0.1.6 '@definitelytyped/utils': 0.1.8 semver: 7.6.3 - '@definitelytyped/typescript-versions@0.1.5': {} + '@definitelytyped/typescript-versions@0.1.6': {} '@definitelytyped/utils@0.1.8': dependencies: @@ -32219,7 +32228,7 @@ snapshots: dts-critic@3.3.11(typescript@5.7.2): dependencies: - '@definitelytyped/header-parser': 0.2.15 + '@definitelytyped/header-parser': 0.2.16 command-exists: 1.2.9 rimraf: 3.0.2 semver: 6.3.1 @@ -32229,8 +32238,8 @@ snapshots: dtslint@4.2.1(typescript@5.7.2): dependencies: - '@definitelytyped/header-parser': 0.2.15 - '@definitelytyped/typescript-versions': 0.1.5 + '@definitelytyped/header-parser': 0.2.16 + '@definitelytyped/typescript-versions': 0.1.6 '@definitelytyped/utils': 0.1.8 dts-critic: 3.3.11(typescript@5.7.2) fs-extra: 6.0.1 @@ -39953,6 +39962,18 @@ snapshots: transitivePeerDependencies: - debug + webflow-api@2.4.2: + dependencies: + form-data: 4.0.1 + formdata-node: 6.0.3 + js-base64: 3.7.2 + node-fetch: 2.7.0 + qs: 6.11.2 + readable-stream: 4.5.2 + url-join: 4.0.1 + transitivePeerDependencies: + - encoding + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {}