mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-02-26 08:31:22 +01:00
feat: allow custom req.query.filter on /unread /recent
This commit is contained in:
@@ -30,27 +30,21 @@ helpers.noScriptErrors = async function (req, res, error, httpStatus) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
helpers.validFilters = { '': true, new: true, watched: true, unreplied: true };
|
|
||||||
|
|
||||||
helpers.terms = {
|
helpers.terms = {
|
||||||
daily: 'day',
|
daily: 'day',
|
||||||
weekly: 'week',
|
weekly: 'week',
|
||||||
monthly: 'month',
|
monthly: 'month',
|
||||||
};
|
};
|
||||||
|
|
||||||
helpers.buildQueryString = function (cid, filter, term) {
|
helpers.buildQueryString = function (query, key, value) {
|
||||||
const qs = {};
|
const queryObj = _.clone(query);
|
||||||
if (cid) {
|
if (value) {
|
||||||
qs.cid = cid;
|
queryObj[key] = value;
|
||||||
|
} else {
|
||||||
|
delete queryObj[key];
|
||||||
}
|
}
|
||||||
if (filter) {
|
delete queryObj._;
|
||||||
qs.filter = filter;
|
return Object.keys(queryObj).length ? '?' + querystring.stringify(queryObj) : '';
|
||||||
}
|
|
||||||
if (term) {
|
|
||||||
qs.term = term;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Object.keys(qs).length ? '?' + querystring.stringify(qs) : '';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
helpers.addLinkTags = function (params) {
|
helpers.addLinkTags = function (params) {
|
||||||
@@ -69,25 +63,25 @@ helpers.addLinkTags = function (params) {
|
|||||||
helpers.buildFilters = function (url, filter, query) {
|
helpers.buildFilters = function (url, filter, query) {
|
||||||
return [{
|
return [{
|
||||||
name: '[[unread:all-topics]]',
|
name: '[[unread:all-topics]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, '', query.term),
|
url: url + helpers.buildQueryString(query, 'filter', ''),
|
||||||
selected: filter === '',
|
selected: filter === '',
|
||||||
filter: '',
|
filter: '',
|
||||||
icon: 'fa-book',
|
icon: 'fa-book',
|
||||||
}, {
|
}, {
|
||||||
name: '[[unread:new-topics]]',
|
name: '[[unread:new-topics]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, 'new', query.term),
|
url: url + helpers.buildQueryString(query, 'filter', 'new'),
|
||||||
selected: filter === 'new',
|
selected: filter === 'new',
|
||||||
filter: 'new',
|
filter: 'new',
|
||||||
icon: 'fa-clock-o',
|
icon: 'fa-clock-o',
|
||||||
}, {
|
}, {
|
||||||
name: '[[unread:watched-topics]]',
|
name: '[[unread:watched-topics]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, 'watched', query.term),
|
url: url + helpers.buildQueryString(query, 'filter', 'watched'),
|
||||||
selected: filter === 'watched',
|
selected: filter === 'watched',
|
||||||
filter: 'watched',
|
filter: 'watched',
|
||||||
icon: 'fa-bell-o',
|
icon: 'fa-bell-o',
|
||||||
}, {
|
}, {
|
||||||
name: '[[unread:unreplied-topics]]',
|
name: '[[unread:unreplied-topics]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, 'unreplied', query.term),
|
url: url + helpers.buildQueryString(query, 'filter', 'unreplied'),
|
||||||
selected: filter === 'unreplied',
|
selected: filter === 'unreplied',
|
||||||
filter: 'unreplied',
|
filter: 'unreplied',
|
||||||
icon: 'fa-reply',
|
icon: 'fa-reply',
|
||||||
@@ -97,22 +91,22 @@ helpers.buildFilters = function (url, filter, query) {
|
|||||||
helpers.buildTerms = function (url, term, query) {
|
helpers.buildTerms = function (url, term, query) {
|
||||||
return [{
|
return [{
|
||||||
name: '[[recent:alltime]]',
|
name: '[[recent:alltime]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, query.filter, ''),
|
url: url + helpers.buildQueryString(query, 'term', ''),
|
||||||
selected: term === 'alltime',
|
selected: term === 'alltime',
|
||||||
term: 'alltime',
|
term: 'alltime',
|
||||||
}, {
|
}, {
|
||||||
name: '[[recent:day]]',
|
name: '[[recent:day]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, query.filter, 'daily'),
|
url: url + helpers.buildQueryString(query, 'term', 'daily'),
|
||||||
selected: term === 'day',
|
selected: term === 'day',
|
||||||
term: 'day',
|
term: 'day',
|
||||||
}, {
|
}, {
|
||||||
name: '[[recent:week]]',
|
name: '[[recent:week]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, query.filter, 'weekly'),
|
url: url + helpers.buildQueryString(query, 'term', 'weekly'),
|
||||||
selected: term === 'week',
|
selected: term === 'week',
|
||||||
term: 'week',
|
term: 'week',
|
||||||
}, {
|
}, {
|
||||||
name: '[[recent:month]]',
|
name: '[[recent:month]]',
|
||||||
url: url + helpers.buildQueryString(query.cid, query.filter, 'monthly'),
|
url: url + helpers.buildQueryString(query, 'term', 'monthly'),
|
||||||
selected: term === 'month',
|
selected: term === 'month',
|
||||||
term: 'month',
|
term: 'month',
|
||||||
}];
|
}];
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ recentController.getData = async function (req, url, sort) {
|
|||||||
const cid = req.query.cid;
|
const cid = req.query.cid;
|
||||||
const filter = req.query.filter || '';
|
const filter = req.query.filter || '';
|
||||||
|
|
||||||
if (!helpers.validFilters[filter] || (!term && req.query.term)) {
|
if (!term && req.query.term) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
term = term || 'alltime';
|
term = term || 'alltime';
|
||||||
@@ -64,7 +64,7 @@ recentController.getData = async function (req, url, sort) {
|
|||||||
data.showSelect = isPrivileged;
|
data.showSelect = isPrivileged;
|
||||||
data.showTopicTools = isPrivileged;
|
data.showTopicTools = isPrivileged;
|
||||||
data.categories = categoryData.categories;
|
data.categories = categoryData.categories;
|
||||||
data.allCategoriesUrl = url + helpers.buildQueryString('', filter, '');
|
data.allCategoriesUrl = url + helpers.buildQueryString(req.query, 'cid', '');
|
||||||
data.selectedCategory = categoryData.selectedCategory || null;
|
data.selectedCategory = categoryData.selectedCategory || null;
|
||||||
data.selectedCids = categoryData.selectedCids;
|
data.selectedCids = categoryData.selectedCids;
|
||||||
data['feeds:disableRSS'] = meta.config['feeds:disableRSS'] || 0;
|
data['feeds:disableRSS'] = meta.config['feeds:disableRSS'] || 0;
|
||||||
@@ -79,7 +79,7 @@ recentController.getData = async function (req, url, sort) {
|
|||||||
data.terms = helpers.buildTerms(url, term, req.query);
|
data.terms = helpers.buildTerms(url, term, req.query);
|
||||||
data.selectedTerm = data.terms.find(term => term && term.selected);
|
data.selectedTerm = data.terms.find(term => term && term.selected);
|
||||||
|
|
||||||
var pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage));
|
const pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage));
|
||||||
data.pagination = pagination.create(page, pageCount, req.query);
|
data.pagination = pagination.create(page, pageCount, req.query);
|
||||||
helpers.addLinkTags({ url: url, res: req.res, tags: data.pagination.rel });
|
helpers.addLinkTags({ url: url, res: req.res, tags: data.pagination.rel });
|
||||||
|
|
||||||
|
|||||||
@@ -14,14 +14,10 @@ const helpers = require('./helpers');
|
|||||||
|
|
||||||
const unreadController = module.exports;
|
const unreadController = module.exports;
|
||||||
|
|
||||||
unreadController.get = async function (req, res, next) {
|
unreadController.get = async function (req, res) {
|
||||||
const cid = req.query.cid;
|
const cid = req.query.cid;
|
||||||
const filter = req.query.filter || '';
|
const filter = req.query.filter || '';
|
||||||
|
|
||||||
const filterData = await plugins.fireHook('filter:unread.getValidFilters', { filters: { ...helpers.validFilters } });
|
|
||||||
if (!filterData.filters[filter]) {
|
|
||||||
return next();
|
|
||||||
}
|
|
||||||
const [watchedCategories, userSettings, isPrivileged] = await Promise.all([
|
const [watchedCategories, userSettings, isPrivileged] = await Promise.all([
|
||||||
getWatchedCategories(req.uid, cid, filter),
|
getWatchedCategories(req.uid, cid, filter),
|
||||||
user.getSettings(req.uid),
|
user.getSettings(req.uid),
|
||||||
@@ -52,7 +48,7 @@ unreadController.get = async function (req, res, next) {
|
|||||||
data.showSelect = true;
|
data.showSelect = true;
|
||||||
data.showTopicTools = isPrivileged;
|
data.showTopicTools = isPrivileged;
|
||||||
data.categories = watchedCategories.categories;
|
data.categories = watchedCategories.categories;
|
||||||
data.allCategoriesUrl = 'unread' + helpers.buildQueryString('', filter, '');
|
data.allCategoriesUrl = 'unread' + helpers.buildQueryString(req.query, 'cid', '');
|
||||||
data.selectedCategory = watchedCategories.selectedCategory;
|
data.selectedCategory = watchedCategories.selectedCategory;
|
||||||
data.selectedCids = watchedCategories.selectedCids;
|
data.selectedCids = watchedCategories.selectedCids;
|
||||||
if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/unread') || req.originalUrl.startsWith(nconf.get('relative_path') + '/unread')) {
|
if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/unread') || req.originalUrl.startsWith(nconf.get('relative_path') + '/unread')) {
|
||||||
@@ -81,10 +77,6 @@ async function getWatchedCategories(uid, cid, filter) {
|
|||||||
unreadController.unreadTotal = async function (req, res, next) {
|
unreadController.unreadTotal = async function (req, res, next) {
|
||||||
const filter = req.query.filter || '';
|
const filter = req.query.filter || '';
|
||||||
try {
|
try {
|
||||||
const data = await plugins.fireHook('filter:unread.getValidFilters', { filters: { ...helpers.validFilters } });
|
|
||||||
if (!data.filters[filter]) {
|
|
||||||
return next();
|
|
||||||
}
|
|
||||||
const unreadCount = await topics.getTotalUnread(req.uid, filter);
|
const unreadCount = await topics.getTotalUnread(req.uid, filter);
|
||||||
res.json(unreadCount);
|
res.json(unreadCount);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ module.exports = function (Topics) {
|
|||||||
tidsByFilter: data.tidsByFilter,
|
tidsByFilter: data.tidsByFilter,
|
||||||
cid: params.cid,
|
cid: params.cid,
|
||||||
filter: params.filter,
|
filter: params.filter,
|
||||||
|
query: params.query || {},
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user