You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.4 KiB
JavaScript
103 lines
2.4 KiB
JavaScript
|
|
'use strict';
|
|
|
|
var async = require('async');
|
|
|
|
var db = require('../database');
|
|
var user = require('../user');
|
|
|
|
module.exports = function (Topics) {
|
|
Topics.getUserBookmark = function (tid, uid, callback) {
|
|
if (!parseInt(uid, 10)) {
|
|
return callback(null, null);
|
|
}
|
|
db.sortedSetScore('tid:' + tid + ':bookmarks', uid, callback);
|
|
};
|
|
|
|
Topics.getUserBookmarks = function (tids, uid, callback) {
|
|
if (!parseInt(uid, 10)) {
|
|
return callback(null, tids.map(function () {
|
|
return null;
|
|
}));
|
|
}
|
|
db.sortedSetsScore(tids.map(function (tid) {
|
|
return 'tid:' + tid + ':bookmarks';
|
|
}), uid, callback);
|
|
};
|
|
|
|
Topics.setUserBookmark = function (tid, uid, index, callback) {
|
|
db.sortedSetAdd('tid:' + tid + ':bookmarks', index, uid, callback);
|
|
};
|
|
|
|
Topics.getTopicBookmarks = function (tid, callback) {
|
|
db.getSortedSetRangeWithScores('tid:' + tid + ':bookmarks', 0, -1, callback);
|
|
};
|
|
|
|
Topics.updateTopicBookmarks = function (tid, pids, callback) {
|
|
var minIndex;
|
|
var maxIndex;
|
|
var postIndices;
|
|
|
|
async.waterfall([
|
|
function (next) {
|
|
Topics.getPostCount(tid, next);
|
|
},
|
|
function (postcount, next) {
|
|
maxIndex = postcount;
|
|
|
|
db.sortedSetRanks('tid:' + tid + ':posts', pids, next);
|
|
},
|
|
function (indices, next) {
|
|
postIndices = indices.map(function (i) {
|
|
return i === null ? 0 : i + 1;
|
|
});
|
|
minIndex = Math.min.apply(Math, postIndices);
|
|
|
|
Topics.getTopicBookmarks(tid, next);
|
|
},
|
|
function (bookmarks, next) {
|
|
var uidData = bookmarks.map(function (bookmark) {
|
|
return {
|
|
uid: bookmark.value,
|
|
bookmark: parseInt(bookmark.score, 10),
|
|
};
|
|
}).filter(function (data) {
|
|
return data.bookmark >= minIndex;
|
|
});
|
|
|
|
async.eachLimit(uidData, 50, function (data, next) {
|
|
var bookmark = data.bookmark;
|
|
bookmark = Math.min(bookmark, maxIndex);
|
|
|
|
postIndices.forEach(function (i) {
|
|
if (i < data.bookmark) {
|
|
bookmark -= 1;
|
|
}
|
|
});
|
|
|
|
// make sure the bookmark is valid if we removed the last post
|
|
bookmark = Math.min(bookmark, maxIndex - pids.length);
|
|
|
|
if (bookmark === data.bookmark) {
|
|
return next();
|
|
}
|
|
|
|
user.getSettings(data.uid, function (err, settings) {
|
|
if (err) {
|
|
return next(err);
|
|
}
|
|
|
|
if (settings.topicPostSort === 'most_votes') {
|
|
return next();
|
|
}
|
|
|
|
Topics.setUserBookmark(tid, data.uid, bookmark, next);
|
|
});
|
|
}, next);
|
|
},
|
|
], function (err) {
|
|
callback(err);
|
|
});
|
|
};
|
|
};
|