diff --git a/packages/server/src/sdk/app/automations/crud.ts b/packages/server/src/sdk/app/automations/crud.ts index c0f3df6f28..418da02c1c 100644 --- a/packages/server/src/sdk/app/automations/crud.ts +++ b/packages/server/src/sdk/app/automations/crud.ts @@ -1,4 +1,9 @@ -import { Automation, Webhook, WebhookActionType } from "@budibase/types" +import { + Automation, + RequiredKeys, + Webhook, + WebhookActionType, +} from "@budibase/types" import { generateAutomationID, getAutomationParams } from "../../../db/utils" import { deleteEntityMetadata } from "../../../utilities" import { MetadataTypes } from "../../../constants" @@ -76,17 +81,20 @@ export async function fetch() { include_docs: true, }) ) - return response.rows.map(row => row.doc) + return response.rows + .map(row => row.doc) + .filter(doc => !!doc) + .map(trimUnexpectedObjectFields) } export async function get(automationId: string) { const db = getDb() const result = await db.get(automationId) - return result + return trimUnexpectedObjectFields(result) } export async function create(automation: Automation) { - automation = { ...automation } + automation = trimUnexpectedObjectFields(automation) const db = getDb() // Respect existing IDs if recreating a deleted automation @@ -111,8 +119,7 @@ export async function create(automation: Automation) { } export async function update(automation: Automation) { - automation = { ...automation } - + automation = trimUnexpectedObjectFields(automation) if (!automation._id || !automation._rev) { throw new HTTPError("_id or _rev fields missing", 400) } @@ -246,3 +253,30 @@ async function checkForWebhooks({ oldAuto, newAuto }: any) { } return newAuto } + +function trimUnexpectedObjectFields(automation: T): T { + // This will ensure all the automation fields (and nothing else) is mapped to the result + const allRequired: RequiredKeys = { + _id: automation._id, + _rev: automation._rev, + definition: automation.definition, + screenId: automation.screenId, + uiTree: automation.uiTree, + appId: automation.appId, + live: automation.live, + name: automation.name, + internal: automation.internal, + type: automation.type, + disabled: automation.disabled, + testData: automation.testData, + createdAt: automation.createdAt, + updatedAt: automation.updatedAt, + } + const result = { ...allRequired } as T + for (const key in result) { + if (!Object.prototype.hasOwnProperty.call(automation, key)) { + delete result[key] + } + } + return result as T +}