UNPKG

@pipedream/twenty

Version:

Pipedream Twenty Components

138 lines (127 loc) 3.75 kB
import { camelCaseToWords, parseObject, } from "../../common/utils.mjs"; import twenty from "../../twenty.app.mjs"; export default { key: "twenty-create-update-delete-record", name: "Create, Update, or Delete a Record in Twenty", description: "Create, update, or delete a single record in Twenty. This action allows for dynamic handling of records based on specified action type. [See the documentation](https://api.twenty.com/docs)", version: "0.0.1", type: "action", props: { twenty, recordId: { propDefinition: [ twenty, "recordId", ], reloadProps: true, }, actionType: { propDefinition: [ twenty, "actionType", ], reloadProps: true, }, additionalProp: { type: "object", label: "Additional Prop", description: "Any additional prop you want to fill.", optional: true, }, }, async additionalProps() { const props = {}; const recordId = this.recordId; const actionType = this.actionType; if (recordId && this.actionType) { if ([ "delete", "update", ].includes(actionType)) { props.id = { type: "string", label: `${camelCaseToWords(recordId)} Id`, description: `The Id of ${recordId}`, options: async () => { const { components: { schemas }, tags, } = await this.twenty.listRecords(); const index = Object.keys(schemas).findIndex((i) => i === this.recordId); const { data } = await this.twenty.listRecordItems(tags[index + 1].name); const response = data[tags[index + 1].name]; return response.map((item) => ({ label: item.name || item.title || item.id, value: item.id, })); }, }; } if ([ "create", "update", ].includes(actionType)) { const { components: { schemas } } = await this.twenty.listRecords(); const properties = schemas[recordId].properties; const required = schemas[recordId].required || []; for (const [ key, value, ] of Object.entries(properties)) { if ( (key != "id") && (key != "createdAt") && (key != "updatedAt") && (value.type) && (value.type != "object") && (value.type != "array") ) { props[key] = { type: value["type"] === "number" ? "integer" : value["type"], label: camelCaseToWords(key), description: value["description"], optional: !(required.includes === key), }; } } } } return props; }, async run({ $ }) { const { twenty, id, recordId, actionType, additionalProp, ...data } = this; let response; const { components: { schemas }, tags, } = await this.twenty.listRecords(); const index = Object.keys(schemas).findIndex((i) => i === this.recordId); try { response = await twenty.performAction({ $, id, actionType: this.actionType, recordName: tags[index + 1].name, data: { ...data, ...(additionalProp ? parseObject(additionalProp) : {}), }, }); $.export("$summary", `Successfully performed ${actionType} ${recordId} on record with ID: ${id || response.data[`${actionType}${recordId}`].id}`); return response; } catch (error) { throw new Error(`Failed to ${actionType} record. Error: ${error.message}`); } }, };