topics data refactor

v1.18.x
Barış Soner Uşaklı 6 years ago
parent 2ee964caa2
commit b2b33ffa57

@ -108,7 +108,11 @@ module.exports = function (db, module) {
return getFromCache(); return getFromCache();
} }
db.collection('objects').find({ _key: { $in: nonCachedKeys } }, { projection: { _id: 0 } }).toArray(function (err, data) { var query = { _key: { $in: nonCachedKeys } };
if (nonCachedKeys.length === 1) {
query._key = nonCachedKeys[0];
}
db.collection('objects').find(query, { projection: { _id: 0 } }).toArray(function (err, data) {
if (err) { if (err) {
return callback(err); return callback(err);
} }

@ -133,8 +133,8 @@ Notifications.findRelated = function (mergeIds, set, callback) {
db.getObjectsFields(keys, ['mergeId'], next); db.getObjectsFields(keys, ['mergeId'], next);
}, },
function (sets, next) { function (sets, next) {
sets = sets.map(set => set.mergeId); sets = sets.map(set => String(set.mergeId));
var mergeSet = new Set(mergeIds); var mergeSet = new Set(mergeIds.map(id => String(id)));
next(null, nids.filter((nid, idx) => mergeSet.has(sets[idx]))); next(null, nids.filter((nid, idx) => mergeSet.has(sets[idx])));
}, },
], callback); ], callback);

