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 { 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 ): Promise { 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 { 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 { 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 = {} for (const fieldName of view.columns) { if (!schema[fieldName]) { continue } pickedSchema[fieldName] = { ...schema[fieldName] } } schema = pickedSchema delete view.columns } return { ...view, schema: schema, } }