@budibase/server
Version:
Budibase Web Server
50 lines (42 loc) • 1.31 kB
text/typescript
import { EMPTY_LAYOUT } from "../../constants/layouts"
import { generateLayoutID } from "../../db/utils"
import { events, context } from "@budibase/backend-core"
import {
DeleteLayoutResponse,
SaveLayoutRequest,
SaveLayoutResponse,
UserCtx,
} from "@budibase/types"
import sdk from "../../sdk"
export async function save(
ctx: UserCtx<SaveLayoutRequest, SaveLayoutResponse>
) {
const db = context.getAppDB()
let layout = ctx.request.body
if (!layout.props) {
layout = {
...EMPTY_LAYOUT,
...layout,
}
layout.props._instanceName = layout.name
}
layout._id = layout._id || generateLayoutID()
const response = await db.put(layout)
await events.layout.created(layout)
layout._rev = response.rev
ctx.body = layout
}
export async function destroy(ctx: UserCtx<void, DeleteLayoutResponse>) {
const db = context.getAppDB()
const layoutId = ctx.params.layoutId,
layoutRev = ctx.params.layoutRev
const layoutsUsedByScreens = (await sdk.screens.fetch()).map(
screen => screen.layoutId
)
if (layoutsUsedByScreens.includes(layoutId)) {
ctx.throw(400, "Cannot delete a layout that's being used by a screen")
}
await db.remove(layoutId, layoutRev)
await events.layout.deleted(layoutId)
ctx.body = { message: "Layout deleted successfully" }
}