diff --git a/packages/server/middleware/controllers/model.js b/packages/server/middleware/controllers/model.js index f9b7f8b968..35c9b37fe6 100644 --- a/packages/server/middleware/controllers/model.js +++ b/packages/server/middleware/controllers/model.js @@ -61,7 +61,21 @@ exports.update = async function(ctx) { exports.destroy = async function(ctx) { const db = couchdb.db.use(ctx.params.instanceId) + const model = await db.destroy(ctx.params.modelId, ctx.params.revId); + const modelViewId = `all_${model.id}` + + // Delete all records for that model + const records = await db.view("database", modelViewId); + await db.bulk({ + docs: records.rows.map(record => ({ id: record.id, _deleted: true })) + }); + + // delete the "all" view + const designDoc = await db.get("_design/database"); + delete designDoc.views[modelViewId]; + await db.insert(designDoc, designDoc._id); + ctx.body = { message: `Model ${model.id} deleted.`, status: 200 diff --git a/packages/server/middleware/routes/neo/tests/couchTestUtils.js b/packages/server/middleware/routes/neo/tests/couchTestUtils.js index e6bcd8d181..f80f54dd3c 100644 --- a/packages/server/middleware/routes/neo/tests/couchTestUtils.js +++ b/packages/server/middleware/routes/neo/tests/couchTestUtils.js @@ -16,7 +16,20 @@ exports.createModel = async instanceId => { } ] } - const response = await couchdb.db.use(instanceId).insert(model); + const db = couchdb.db.use(instanceId); + const response = await db.insert(model); + + const designDoc = await db.get("_design/database"); + designDoc.views = { + ...designDoc.views, + [`all_${response.id}`]: { + map: function(doc) { + emit([doc.modelId], doc._id); + } + } + }; + await db.insert(designDoc, designDoc._id); + return { ...response, ...model diff --git a/packages/server/middleware/routes/neo/tests/model.spec.js b/packages/server/middleware/routes/neo/tests/model.spec.js index f296f6a923..67255e3752 100644 --- a/packages/server/middleware/routes/neo/tests/model.spec.js +++ b/packages/server/middleware/routes/neo/tests/model.spec.js @@ -93,7 +93,7 @@ describe("/models", () => { await destroyDatabase(TEST_INSTANCE_ID); }); - it("returns all the models for that instance in the response body", done => { + it("returns a success response when a model is deleted.", done => { request .delete(`/api/${TEST_INSTANCE_ID}/models/${testModel.id}/${testModel.rev}`) .set("Accept", "application/json")