budibase/packages/server/src/middleware/trimViewRowInfo.ts

49 lines
1.2 KiB
TypeScript
Raw Normal View History

import { Ctx, Row } from "@budibase/types"
import * as utils from "../db/utils"
import sdk from "../sdk"
2023-07-31 13:17:54 +02:00
import { Next } from "koa"
import { getTableId } from "../api/controllers/row/utils"
2023-07-31 13:17:54 +02:00
export default async (ctx: Ctx<Row>, next: Next) => {
const { body } = ctx.request
let { _viewId: viewId } = body
2023-07-31 14:08:31 +02:00
const possibleViewId = getTableId(ctx)
if (utils.isViewID(possibleViewId)) {
viewId = possibleViewId
}
// nothing to do, it is not a view (just a table ID)
if (!viewId) {
return next()
}
const { tableId } = utils.extractViewInfoFromID(viewId)
// don't need to trim delete requests
2023-08-08 14:43:13 +02:00
if (ctx?.method?.toLowerCase() !== "delete") {
await trimViewFields(ctx.request.body, viewId)
}
ctx.params.sourceId = tableId
ctx.params.viewId = viewId
return next()
}
// have to mutate the koa context, can't return
export async function trimViewFields<T extends Row>(
body: Row,
viewId: string
): Promise<void> {
const view = await sdk.views.get(viewId)
const allowedKeys = sdk.views.allowedFields(view)
// have to mutate the context, can't update reference
const toBeRemoved = Object.keys(body).filter(
key => !allowedKeys.includes(key)
)
for (let removeKey of toBeRemoved) {
delete body[removeKey]
}
}