50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { db } from "@budibase/backend-core"
|
|
import { Row } from "@budibase/types"
|
|
import sdk from "../../../sdk"
|
|
import cloneDeep from "lodash/fp/cloneDeep"
|
|
import { finaliseRow } from "../../../api/controllers/row/staticFormula"
|
|
import { inputProcessing } from "../../../utilities/rowProcessor"
|
|
import * as linkRows from "../../../db/linkedRows"
|
|
|
|
export async function save(
|
|
tableId: string,
|
|
inputs: Row,
|
|
userId: string | undefined
|
|
) {
|
|
inputs.tableId = tableId
|
|
|
|
if (!inputs._rev && !inputs._id) {
|
|
inputs._id = db.generateRowID(inputs.tableId)
|
|
}
|
|
|
|
// this returns the table and row incase they have been updated
|
|
const dbTable = await sdk.tables.getTable(inputs.tableId)
|
|
|
|
// need to copy the table so it can be differenced on way out
|
|
const tableClone = cloneDeep(dbTable)
|
|
|
|
let { table, row } = await inputProcessing(userId, tableClone, inputs)
|
|
|
|
const validateResult = await sdk.rows.utils.validate({
|
|
row,
|
|
table,
|
|
})
|
|
|
|
if (!validateResult.valid) {
|
|
throw { validation: validateResult.errors }
|
|
}
|
|
|
|
// make sure link rows are up-to-date
|
|
row = (await linkRows.updateLinks({
|
|
eventType: linkRows.EventType.ROW_SAVE,
|
|
row,
|
|
tableId: row.tableId,
|
|
table,
|
|
})) as Row
|
|
|
|
return finaliseRow(table, row, {
|
|
oldTable: dbTable,
|
|
updateFormula: true,
|
|
})
|
|
}
|