Merge pull request #14949 from Budibase/chore/refactor-finalizerow
Patch row improvements
This commit is contained in:
commit
c372d5e64e
|
@ -15,10 +15,21 @@ import {
|
|||
} from "@budibase/types"
|
||||
import * as linkRows from "../../../db/linkedRows"
|
||||
import isEqual from "lodash/isEqual"
|
||||
import { cloneDeep } from "lodash/fp"
|
||||
import { cloneDeep, merge } from "lodash/fp"
|
||||
import sdk from "../../../sdk"
|
||||
import * as pro from "@budibase/pro"
|
||||
|
||||
function mergeRows(row1: Row, row2: Row) {
|
||||
const merged = merge(row1, row2)
|
||||
// make sure any specifically undefined fields are removed
|
||||
for (const key of Object.keys(row2)) {
|
||||
if (row2[key] === undefined) {
|
||||
delete merged[key]
|
||||
}
|
||||
}
|
||||
return merged
|
||||
}
|
||||
|
||||
/**
|
||||
* This function runs through a list of enriched rows, looks at the rows which
|
||||
* are related and then checks if they need the state of their formulas
|
||||
|
@ -162,9 +173,14 @@ export async function finaliseRow(
|
|||
})
|
||||
}
|
||||
|
||||
const response = await db.put(row)
|
||||
// for response, calculate the formulas for the enriched row
|
||||
enrichedRow._rev = response.rev
|
||||
await db.put(row)
|
||||
const retrieved = await db.tryGet<Row>(row._id)
|
||||
if (!retrieved) {
|
||||
throw new Error(`Unable to retrieve row ${row._id} after saving.`)
|
||||
}
|
||||
|
||||
delete enrichedRow._rev
|
||||
enrichedRow = mergeRows(retrieved, enrichedRow)
|
||||
enrichedRow = await processFormulas(table, enrichedRow, {
|
||||
dynamic: false,
|
||||
})
|
||||
|
|
|
@ -2607,6 +2607,8 @@ if (descriptions.length) {
|
|||
name: "foo",
|
||||
description: "bar",
|
||||
tableId,
|
||||
createdAt: isInternal ? new Date().toISOString() : undefined,
|
||||
updatedAt: isInternal ? new Date().toISOString() : undefined,
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -2628,6 +2630,8 @@ if (descriptions.length) {
|
|||
id: isInternal ? undefined : expect.any(Number),
|
||||
type: isInternal ? "row" : undefined,
|
||||
[`fk_${o2mTable.name}_fk_o2m`]: isInternal ? undefined : user.id,
|
||||
createdAt: isInternal ? new Date().toISOString() : undefined,
|
||||
updatedAt: isInternal ? new Date().toISOString() : undefined,
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -2650,6 +2654,8 @@ if (descriptions.length) {
|
|||
_rev: expect.any(String),
|
||||
id: isInternal ? undefined : expect.any(Number),
|
||||
type: isInternal ? "row" : undefined,
|
||||
createdAt: isInternal ? new Date().toISOString() : undefined,
|
||||
updatedAt: isInternal ? new Date().toISOString() : undefined,
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -2729,6 +2735,8 @@ if (descriptions.length) {
|
|||
id: isInternal ? undefined : expect.any(Number),
|
||||
type: isInternal ? "row" : undefined,
|
||||
[`fk_${o2mTable.name}_fk_o2m`]: isInternal ? undefined : user.id,
|
||||
createdAt: isInternal ? new Date().toISOString() : undefined,
|
||||
updatedAt: isInternal ? new Date().toISOString() : undefined,
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -2745,15 +2753,8 @@ if (descriptions.length) {
|
|||
user: null,
|
||||
users: null,
|
||||
})
|
||||
expect(updatedRow).toEqual({
|
||||
name: "foo",
|
||||
description: "bar",
|
||||
tableId,
|
||||
_id: row._id,
|
||||
_rev: expect.any(String),
|
||||
id: isInternal ? undefined : expect.any(Number),
|
||||
type: isInternal ? "row" : undefined,
|
||||
})
|
||||
expect(updatedRow.user).toBeUndefined()
|
||||
expect(updatedRow.users).toBeUndefined()
|
||||
})
|
||||
|
||||
it("fetch all will populate the relationships", async () => {
|
||||
|
|
|
@ -102,6 +102,9 @@ function createDummyTest() {
|
|||
}
|
||||
|
||||
export function datasourceDescribe(opts: DatasourceDescribeOpts) {
|
||||
// tests that call this need a lot longer timeouts
|
||||
jest.setTimeout(120000)
|
||||
|
||||
if (process.env.DATASOURCE === "none") {
|
||||
createDummyTest()
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ export async function getDatasource(): Promise<Datasource> {
|
|||
})
|
||||
.withWaitStrategy(
|
||||
Wait.forLogMessage("DATABASE IS READY TO USE!").withStartupTimeout(
|
||||
20000
|
||||
60000
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
@ -153,10 +153,10 @@ export async function processOutputBBReference(
|
|||
}
|
||||
|
||||
export async function processOutputBBReferences(
|
||||
value: string | null | undefined,
|
||||
value: string | string[] | null | undefined,
|
||||
subtype: BBReferenceFieldSubType
|
||||
): Promise<UserReferenceInfo[] | undefined> {
|
||||
if (!value) {
|
||||
if (!value || (Array.isArray(value) && value.length === 0)) {
|
||||
return undefined
|
||||
}
|
||||
const ids =
|
||||
|
|
|
@ -29,6 +29,8 @@ import {
|
|||
import { isExternalTableID } from "../../integrations/utils"
|
||||
import {
|
||||
helpers,
|
||||
isExternalColumnName,
|
||||
isInternalColumnName,
|
||||
PROTECTED_EXTERNAL_COLUMNS,
|
||||
PROTECTED_INTERNAL_COLUMNS,
|
||||
} from "@budibase/shared-core"
|
||||
|
@ -200,14 +202,17 @@ export async function inputProcessing(
|
|||
const clonedRow = cloneDeep(row)
|
||||
const table = await getTableFromSource(source)
|
||||
|
||||
const dontCleanseKeys = ["type", "_id", "_rev", "tableId"]
|
||||
for (const [key, value] of Object.entries(clonedRow)) {
|
||||
const field = table.schema[key]
|
||||
const isBuiltinColumn = isExternalTableID(table._id!)
|
||||
? isExternalColumnName(key)
|
||||
: isInternalColumnName(key)
|
||||
// cleanse fields that aren't in the schema
|
||||
if (!field && !isBuiltinColumn) {
|
||||
delete clonedRow[key]
|
||||
}
|
||||
// field isn't found - might be a built-in column, skip over it
|
||||
if (!field) {
|
||||
if (dontCleanseKeys.indexOf(key) === -1) {
|
||||
delete clonedRow[key]
|
||||
}
|
||||
continue
|
||||
}
|
||||
// remove any formula values, they are to be generated
|
||||
|
|
|
@ -12,3 +12,7 @@ export const PROTECTED_EXTERNAL_COLUMNS = ["_id", "_rev", "tableId"] as const
|
|||
export function isInternalColumnName(name: string): boolean {
|
||||
return (PROTECTED_INTERNAL_COLUMNS as readonly string[]).includes(name)
|
||||
}
|
||||
|
||||
export function isExternalColumnName(name: string): boolean {
|
||||
return (PROTECTED_EXTERNAL_COLUMNS as readonly string[]).includes(name)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue