feat: #10460, add cutoff to suggested topics

isekai-main
Barış Soner Uşaklı 3 years ago
parent 26511185ac
commit 799e94e02e

@ -72,10 +72,6 @@ async function searchInContent(data) {
]); ]);
} }
if (data.returnIds) {
return { pids: pids, tids: tids };
}
const mainPids = await topics.getMainPids(tids); const mainPids = await topics.getMainPids(tids);
let allPids = mainPids.concat(pids).filter(Boolean); let allPids = mainPids.concat(pids).filter(Boolean);
@ -87,6 +83,15 @@ async function searchInContent(data) {
pids: allPids, pids: allPids,
}); });
if (data.returnIds) {
const mainPidsSet = new Set(mainPids);
const mainPidToTid = _.zipObject(mainPids, tids);
const pidsSet = new Set(pids);
const returnPids = allPids.filter(pid => pidsSet.has(pid));
const returnTids = allPids.filter(pid => mainPidsSet.has(pid)).map(pid => mainPidToTid[pid]);
return { pids: returnPids, tids: returnTids };
}
const itemsPerPage = Math.min(data.itemsPerPage || 10, 100); const itemsPerPage = Math.min(data.itemsPerPage || 10, 100);
const returnData = { const returnData = {
posts: [], posts: [],

@ -9,36 +9,42 @@ const privileges = require('../privileges');
const search = require('../search'); const search = require('../search');
module.exports = function (Topics) { module.exports = function (Topics) {
Topics.getSuggestedTopics = async function (tid, uid, start, stop) { Topics.getSuggestedTopics = async function (tid, uid, start, stop, cutoff = 0) {
let tids; let tids;
tid = parseInt(tid, 10); tid = parseInt(tid, 10);
cutoff = cutoff === 0 ? cutoff : (cutoff * 2592000000);
const [tagTids, searchTids] = await Promise.all([ const [tagTids, searchTids] = await Promise.all([
getTidsWithSameTags(tid), getTidsWithSameTags(tid, cutoff),
getSearchTids(tid, uid), getSearchTids(tid, uid, cutoff),
]); ]);
tids = tagTids.concat(searchTids).filter(_tid => _tid !== tid); tids = _.uniq(tagTids.concat(searchTids));
let categoryTids = []; let categoryTids = [];
if (stop !== -1 && tids.length < stop - start + 1) { if (stop !== -1 && tids.length < stop - start + 1) {
categoryTids = await getCategoryTids(tid); categoryTids = await getCategoryTids(tid, cutoff);
} }
tids = _.shuffle(_.uniq(tids.concat(categoryTids))); tids = _.shuffle(_.uniq(tids.concat(categoryTids)));
tids = await privileges.topics.filterTids('topics:read', tids, uid); tids = await privileges.topics.filterTids('topics:read', tids, uid);
let topicData = await Topics.getTopicsByTids(tids, uid); let topicData = await Topics.getTopicsByTids(tids, uid);
topicData = topicData.filter(topic => topic && !topic.deleted && topic.tid !== tid); topicData = topicData.filter(topic => topic && topic.tid !== tid);
topicData = await user.blocks.filter(uid, topicData); topicData = await user.blocks.filter(uid, topicData);
topicData = topicData.slice(start, stop !== -1 ? stop + 1 : undefined); topicData = topicData.slice(start, stop !== -1 ? stop + 1 : undefined)
.sort((t1, t2) => t2.timestamp - t1.timestamp);
return topicData; return topicData;
}; };
async function getTidsWithSameTags(tid) { async function getTidsWithSameTags(tid, cutoff) {
const tags = await Topics.getTopicTags(tid); const tags = await Topics.getTopicTags(tid);
const tids = await db.getSortedSetRevRange(tags.map(tag => `tag:${tag}:topics`), 0, -1); let tids = cutoff === 0 ?
await db.getSortedSetRevRange(tags.map(tag => `tag:${tag}:topics`), 0, -1) :
await db.getSortedSetRevRangeByScore(tags.map(tag => `tag:${tag}:topics`), 0, -1, '+inf', Date.now() - cutoff);
tids = tids.filter(_tid => _tid !== tid); // remove self
return _.shuffle(_.uniq(tids)).slice(0, 10).map(Number); return _.shuffle(_.uniq(tids)).slice(0, 10).map(Number);
} }
async function getSearchTids(tid, uid) { async function getSearchTids(tid, uid, cutoff) {
const topicData = await Topics.getTopicFields(tid, ['title', 'cid']); const topicData = await Topics.getTopicFields(tid, ['title', 'cid']);
const data = await search.search({ const data = await search.search({
query: topicData.title, query: topicData.title,
@ -47,13 +53,18 @@ module.exports = function (Topics) {
categories: [topicData.cid], categories: [topicData.cid],
uid: uid, uid: uid,
returnIds: true, returnIds: true,
timeRange: cutoff !== 0 ? cutoff / 1000 : 0,
timeFilter: 'newer',
}); });
data.tids = data.tids.filter(_tid => _tid !== tid); // remove self
return _.shuffle(data.tids).slice(0, 10).map(Number); return _.shuffle(data.tids).slice(0, 10).map(Number);
} }
async function getCategoryTids(tid) { async function getCategoryTids(tid, cutoff) {
const cid = await Topics.getTopicField(tid, 'cid'); const cid = await Topics.getTopicField(tid, 'cid');
const tids = await db.getSortedSetRevRange(`cid:${cid}:tids:lastposttime`, 0, 9); const tids = cutoff === 0 ?
await db.getSortedSetRevRange(`cid:${cid}:tids:lastposttime`, 0, 9) :
await db.getSortedSetRevRangeByScore(`cid:${cid}:tids:lastposttime`, 0, 9, '+inf', Date.now() - cutoff);
return _.shuffle(tids.map(Number).filter(_tid => _tid !== tid)); return _.shuffle(tids.map(Number).filter(_tid => _tid !== tid));
} }
}; };

Loading…
Cancel
Save