feat: closes #9845, sort by views

isekai-main
Barış Soner Uşaklı 3 years ago
parent aa370310a1
commit 6399b42826

@ -180,6 +180,7 @@
"newest_to_oldest": "Newest to Oldest",
"most_votes": "Most Votes",
"most_posts": "Most Posts",
"most_views": "Most Views",
"stale.title": "Create new topic instead?",
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",

@ -39,6 +39,7 @@ module.exports = function (Categories) {
`cid:${cid}:tids:pinned`,
`cid:${cid}:tids:posts`,
`cid:${cid}:tids:votes`,
`cid:${cid}:tids:views`,
`cid:${cid}:tids:lastposttime`,
`cid:${cid}:recent_tids`,
`cid:${cid}:pids`,

@ -100,6 +100,8 @@ module.exports = function (Categories) {
set = `cid:${cid}:tids:posts`;
} else if (sort === 'most_votes') {
set = `cid:${cid}:tids:votes`;
} else if (sort === 'most_views') {
set = `cid:${cid}:tids:views`;
}
if (data.tag) {
@ -123,7 +125,7 @@ module.exports = function (Categories) {
Categories.getSortedSetRangeDirection = async function (sort) {
sort = sort || 'newest_to_oldest';
const direction = sort === 'newest_to_oldest' || sort === 'most_posts' || sort === 'most_votes' ? 'highest-to-lowest' : 'lowest-to-highest';
const direction = ['newest_to_oldest', 'most_posts', 'most_votes', 'most_views'].includes(sort) ? 'highest-to-lowest' : 'lowest-to-highest';
const result = await plugins.hooks.fire('filter:categories.getSortedSetRangeDirection', {
sort: sort,
direction: direction,

@ -60,6 +60,7 @@ module.exports = function (Topics) {
'topics:views', 'topics:posts', 'topics:votes',
`cid:${topicData.cid}:tids:votes`,
`cid:${topicData.cid}:tids:posts`,
`cid:${topicData.cid}:tids:views`,
], 0, topicData.tid),
user.addTopicIdToUser(topicData.uid, topicData.tid, timestamp),
db.incrObjectField(`category:${topicData.cid}`, 'topic_count'),

@ -125,6 +125,7 @@ module.exports = function (Topics) {
`cid:${topicData.cid}:tids:posts`,
`cid:${topicData.cid}:tids:lastposttime`,
`cid:${topicData.cid}:tids:votes`,
`cid:${topicData.cid}:tids:views`,
`cid:${topicData.cid}:recent_tids`,
`cid:${topicData.cid}:uid:${topicData.uid}:tids`,
`uid:${topicData.uid}:topics`,

@ -208,12 +208,13 @@ module.exports = function (Topics) {
};
Topics.increaseViewCount = async function (tid) {
incrementFieldAndUpdateSortedSet(tid, 'viewcount', 1, 'topics:views');
const cid = await Topics.getTopicField(tid, 'cid');
incrementFieldAndUpdateSortedSet(tid, 'viewcount', 1, ['topics:views', `cid:${cid}:tids:views`]);
};
async function incrementFieldAndUpdateSortedSet(tid, field, by, set) {
const value = await db.incrObjectFieldBy(`topic:${tid}`, field, by);
await db.sortedSetAdd(set, value, tid);
await db[Array.isArray(set) ? 'sortedSetsAdd' : 'sortedSetAdd'](set, value, tid);
}
Topics.getTitleByPid = async function (pid) {

@ -54,6 +54,7 @@ Scheduled.pin = async function (tid, topicData) {
`cid:${topicData.cid}:tids`,
`cid:${topicData.cid}:tids:posts`,
`cid:${topicData.cid}:tids:votes`,
`cid:${topicData.cid}:tids:views`,
], tid),
]);
};
@ -80,6 +81,7 @@ function unpin(tid, topicData) {
[`cid:${topicData.cid}:tids`, topicData.lastposttime, tid],
[`cid:${topicData.cid}:tids:posts`, topicData.postcount, tid],
[`cid:${topicData.cid}:tids:votes`, parseInt(topicData.votes, 10) || 0, tid],
[`cid:${topicData.cid}:tids:views`, topicData.viewcount, tid],
]),
];
}

@ -118,6 +118,7 @@ module.exports = function (Topics) {
old: sortOld,
posts: sortPopular,
votes: sortVotes,
views: sortViews,
};
const sortFn = sortMap[params.sort] || sortRecent;
@ -156,6 +157,10 @@ module.exports = function (Topics) {
return b.viewcount - a.viewcount;
}
function sortViews(a, b) {
return b.viewcount - a.viewcount;
}
async function filterTids(tids, params) {
const { filter } = params;
const { uid } = params;

@ -173,6 +173,7 @@ module.exports = function (Topics) {
`cid:${topicData.cid}:tids`,
`cid:${topicData.cid}:tids:posts`,
`cid:${topicData.cid}:tids:votes`,
`cid:${topicData.cid}:tids:views`,
], tid));
} else {
promises.push(db.sortedSetRemove(`cid:${topicData.cid}:tids:pinned`, tid));
@ -181,6 +182,7 @@ module.exports = function (Topics) {
[`cid:${topicData.cid}:tids`, topicData.lastposttime, tid],
[`cid:${topicData.cid}:tids:posts`, topicData.postcount, tid],
[`cid:${topicData.cid}:tids:votes`, parseInt(topicData.votes, 10) || 0, tid],
[`cid:${topicData.cid}:tids:views`, topicData.viewcount, tid],
]));
topicData.pinExpiry = undefined;
topicData.pinExpiryISO = undefined;
@ -243,6 +245,7 @@ module.exports = function (Topics) {
`cid:${topicData.cid}:tids:pinned`,
`cid:${topicData.cid}:tids:posts`,
`cid:${topicData.cid}:tids:votes`,
`cid:${topicData.cid}:tids:views`,
`cid:${topicData.cid}:tids:lastposttime`,
`cid:${topicData.cid}:recent_tids`,
`cid:${topicData.cid}:uid:${topicData.uid}:tids`,
@ -263,6 +266,7 @@ module.exports = function (Topics) {
bulk.push([`cid:${cid}:tids`, topicData.lastposttime, tid]);
bulk.push([`cid:${cid}:tids:posts`, topicData.postcount, tid]);
bulk.push([`cid:${cid}:tids:votes`, votes, tid]);
bulk.push([`cid:${cid}:tids:views`, topicData.viewcount, tid]);
}
await db.sortedSetAddBulk(bulk);

@ -0,0 +1,23 @@
'use strict';
const db = require('../../database');
const batch = require('../../batch');
const topics = require('../../topics');
module.exports = {
name: 'Category topics sorted sets by views',
timestamp: Date.UTC(2021, 8, 28),
method: async function () {
const { progress } = this;
await batch.processSortedSet('topics:tid', async (tids) => {
let topicData = await topics.getTopicsData(tids);
topicData = topicData.filter(t => t && t.cid);
await db.sortedSetAddBulk(topicData.map(t => ([`cid:${t.cid}:tids:views`, t.viewcount || 0, t.tid])));
progress.incr(tids.length);
}, {
batch: 500,
progress: progress,
});
},
};
Loading…
Cancel
Save