diff --git a/packages/server/src/api/controllers/view/viewsV2.ts b/packages/server/src/api/controllers/view/viewsV2.ts index 94e53e52fb..85b6bd2486 100644 --- a/packages/server/src/api/controllers/view/viewsV2.ts +++ b/packages/server/src/api/controllers/view/viewsV2.ts @@ -1,5 +1,10 @@ import sdk from "../../../sdk" -import { CreateViewRequest, Ctx, ViewResponse } from "@budibase/types" +import { + CreateViewRequest, + Ctx, + UpdateViewRequest, + ViewResponse, +} from "@budibase/types" export async function create(ctx: Ctx) { const view = ctx.request.body @@ -12,6 +17,21 @@ export async function create(ctx: Ctx) { } } +export async function update(ctx: Ctx) { + const view = ctx.request.body + + if (view.version !== 2) { + ctx.throw(400, "Only views V2 can be updated") + } + + const { tableId } = view + + const result = await sdk.views.update(tableId, view) + ctx.body = { + data: result, + } +} + export async function remove(ctx: Ctx) { const { viewId } = ctx.params diff --git a/packages/server/src/api/routes/view.ts b/packages/server/src/api/routes/view.ts index f8ae4abf0d..e5f2fc95db 100644 --- a/packages/server/src/api/routes/view.ts +++ b/packages/server/src/api/routes/view.ts @@ -13,6 +13,11 @@ router authorized(permissions.BUILDER), viewController.v2.create ) + .put( + `/api/v2/views`, + authorized(permissions.BUILDER), + viewController.v2.update + ) .delete( `/api/v2/views/:viewId`, authorized(permissions.BUILDER), diff --git a/packages/server/src/sdk/app/views/index.ts b/packages/server/src/sdk/app/views/index.ts index 17691c999d..5bd38cf2b2 100644 --- a/packages/server/src/sdk/app/views/index.ts +++ b/packages/server/src/sdk/app/views/index.ts @@ -33,6 +33,24 @@ export async function create( 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) + } + + 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 } diff --git a/packages/types/src/api/web/app/view.ts b/packages/types/src/api/web/app/view.ts index e5c5855c1b..6b516c0314 100644 --- a/packages/types/src/api/web/app/view.ts +++ b/packages/types/src/api/web/app/view.ts @@ -5,3 +5,5 @@ export interface ViewResponse { } export type CreateViewRequest = Omit + +export type UpdateViewRequest = ViewV2