diff --git a/packages/server/src/api/controllers/row/external.ts b/packages/server/src/api/controllers/row/external.ts index 601f47b511..18c88923e0 100644 --- a/packages/server/src/api/controllers/row/external.ts +++ b/packages/server/src/api/controllers/row/external.ts @@ -57,9 +57,7 @@ export async function patch(ctx: UserCtx) { throw { validation: validateResult.errors } } - const beforeRow = await sdk.rows.external.getRow(tableId, _id, { - relationships: true, - }) + const beforeRow = await sdk.rows.external.find(tableId, _id) const response = await handleRequest(Operation.UPDATE, tableId, { id: breakRowIdField(_id), @@ -69,9 +67,7 @@ export async function patch(ctx: UserCtx) { // The id might have been changed, so the refetching would fail. Recalculating the id just in case const updatedId = generateIdForRow({ ...beforeRow, ...dataToUpdate }, table) || _id - const row = await sdk.rows.external.getRow(tableId, updatedId, { - relationships: true, - }) + const row = await sdk.rows.external.find(tableId, updatedId) const [enrichedRow, oldRow] = await Promise.all([ outputProcessing(table, row, { @@ -92,25 +88,6 @@ export async function patch(ctx: UserCtx) { } } -export async function find(ctx: UserCtx): Promise { - const id = ctx.params.rowId - const tableId = utils.getTableId(ctx) - const row = await sdk.rows.external.getRow(tableId, id, { - relationships: true, - }) - - if (!row) { - ctx.throw(404) - } - - const table = await sdk.tables.getTable(tableId) - // Preserving links, as the outputProcessing does not support external rows yet and we don't need it in this use case - return await outputProcessing(table, row, { - squash: true, - preserveLinks: true, - }) -} - export async function destroy(ctx: UserCtx) { const tableId = utils.getTableId(ctx) const _id = ctx.request.body._id diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index 760b73f404..f3165f7f86 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -117,7 +117,9 @@ export async function fetch(ctx: any) { export async function find(ctx: UserCtx) { const tableId = utils.getTableId(ctx) - ctx.body = await pickApi(tableId).find(ctx) + const rowId = ctx.params.rowId + + ctx.body = await sdk.rows.find(tableId, rowId) } function isDeleteRows(input: any): input is DeleteRows { @@ -278,7 +280,8 @@ export async function downloadAttachment(ctx: UserCtx) { const { columnName } = ctx.params const tableId = utils.getTableId(ctx) - const row = await pickApi(tableId).find(ctx) + const rowId = ctx.params.rowId + const row = await sdk.rows.find(tableId, rowId) const table = await sdk.tables.getTable(tableId) const columnSchema = table.schema[columnName] diff --git a/packages/server/src/api/controllers/row/internal.ts b/packages/server/src/api/controllers/row/internal.ts index fe09526c33..b2982a3542 100644 --- a/packages/server/src/api/controllers/row/internal.ts +++ b/packages/server/src/api/controllers/row/internal.ts @@ -96,15 +96,6 @@ export async function patch(ctx: UserCtx) { return { ...result, oldRow } } -export async function find(ctx: UserCtx): Promise { - const tableId = utils.getTableId(ctx), - rowId = ctx.params.rowId - const table = await sdk.tables.getTable(tableId) - let row = await utils.findRow(tableId, rowId) - row = await outputProcessing(table, row) - return row -} - export async function destroy(ctx: UserCtx) { const db = context.getAppDB() const tableId = utils.getTableId(ctx) diff --git a/packages/server/src/sdk/app/rows/external.ts b/packages/server/src/sdk/app/rows/external.ts index 7ad5ea37ff..dc1e368f41 100644 --- a/packages/server/src/sdk/app/rows/external.ts +++ b/packages/server/src/sdk/app/rows/external.ts @@ -9,7 +9,7 @@ import { import cloneDeep from "lodash/fp/cloneDeep" import isEqual from "lodash/fp/isEqual" -export async function getRow( +async function getRow( tableId: string, rowId: string, opts?: { relationships?: boolean } @@ -53,7 +53,7 @@ export async function save( const rowId = response.row._id if (rowId) { - const row = await sdk.rows.external.getRow(tableId, rowId, { + const row = await getRow(tableId, rowId, { relationships: true, }) return { @@ -67,3 +67,16 @@ export async function save( return response } } + +export async function find(tableId: string, rowId: string): Promise { + const row = await getRow(tableId, rowId, { + relationships: true, + }) + + const table = await sdk.tables.getTable(tableId) + // Preserving links, as the outputProcessing does not support external rows yet and we don't need it in this use case + return await outputProcessing(table, row, { + squash: true, + preserveLinks: true, + }) +} diff --git a/packages/server/src/sdk/app/rows/internal.ts b/packages/server/src/sdk/app/rows/internal.ts index 14e771b36e..c21d3465a7 100644 --- a/packages/server/src/sdk/app/rows/internal.ts +++ b/packages/server/src/sdk/app/rows/internal.ts @@ -1,10 +1,15 @@ -import { db } from "@budibase/backend-core" +import { context, 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 { + inputProcessing, + outputProcessing, +} from "../../../utilities/rowProcessor" import * as linkRows from "../../../db/linkedRows" +import { InternalTables } from "../../../db/utils" +import { getFullUser } from "../../../utilities/users" export async function save( tableId: string, @@ -47,3 +52,26 @@ export async function save( updateFormula: true, }) } + +export async function find(tableId: string, rowId: string): Promise { + const table = await sdk.tables.getTable(tableId) + let row = await findRow(tableId, rowId) + + row = await outputProcessing(table, row) + return row +} + +async function findRow(tableId: string, rowId: string) { + const db = context.getAppDB() + let row: Row + // TODO remove special user case in future + if (tableId === InternalTables.USER_METADATA) { + row = await getFullUser(rowId) + } else { + row = await db.get(rowId) + } + if (row.tableId !== tableId) { + throw "Supplied tableId does not match the rows tableId" + } + return row +} diff --git a/packages/server/src/sdk/app/rows/rows.ts b/packages/server/src/sdk/app/rows/rows.ts index bfd84a715c..ef03210800 100644 --- a/packages/server/src/sdk/app/rows/rows.ts +++ b/packages/server/src/sdk/app/rows/rows.ts @@ -34,3 +34,7 @@ export async function save( ) { return pickApi(tableId).save(tableId, row, userId) } + +export async function find(tableId: string, rowId: string) { + return pickApi(tableId).find(tableId, rowId) +}