diff --git a/components/aitable_ai/actions/create-datasheet/create-datasheet.mjs b/components/aitable_ai/actions/create-datasheet/create-datasheet.mjs new file mode 100644 index 0000000000000..f89e7136903d1 --- /dev/null +++ b/components/aitable_ai/actions/create-datasheet/create-datasheet.mjs @@ -0,0 +1,50 @@ +import app from "../../aitable_ai.app.mjs"; + +export default { + key: "aitable_ai-create-datasheet", + name: "Create Datasheet", + description: "Create a datasheet in the specified space. [See the documentation](https://developers.aitable.ai/api/reference#tag/Datasheet/operation/create-datasheets)", + version: "0.0.1", + type: "action", + props: { + app, + spaceId: { + propDefinition: [ + app, + "spaceId", + ], + }, + name: { + propDefinition: [ + app, + "name", + ], + }, + description: { + propDefinition: [ + app, + "description", + ], + }, + folderId: { + propDefinition: [ + app, + "folderId", + ], + }, + }, + + async run({ $ }) { + const response = await this.app.createDatasheet({ + $, + spaceId: this.spaceId, + data: { + name: this.name, + description: this.description, + folderId: this.folderId, + }, + }); + $.export("$summary", `Successfully created Datasheet with ID '${response.data.id}'`); + return response; + }, +}; diff --git a/components/aitable_ai/actions/create-field/create-field.mjs b/components/aitable_ai/actions/create-field/create-field.mjs new file mode 100644 index 0000000000000..eadc1e7e58b40 --- /dev/null +++ b/components/aitable_ai/actions/create-field/create-field.mjs @@ -0,0 +1,44 @@ +import app from "../../aitable_ai.app.mjs"; + +export default { + key: "aitable_ai-create-field", + name: "Create Field", + description: "Create a new field in the specified datasheet. [See the documentation](https://developers.aitable.ai/api/reference#tag/Field/operation/create-fields)", + version: "0.0.1", + type: "action", + props: { + app, + spaceId: { + propDefinition: [ + app, + "spaceId", + ], + }, + type: { + propDefinition: [ + app, + "type", + ], + }, + name: { + propDefinition: [ + app, + "name", + ], + description: "Name of the Field", + }, + }, + + async run({ $ }) { + const response = await this.app.createField({ + $, + spaceId: this.spaceId, + data: { + type: this.type, + name: this.name, + }, + }); + $.export("$summary", `Successfully sent request to create field. Result: '${response.message}'`); + return response; + }, +}; diff --git a/components/aitable_ai/actions/delete-field/delete-field.mjs b/components/aitable_ai/actions/delete-field/delete-field.mjs new file mode 100644 index 0000000000000..04153ea8d7912 --- /dev/null +++ b/components/aitable_ai/actions/delete-field/delete-field.mjs @@ -0,0 +1,34 @@ +import app from "../../aitable_ai.app.mjs"; + +export default { + key: "aitable_ai-delete-field", + name: "Delete Field", + description: "Delete a field in the specified datasheet. [See the documentation](https://developers.aitable.ai/api/reference/#tag/Field/operation/delete-fields)", + version: "0.0.1", + type: "action", + props: { + app, + spaceId: { + propDefinition: [ + app, + "spaceId", + ], + }, + fieldId: { + propDefinition: [ + app, + "fieldId", + ], + }, + }, + + async run({ $ }) { + const response = await this.app.deleteField({ + $, + spaceId: this.spaceId, + fieldId: this.fieldId, + }); + $.export("$summary", `Successfully deleted the field with ID '${this.fieldId}'`); + return response; + }, +}; diff --git a/components/aitable_ai/aitable_ai.app.mjs b/components/aitable_ai/aitable_ai.app.mjs index 13a85025616ce..598c292151ff3 100644 --- a/components/aitable_ai/aitable_ai.app.mjs +++ b/components/aitable_ai/aitable_ai.app.mjs @@ -1,11 +1,121 @@ +import { axios } from "@pipedream/platform"; +import constants from "./common/constants.mjs"; + export default { type: "app", app: "aitable_ai", - propDefinitions: {}, + propDefinitions: { + spaceId: { + type: "string", + label: "Space ID", + description: "ID of the Space", + async options() { + const response = await this.getSpaces({}); + const spaceIds = response.data.spaces; + return spaceIds.map(({ + id, name, + }) => ({ + value: id, + label: name, + })); + }, + }, + fieldId: { + type: "string", + label: "Field ID", + description: "ID of the Field", + async options() { + const response = await this.getFields({}); + const fieldIds = response.data.fields; + return fieldIds.map(({ + id, name, + }) => ({ + value: id, + label: name, + })); + }, + }, + name: { + type: "string", + label: "Name", + description: "Name of the Datasheet", + }, + description: { + type: "string", + label: "Description", + description: "Description of the Datasheet", + }, + folderId: { + type: "string", + label: "Folder ID", + description: "The Folder ID is located in the `URL` when the folder is selected on the `Workbench page`, i.e.: if the URL is `https://aitable.ai/workbench/123456`, the `Folder ID` is 123456", + optional: true, + }, + type: { + type: "string", + label: "Type", + description: "Type of the Field", + options: constants.FIELD_TYPES, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + _baseUrl() { + return "https://aitable.ai/fusion/v1"; + }, + async _makeRequest(opts = {}) { + const { + $ = this, + path, + headers, + ...otherOpts + } = opts; + return axios($, { + ...otherOpts, + url: this._baseUrl() + path, + headers: { + ...headers, + Authorization: `Bearer ${this.$auth.api_token}`, + }, + }); + }, + async createDatasheet({ + spaceId, ...args + }) { + return this._makeRequest({ + path: `/spaces/${spaceId}/datasheets`, + method: "post", + ...args, + }); + }, + async createField({ + spaceId, ...args + }) { + return this._makeRequest({ + path: `/spaces/${spaceId}/datasheets/${this.$auth.datasheet_id}/fields`, + method: "post", + ...args, + }); + }, + async deleteField({ + spaceId, fieldId, ...args + }) { + return this._makeRequest({ + path: `/spaces/${spaceId}/datasheets/${this.$auth.datasheet_id}/fields/${fieldId}`, + method: "delete", + ...args, + }); + }, + async getSpaces(args = {}) { + return this._makeRequest({ + path: "/spaces", + ...args, + }); + }, + async getFields(args = {}) { + return this._makeRequest({ + path: `/datasheets/${this.$auth.datasheet_id}/fields`, + ...args, + }); }, }, -}; \ No newline at end of file +}; diff --git a/components/aitable_ai/common/constants.mjs b/components/aitable_ai/common/constants.mjs new file mode 100644 index 0000000000000..c4e7a5d13877e --- /dev/null +++ b/components/aitable_ai/common/constants.mjs @@ -0,0 +1,11 @@ +export default { + FIELD_TYPES: [ + "Text", + "URL", + "Phone", + "Email", + "WorkDoc", + "AutoNumber", + "CreatedBy", + ], +}; diff --git a/components/aitable_ai/package.json b/components/aitable_ai/package.json index cce6d9e1088a7..78fde63930a62 100644 --- a/components/aitable_ai/package.json +++ b/components/aitable_ai/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/aitable_ai", - "version": "0.0.1", + "version": "0.1.0", "description": "Pipedream AITable.ai Components", "main": "aitable_ai.app.mjs", "keywords": [ @@ -11,5 +11,8 @@ "author": "Pipedream (https://pipedream.com/)", "publishConfig": { "access": "public" + }, + "dependencies": { + "@pipedream/platform": "^3.0.3" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38e0661abe6b8..ee7bedd1daad8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -434,7 +434,10 @@ importers: moment: 2.30.1 components/aitable_ai: - specifiers: {} + specifiers: + '@pipedream/platform': ^3.0.3 + dependencies: + '@pipedream/platform': 3.0.3 components/aivoov: specifiers: