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

45 lines
1.2 KiB
TypeScript
Raw Normal View History

2024-08-28 13:16:22 +02:00
import { Ctx, Row, ViewV2 } from "@budibase/types"
2024-08-28 12:41:42 +02:00
import sdk from "../sdk"
2023-07-31 13:17:54 +02:00
import { Next } from "koa"
2024-08-28 12:17:25 +02:00
import { getSourceId } from "../api/controllers/row/utils"
2024-08-28 13:16:22 +02:00
export default async (ctx: Ctx<Row, Row>, next: Next) => {
const { body } = ctx.request
2024-08-28 12:41:42 +02:00
const viewId = getSourceId(ctx).viewId ?? body._viewId
// nothing to do, it is not a view (just a table ID)
if (!viewId) {
return next()
}
// don't need to trim delete requests
2024-08-28 13:16:22 +02:00
const trimFields = ctx?.method?.toLowerCase() !== "delete"
if (!trimFields) {
return next()
}
2024-08-28 13:16:22 +02:00
const view = await sdk.views.get(viewId)
ctx.request.body = await trimNonViewFields(ctx.request.body, view, "WRITE")
await next()
ctx.body = await trimNonViewFields(ctx.body, view, "READ")
}
// have to mutate the koa context, can't return
2024-08-28 10:33:22 +02:00
async function trimNonViewFields(
2024-08-28 13:16:22 +02:00
row: Row,
view: ViewV2,
permission: "WRITE" | "READ"
): Promise<Row> {
row = { ...row }
const allowedKeys = sdk.views.allowedFields(view, permission)
// have to mutate the context, can't update reference
2024-08-28 13:16:22 +02:00
const toBeRemoved = Object.keys(row).filter(key => !allowedKeys.includes(key))
for (let removeKey of toBeRemoved) {
2024-08-28 13:16:22 +02:00
delete row[removeKey]
}
2024-08-28 13:16:22 +02:00
return row
}