Files
NodeBB/src/controllers/activitypub/topics.js
2024-01-16 11:20:54 -05:00

100 lines
3.1 KiB
JavaScript

'use strict';
const nconf = require('nconf');
const db = require('../../database');
const user = require('../../user');
const topics = require('../../topics');
const privileges = require('../../privileges');
const { notes } = require('../../activitypub');
// const helpers = require('../helpers');
const pagination = require('../../pagination');
const helpers = require('../helpers');
const controller = module.exports;
controller.get = async function (req, res, next) {
const pid = await notes.resolveId(req.uid, req.query.resource);
if (pid !== req.query.resource) {
return helpers.redirect(res, `/topic/remote?resource=${pid}`, true);
}
const tid = await notes.assertTopic(req.uid, req.query.resource);
let postIndex = await db.sortedSetRank(`tidRemote:${tid}:posts`, req.query.resource);
const [
userPrivileges,
settings,
// topicData,
] = await Promise.all([
privileges.topics.get(tid, req.uid),
user.getSettings(req.uid),
// topics.getTopicData(tid),
]);
const topicData = await topics.getTopicData(tid);
topicData.category = {}; // todo
let currentPage = parseInt(req.query.page, 10) || 1;
const pageCount = Math.max(1, Math.ceil((topicData && topicData.postcount) / settings.postsPerPage));
const invalidPagination = (settings.usePagination && (currentPage < 1 || currentPage > pageCount));
if (
!topicData ||
userPrivileges.disabled ||
invalidPagination// ||
// (topicData.scheduled && !userPrivileges.view_scheduled)
) {
return next();
}
if (!req.query.page) {
currentPage = calculatePageFromIndex(postIndex, settings);
}
if (settings.usePagination && req.query.page) {
const top = ((currentPage - 1) * settings.postsPerPage) + 1;
const bottom = top + settings.postsPerPage;
if (!req.params.post_index || (postIndex < top || postIndex > bottom)) {
postIndex = top;
}
}
const { start, stop } = calculateStartStop(currentPage, postIndex, settings);
topicData.posts = await notes.getTopicPosts(tid, req.uid, start, stop);
await topics.calculatePostIndices(topicData.posts, start - 1);
topicData.posts = await topics.addPostData(topicData.posts, req.uid);
topicData.privileges = userPrivileges;
await topics.increaseViewCount(req, tid);
topicData.postIndex = postIndex;
topicData.pagination = pagination.create(currentPage, pageCount, req.query);
topicData.pagination.rel.forEach((rel) => {
rel.href = `${nconf.get('url')}/topic/${topicData.slug}${rel.href}`;
res.locals.linkTags.push(rel);
});
res.render('topic', topicData);
};
// todo: expose from topic controller?
function calculatePageFromIndex(postIndex, settings) {
return 1 + Math.floor((postIndex - 1) / settings.postsPerPage);
}
// todo: expose from topic controller?
function calculateStartStop(page, postIndex, settings) {
let startSkip = 0;
if (!settings.usePagination) {
if (postIndex > 1) {
page = 1;
}
startSkip = Math.max(0, postIndex - Math.ceil(settings.postsPerPage / 2));
}
const start = ((page - 1) * settings.postsPerPage) + startSkip;
const stop = start + settings.postsPerPage - 1;
return { start: Math.max(0, start), stop: Math.max(0, stop) };
}