diff --git a/lib/cradle/database/documents.js b/lib/cradle/database/documents.js index 2dc706e..250972b 100644 --- a/lib/cradle/database/documents.js +++ b/lib/cradle/database/documents.js @@ -235,3 +235,40 @@ Database.prototype.remove = function (id, rev) { remove(); }; + +Database.prototype.purge = function(id, rev) { + var that = this, doc, args = new(Args)(arguments); + function purge() { + var body = {}; + body[id] = [rev]; + that.query({ + method: 'POST', + path: '_purge', + body: body + }, function (err, res) { + if (! err) { that.cache.purge(id); } + args.callback(err, res); + }); + } + + if (typeof(rev) !== 'string') { + if (doc = this.cache.get(id)) { + rev = doc._rev; + } + else { + return this.get(id, function (err, _doc) { + if (err) { + return args.callback(err); + } + else if (!_doc._rev) { + return args.callback(new Error('No _rev found for ' + id)); + } + + rev = _doc._rev; + purge(); + }); + } + } + + purge(); +}; diff --git a/test/database-test.js b/test/database-test.js index 64cf135..2877d51 100644 --- a/test/database-test.js +++ b/test/database-test.js @@ -196,8 +196,20 @@ function shouldQueryCouch(name) { return promise; }, "returns a 200": macros.status(200) - } - } + }, + "purging a document (PURGE)": { + topic: function (db) { + var promise = new(events.EventEmitter); + db.get('deleteme', function (e, res) { + db.purge('deleteme', res.rev, function (e, res) { + promise.emit('success', res); + }); + }); + return promise; + }, + "returns a 200": macros.status(200) + }, + }; } var cradle = require('../lib/cradle');