@ -8,52 +8,14 @@ var categories = require('../categories');
var utils = require('../utils'); var utils = require('../utils');
var translator = require('../translator'); var translator = require('../translator');
function escapeTitle(topicData) { const intFields = ['tid', 'cid', 'uid', 'mainPid', 'deleted', 'locked', 'pinned'];
if (!topicData) {
return;
}
if (topicData.title) {
topicData.title = translator.escape(validator.escape(topicData.title.toString()));
}
if (topicData.titleRaw) {
topicData.titleRaw = translator.escape(topicData.titleRaw);
}
}
module.exports = function (Topics) { module.exports = function (Topics) {
Topics.getTopicField = function (tid, field, callback) {
async.waterfall([
function (next) {
db.getObjectField('topic:' + tid, field, next);
},
function (value, next) {
if (field === 'title') {
value = translator.escape(validator.escape(String(value)));
}
next(null, value);
},
], callback);
};
Topics.getTopicFields = function (tid, fields, callback) {
async.waterfall([
function (next) {
db.getObjectFields('topic:' + tid, fields, next);
},
function (topic, next) {
escapeTitle(topic);
next(null, topic);
},
], callback);
};
Topics.getTopicsFields = function (tids, fields, callback) { Topics.getTopicsFields = function (tids, fields, callback) {
if (!Array.isArray(tids) || !tids.length) { if (!Array.isArray(tids) || !tids.length) {
return callback(null, []); return callback(null, []);
} }
var keys = tids.map(function (tid) { var keys = tids.map(tid => 'topic:' + tid);
return 'topic:' + tid;
});
async.waterfall([ async.waterfall([
function (next) { function (next) {
if (fields.length) { if (fields.length) {
@ -69,53 +31,28 @@ module.exports = function (Topics) {
], callback); ], callback);
}; };
Topics.getTopicField = function (tid, field, callback) {
Topics.getTopicFields(tid, [field], function (err, topic) {
callback(err, topic ? topic[field] : null);
});
};
Topics.getTopicFields = function (tid, fields, callback) {
Topics.getTopicsFields([tid], fields, function (err, topics) {
callback(err, topics ? topics[0] : null);
});
};
Topics.getTopicData = function (tid, callback) { Topics.getTopicData = function (tid, callback) {
async.waterfall([ Topics.getTopicsFields([tid], [], function (err, topics) {
function (next) { callback(err, topics && topics.length ? topics[0] : null);
db.getObject('topic:' + tid, next); });
},
function (topic, next) {
if (!topic) {
return next(null, null);
}
modifyTopic(topic);
next(null, topic);
},
], callback);
}; };
Topics.getTopicsData = function (tids, callback) { Topics.getTopicsData = function (tids, callback) {
Topics.getTopicsFields(tids, [], callback); Topics.getTopicsFields(tids, [], callback);
}; };
function modifyTopic(topic) {
if (!topic) {
return;
}
if (topic.hasOwnProperty('title')) {
topic.titleRaw = topic.title;
topic.title = String(topic.title);
}
escapeTitle(topic);
if (topic.hasOwnProperty('timestamp')) {
topic.timestampISO = utils.toISOString(topic.timestamp);
}
if (topic.hasOwnProperty('lastposttime')) {
topic.lastposttimeISO = utils.toISOString(topic.lastposttime);
}
if (topic.hasOwnProperty('upvotes')) {
topic.upvotes = parseInt(topic.upvotes, 10) || 0;
}
if (topic.hasOwnProperty('upvotes')) {
topic.downvotes = parseInt(topic.downvotes, 10) || 0;
}
if (topic.hasOwnProperty('upvotes') && topic.hasOwnProperty('downvotes')) {
topic.votes = topic.upvotes - topic.downvotes;
}
}
Topics.getCategoryData = function (tid, callback) { Topics.getCategoryData = function (tid, callback) {
async.waterfall([ async.waterfall([
function (next) { function (next) {
@ -144,3 +81,52 @@ module.exports = function (Topics) {
db.deleteObjectFields('topic:' + tid, fields, callback); db.deleteObjectFields('topic:' + tid, fields, callback);
}; };
}; };
function escapeTitle(topicData) {
if (topicData) {
if (topicData.title) {
topicData.title = translator.escape(validator.escape(topicData.title.toString()));
}
if (topicData.titleRaw) {
topicData.titleRaw = translator.escape(topicData.titleRaw);
}
}
}
function modifyTopic(topic) {
if (!topic) {
return;
}
intFields.forEach(field => parseIntField(topic, field));
if (topic.hasOwnProperty('title')) {
topic.titleRaw = topic.title;
topic.title = String(topic.title);
}
escapeTitle(topic);
if (topic.hasOwnProperty('timestamp')) {
topic.timestampISO = utils.toISOString(topic.timestamp);
}
if (topic.hasOwnProperty('lastposttime')) {
topic.lastposttimeISO = utils.toISOString(topic.lastposttime);
}
if (topic.hasOwnProperty('upvotes')) {
topic.upvotes = parseInt(topic.upvotes, 10) || 0;
}
if (topic.hasOwnProperty('upvotes')) {
topic.downvotes = parseInt(topic.downvotes, 10) || 0;
}
if (topic.hasOwnProperty('upvotes') && topic.hasOwnProperty('downvotes')) {
topic.votes = topic.upvotes - topic.downvotes;
}
}
function parseIntField(topic, field) {
if (topic.hasOwnProperty(field)) {
topic[field] = parseInt(topic[field], 10);
}
}

@ -26,7 +26,7 @@ module.exports = function (User) {
const ignored = new Set(results.ignored); const ignored = new Set(results.ignored);
var watched = results.all.filter(function (cid) { var watched = results.all.filter(function (cid) {
return cid && !ignored.has(cid); return cid && !ignored.has(String(cid));
}); });
next(null, watched); next(null, watched);
}, },

@ -113,25 +113,23 @@ module.exports = function (User) {
}; };
function uidsToUsers(uids, uniqueUids, usersData) { function uidsToUsers(uids, uniqueUids, usersData) {
var ref = uniqueUids.reduce(function (memo, cur, idx) { var uidToUser = uniqueUids.reduce(function (memo, cur, idx) {
memo[cur] = idx; memo[cur] = usersData[idx];
return memo; return memo;
}, {}); }, {});
var users = uids.map(function (uid) { var users = uids.map(function (uid) {
const returnPayload = usersData[ref[uid]]; const returnPayload = uidToUser[uid];
if (uid > 0 && !returnPayload.uid) { if (uid > 0 && !returnPayload.uid) {
returnPayload.oldUid = parseInt(uid, 10); returnPayload.oldUid = parseInt(uid, 10);
} }
return usersData[ref[uid]]; return returnPayload;
}); });
return users; return users;
} }
function uidsToUserKeys(uids) { function uidsToUserKeys(uids) {
return uids.map(function (uid) { return uids.map(uid => 'user:' + uid);
return 'user:' + uid;
});
} }
function modifyUserData(users, fieldsToRemove, callback) { function modifyUserData(users, fieldsToRemove, callback) {

Loading…
Cancel
Save