budibase/packages/server/src/sdk/app/views/index.ts

107 lines
2.8 KiB
TypeScript

import { context, HTTPError } from "@budibase/backend-core"
import { FieldSchema, TableSchema, View, ViewV2 } from "@budibase/types"
import sdk from "../../../sdk"
import * as utils from "../../../db/utils"
export async function get(viewId: string): Promise<ViewV2 | undefined> {
const { tableId } = utils.extractViewInfoFromID(viewId)
const table = await sdk.tables.getTable(tableId)
const views = Object.values(table.views!)
return views.find(v => isV2(v) && v.id === viewId) as ViewV2 | undefined
}
export async function create(
tableId: string,
viewRequest: Omit<ViewV2, "id" | "version">
): Promise<ViewV2> {
const view: ViewV2 = {
...viewRequest,
id: utils.generateViewID(tableId),
version: 2,
}
const db = context.getAppDB()
const table = await sdk.tables.getTable(tableId)
table.views ??= {}
table.views[view.name] = view
await db.put(table)
return view
}
export async function update(tableId: string, view: ViewV2): Promise<ViewV2> {
const db = context.getAppDB()
const table = await sdk.tables.getTable(tableId)
table.views ??= {}
const existingView = Object.values(table.views).find(
v => isV2(v) && v.id === view.id
)
if (!existingView) {
throw new HTTPError(`View ${view.id} not found in table ${tableId}`, 404)
}
console.log("set to", view)
delete table.views[existingView.name]
table.views[view.name] = view
await db.put(table)
return view
}
export function isV2(view: View | ViewV2): view is ViewV2 {
return (view as ViewV2).version === 2
}
export async function remove(viewId: string): Promise<void> {
const db = context.getAppDB()
const view = await get(viewId)
const table = await sdk.tables.getTable(view?.tableId)
if (!view) {
throw new HTTPError(`View ${viewId} not found`, 404)
}
delete table.views![view?.name]
await db.put(table)
}
export function enrichSchema(view: View | ViewV2, tableSchema: TableSchema) {
if (!sdk.views.isV2(view)) {
return view
}
let schema = { ...tableSchema }
if (view.schemaUI) {
const viewOverridesEntries = Object.entries(view.schemaUI)
const viewSetsOrder = viewOverridesEntries.some(([_, v]) => v.order != null)
for (const [fieldName, schemaUI] of viewOverridesEntries) {
schema[fieldName] = {
...schema[fieldName],
...schemaUI,
order: viewSetsOrder
? schemaUI.order ?? undefined
: schema[fieldName].order,
}
}
delete view.schemaUI
}
if (view?.columns?.length) {
const pickedSchema: Record<string, FieldSchema> = {}
for (const fieldName of view.columns) {
if (!schema[fieldName]) {
continue
}
pickedSchema[fieldName] = { ...schema[fieldName] }
}
schema = pickedSchema
delete view.columns
}
return {
...view,
schema: schema,
}
}