Files
NodeBB/src/posts/diffs.js

66 lines
1.9 KiB
JavaScript
Raw Normal View History

2018-02-16 16:41:06 -05:00
'use strict';
var async = require('async');
2018-02-16 21:22:26 -05:00
var validator = require('validator');
2018-02-16 16:41:06 -05:00
var db = require('../database');
var diff = require('diff');
module.exports = function (Posts) {
Posts.diffs = {};
Posts.diffs.exists = function (pid, callback) {
db.sortedSetCard('post:' + pid + ':diffs', function (err, numDiffs) {
return callback(err, numDiffs > 0);
});
};
2018-02-16 16:41:06 -05:00
Posts.diffs.list = function (pid, callback) {
db.getSortedSetRangeWithScores('post:' + pid + ':diffs', 0, -1, function (err, diffs) {
callback(err, diffs ? diffs.map(function (diffObj) {
return diffObj.score;
2018-02-16 21:22:26 -05:00
}).reverse() : null);
2018-02-16 16:41:06 -05:00
});
};
Posts.diffs.save = function (pid, oldContent, newContent, callback) {
db.sortedSetAdd('post:' + pid + ':diffs', Date.now(), diff.createPatch('', newContent, oldContent), callback);
};
2018-02-16 21:22:26 -05:00
Posts.diffs.load = function (pid, since, uid, callback) {
2018-02-16 16:41:06 -05:00
// Retrieves all diffs made since `since` and replays them to reconstruct what the post looked like at `since`
since = parseInt(since, 10);
if (isNaN(since) || since > Date.now()) {
return callback(new Error('[[error:invalid-data]]'));
}
async.parallel({
2018-02-16 21:22:26 -05:00
post: async.apply(Posts.getPostSummaryByPids, [pid], uid, {
parse: false,
}),
2018-02-16 16:41:06 -05:00
diffs: async.apply(db.getSortedSetRangeByScore.bind(db), 'post:' + pid + ':diffs', 0, -1, since, Date.now()),
}, function (err, data) {
if (err) {
return callback(err);
}
2018-02-16 21:22:26 -05:00
data.post = data.post[0];
data.post.content = validator.unescape(data.post.content);
2018-02-16 16:41:06 -05:00
// Replace content with re-constructed content from that point in time
data.post.content = data.diffs.reverse().reduce(function (content, diffString) {
return diff.applyPatch(content, diffString);
}, data.post.content);
// Clear editor data (as it is outdated for this content)
delete data.post.edited;
data.post.editor = null;
2018-02-16 21:22:26 -05:00
Posts.parsePost(data.post, function (err, post) {
callback(err, post);
});
2018-02-16 16:41:06 -05:00
});
};
};