diff --git a/packages/server/src/api/controllers/layout.js b/packages/server/src/api/controllers/layout.js index e9d2b3b955..78425fbbdd 100644 --- a/packages/server/src/api/controllers/layout.js +++ b/packages/server/src/api/controllers/layout.js @@ -1,5 +1,5 @@ -const CouchDB = require("../../db/client") -const { generateLayoutID } = require("../../db/utils") +const CouchDB = require("../../db") +const { generateLayoutID, getScreenParams } = require("../../db/utils") exports.save = async function(ctx) { const db = new CouchDB(ctx.user.appId) @@ -9,3 +9,24 @@ exports.save = async function(ctx) { ctx.body = await db.put(layout) ctx.status = 200 } + +exports.destroy = async function(ctx) { + const db = new CouchDB(ctx.user.appId) + const layoutId = ctx.params.layoutId, + layoutRev = ctx.params.layoutRev + + const layoutsUsedByScreens = ( + await db.allDocs( + getScreenParams(null, { + include_docs: true, + }) + ) + ).rows.map(element => element.doc.props.layoutId) + if (layoutsUsedByScreens.indexOf(layoutId) !== -1) { + ctx.throw(400, "Cannot delete a base layout") + } + + await db.remove(layoutId, layoutRev) + ctx.message = "Layout deleted successfully" + ctx.status = 200 +} diff --git a/packages/server/src/api/controllers/screen.js b/packages/server/src/api/controllers/screen.js index 42a11dbc26..f18c1d1f30 100644 --- a/packages/server/src/api/controllers/screen.js +++ b/packages/server/src/api/controllers/screen.js @@ -36,7 +36,7 @@ exports.save = async ctx => { exports.destroy = async ctx => { const db = new CouchDB(ctx.user.appId) - await db.remove(ctx.params.screenId, ctx.params.revId) + await db.remove(ctx.params.screenId, ctx.params.screenRev) ctx.message = "Screen deleted successfully" ctx.status = 200 } diff --git a/packages/server/src/api/routes/layout.js b/packages/server/src/api/routes/layout.js index 208849ab46..a903aab959 100644 --- a/packages/server/src/api/routes/layout.js +++ b/packages/server/src/api/routes/layout.js @@ -5,6 +5,12 @@ const controller = require("../controllers/layout") const router = Router() -router.post("/api/layouts", authorized(BUILDER), controller.save) +router + .post("/api/layouts", authorized(BUILDER), controller.save) + .delete( + "/api/layouts/:layoutId/:layoutRev", + authorized(BUILDER), + controller.destroy + ) module.exports = router diff --git a/packages/server/src/api/routes/screen.js b/packages/server/src/api/routes/screen.js index 7723418b95..bece56fe67 100644 --- a/packages/server/src/api/routes/screen.js +++ b/packages/server/src/api/routes/screen.js @@ -38,7 +38,7 @@ router controller.save ) .delete( - "/api/screens/:screenId/:revId", + "/api/screens/:screenId/:screenRev", authorized(BUILDER), controller.destroy ) diff --git a/packages/server/src/constants/layouts.js b/packages/server/src/constants/layouts.js index 2f1bd06dc7..f07759754f 100644 --- a/packages/server/src/constants/layouts.js +++ b/packages/server/src/constants/layouts.js @@ -1,3 +1,8 @@ +const BASE_LAYOUT_PROP_IDS = { + PRIVATE: "private-master-layout", + PUBLIC: "public-master-layout", +} + const BASE_LAYOUTS = [ { componentLibraries: ["@budibase/standard-components"], @@ -6,7 +11,7 @@ const BASE_LAYOUTS = [ stylesheets: [], name: "Main", props: { - _id: "private-master-layout", + _id: BASE_LAYOUT_PROP_IDS.PRIVATE, _component: "@budibase/standard-components/container", _children: [ { @@ -151,7 +156,7 @@ const BASE_LAYOUTS = [ stylesheets: [], name: "Unauthenticated", props: { - _id: "public-master-layout", + _id: BASE_LAYOUT_PROP_IDS.PUBLIC, _component: "@budibase/standard-components/container", _children: [ { @@ -217,4 +222,5 @@ const BASE_LAYOUTS = [ module.exports = { BASE_LAYOUTS, + BASE_LAYOUT_PROP_IDS, }