From 7e2ecc1b3afe6044e229a25026dc8f0e21b7ce28 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 29 Aug 2023 13:35:22 +0200 Subject: [PATCH] Split between internal and external views --- packages/server/src/sdk/app/views/external.ts | 77 +++++++++++++++++++ packages/server/src/sdk/app/views/index.ts | 69 ++++------------- packages/server/src/sdk/app/views/internal.ts | 77 +++++++++++++++++++ 3 files changed, 171 insertions(+), 52 deletions(-) create mode 100644 packages/server/src/sdk/app/views/external.ts create mode 100644 packages/server/src/sdk/app/views/internal.ts diff --git a/packages/server/src/sdk/app/views/external.ts b/packages/server/src/sdk/app/views/external.ts new file mode 100644 index 0000000000..97b47fbcb5 --- /dev/null +++ b/packages/server/src/sdk/app/views/external.ts @@ -0,0 +1,77 @@ +import { ViewV2 } from "@budibase/types" +import { context, HTTPError } from "@budibase/backend-core" + +import sdk from "../../../sdk" +import * as utils from "../../../db/utils" +import { enrichSchema, isV2 } from "." + +export async function get( + viewId: string, + opts?: { enriched: boolean } +): Promise { + const { tableId } = utils.extractViewInfoFromID(viewId) + const table = await sdk.tables.getTable(tableId) + const views = Object.values(table.views!) + const found = views.find(v => isV2(v) && v.id === viewId) + if (!found) { + throw new Error("No view found") + } + if (opts?.enriched) { + return enrichSchema(found, table.schema) as ViewV2 + } else { + return found as ViewV2 + } +} + +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 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) + return view +} diff --git a/packages/server/src/sdk/app/views/index.ts b/packages/server/src/sdk/app/views/index.ts index c81fab607a..927f82cc68 100644 --- a/packages/server/src/sdk/app/views/index.ts +++ b/packages/server/src/sdk/app/views/index.ts @@ -1,64 +1,38 @@ import { RenameColumn, TableSchema, View, ViewV2 } from "@budibase/types" -import { context, db as dbCore, HTTPError } from "@budibase/backend-core" +import { db as dbCore } from "@budibase/backend-core" import { cloneDeep } from "lodash" import sdk from "../../../sdk" import * as utils from "../../../db/utils" +import { isExternalTable } from "../../../integrations/utils" + +import * as internal from "./internal" +import * as external from "./external" + +function pickApi(tableId: any) { + if (isExternalTable(tableId)) { + return external + } + return internal +} export async function get( viewId: string, opts?: { enriched: boolean } ): Promise { const { tableId } = utils.extractViewInfoFromID(viewId) - const table = await sdk.tables.getTable(tableId) - const views = Object.values(table.views!) - const found = views.find(v => isV2(v) && v.id === viewId) - if (!found) { - throw new Error("No view found") - } - if (opts?.enriched) { - return enrichSchema(found, table.schema) as ViewV2 - } else { - return found as ViewV2 - } + return pickApi(tableId).get(viewId, opts) } 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 + return pickApi(tableId).create(tableId, viewRequest) } 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 + return pickApi(tableId).update(tableId, view) } export function isV2(view: View | ViewV2): view is ViewV2 { @@ -66,17 +40,8 @@ export function isV2(view: View | ViewV2): view is ViewV2 { } 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) - return view + const { tableId } = utils.extractViewInfoFromID(viewId) + return pickApi(tableId).remove(viewId) } export function allowedFields(view: View | ViewV2) { diff --git a/packages/server/src/sdk/app/views/internal.ts b/packages/server/src/sdk/app/views/internal.ts new file mode 100644 index 0000000000..4f65d24bfa --- /dev/null +++ b/packages/server/src/sdk/app/views/internal.ts @@ -0,0 +1,77 @@ +import { ViewV2 } from "@budibase/types" +import { context, HTTPError } from "@budibase/backend-core" + +import sdk from "../../../sdk" +import * as utils from "../../../db/utils" +import { enrichSchema, isV2 } from "." + +export async function get( + viewId: string, + opts?: { enriched: boolean } +): Promise { + const { tableId } = utils.extractViewInfoFromID(viewId) + const table = await sdk.tables.getTable(tableId) + const views = Object.values(table.views!) + const found = views.find(v => isV2(v) && v.id === viewId) + if (!found) { + throw new Error("No view found") + } + if (opts?.enriched) { + return enrichSchema(found, table.schema) as ViewV2 + } else { + return found as ViewV2 + } +} + +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 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) + return view +}