diff --git a/lib/routes/_pages.js b/lib/routes/_pages.js index 671cc593..5467e5b5 100644 --- a/lib/routes/_pages.js +++ b/lib/routes/_pages.js @@ -120,7 +120,7 @@ let route = _.bindAll({ * @param {Object} res */ patchMeta(req, res) { - responses.expectJSON(() => metaController.patchMeta(req.uri, req.body), res); + responses.expectJSON(() => metaController.patchMeta(req.uri, req.body, res.locals), res); } }, [ 'post', diff --git a/lib/services/metadata.js b/lib/services/metadata.js index 506ea571..468f97b9 100644 --- a/lib/services/metadata.js +++ b/lib/services/metadata.js @@ -224,16 +224,33 @@ function putMeta(uri, data) { * * @param {String} uri * @param {Object} data + * @param {Object} locals * @returns {Promise} */ -function patchMeta(uri, data) { +function patchMeta(uri = '', data = {}, locals = {}) { const id = replaceVersion(uri.replace('/meta', '')); + if (data.shouldPatchArchive) addArchiveEvent(data, locals.user); + return db.patchMeta(id, data) .then(() => getMeta(uri)) .then(pubToBus(id)); } +/** + * Adds the archive events to the metadata history. + * @param {Object} data + * @param {Object} user + * @returns {void} + */ +function addArchiveEvent(data, user = {}) { + const action = data.archived ? 'archive' : 'unarchive', + historyEntry = { action, timestamp: new Date().toISOString(), users: [userOrRobot(user)] }; + + data.history.push(historyEntry); + delete data.shouldPatchArchive; +} + /** * Check metadata property or properties for truthy values. * Returns true if all properties have truthy values. diff --git a/lib/services/metadata.test.js b/lib/services/metadata.test.js index 25f3dc06..c153a7b4 100644 --- a/lib/services/metadata.test.js +++ b/lib/services/metadata.test.js @@ -69,13 +69,53 @@ describe(_.startCase(filename), function () { db.patchMeta.returns(Promise.resolve()); db.getMeta.returns(Promise.resolve()); - return fn('domain.com/_pages/id/meta', {}) + return fn('domain.com/_pages/id/meta', {}, {}) .then(() => { sinon.assert.calledWith(db.patchMeta, 'domain.com/_pages/id', {}); sinon.assert.calledWith(db.getMeta, 'domain.com/_pages/id'); sinon.assert.calledOnce(bus.publish); }); }); + + it('adds archive event to history if specified', function () { + const data = { + history: [], + archived: true, + shouldPatchArchive: true + }; + + db.patchMeta.returns(Promise.resolve()); + db.getMeta.returns(Promise.resolve()); + + return fn('domain.com/_pages/id/meta', data, {}) + .then(() => { + const item = data.history[0]; + + expect(data.history).length(1); + expect(data.shouldPatchArchive).to.be.undefined; + expect(item.action).to.equal('archive'); + }); + }); + + it('adds unarchive event to history if specified', function () { + const data = { + history: [], + archived: false, + shouldPatchArchive: true + }; + + db.patchMeta.returns(Promise.resolve()); + db.getMeta.returns(Promise.resolve()); + + return fn('domain.com/_pages/id/meta', data, {}) + .then(() => { + const item = data.history[0]; + + expect(data.history).length(1); + expect(data.shouldPatchArchive).to.be.undefined; + expect(item.action).to.equal('unarchive'); + }); + }); }); describe('createPage', function () {