mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-27 17:16:14 +01:00
perf: don't load thumbs if disabled globally, cache thumb results
This commit is contained in:
@@ -145,13 +145,14 @@ Topics.getTopicsByTids = async function (tids, options) {
|
|||||||
|
|
||||||
// Note: Backwards compatibility with old thumb logic, remove in v1.17.0
|
// Note: Backwards compatibility with old thumb logic, remove in v1.17.0
|
||||||
function restoreThumbValue(topic) {
|
function restoreThumbValue(topic) {
|
||||||
if (topic.thumb && !topic.thumbs.length) {
|
const isArray = Array.isArray(topic.thumbs);
|
||||||
|
if (isArray && !topic.thumbs.length && topic.thumb) {
|
||||||
topic.thumbs = [{
|
topic.thumbs = [{
|
||||||
id: topic.tid,
|
id: topic.tid,
|
||||||
name: path.basename(topic.thumb),
|
name: path.basename(topic.thumb),
|
||||||
url: topic.thumb,
|
url: topic.thumb,
|
||||||
}];
|
}];
|
||||||
} else if (topic.thumbs.length) {
|
} else if (isArray && topic.thumbs.length) {
|
||||||
topic.thumb = topic.thumbs[0].url;
|
topic.thumb = topic.thumbs[0].url;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ const db = require('../database');
|
|||||||
const file = require('../file');
|
const file = require('../file');
|
||||||
const plugins = require('../plugins');
|
const plugins = require('../plugins');
|
||||||
const posts = require('../posts');
|
const posts = require('../posts');
|
||||||
|
const meta = require('../meta');
|
||||||
|
const cache = require('../cache');
|
||||||
|
|
||||||
const Thumbs = {};
|
const Thumbs = module.exports;
|
||||||
module.exports = Thumbs;
|
|
||||||
|
|
||||||
|
|
||||||
Thumbs.exists = async function (tid, path) {
|
Thumbs.exists = async function (tid, path) {
|
||||||
// TODO: tests
|
// TODO: tests
|
||||||
@@ -27,18 +27,33 @@ Thumbs.get = async function (tids) {
|
|||||||
singular = true;
|
singular = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!meta.config.allowTopicsThumbnail) {
|
||||||
|
return singular ? null : tids.map(() => []);
|
||||||
|
}
|
||||||
|
|
||||||
|
const upload_url = nconf.get('upload_url');
|
||||||
const sets = tids.map(tid => `${validator.isUUID(String(tid)) ? 'draft' : 'topic'}:${tid}:thumbs`);
|
const sets = tids.map(tid => `${validator.isUUID(String(tid)) ? 'draft' : 'topic'}:${tid}:thumbs`);
|
||||||
const thumbs = await Promise.all(sets.map(async set => db.getSortedSetRange(set, 0, -1)));
|
const thumbs = await Promise.all(sets.map(set => getThumbs(set)));
|
||||||
let response = thumbs.map((thumbSet, idx) => thumbSet.map(thumb => ({
|
let response = thumbs.map((thumbSet, idx) => thumbSet.map(thumb => ({
|
||||||
id: tids[idx],
|
id: tids[idx],
|
||||||
name: path.basename(thumb),
|
name: path.basename(thumb),
|
||||||
url: thumb.startsWith('http') ? thumb : path.join(nconf.get('upload_url'), thumb),
|
url: thumb.startsWith('http') ? thumb : path.join(upload_url, thumb),
|
||||||
})));
|
})));
|
||||||
|
|
||||||
({ thumbs: response } = await plugins.hooks.fire('filter:topics.getThumbs', { tids, thumbs: response }));
|
({ thumbs: response } = await plugins.hooks.fire('filter:topics.getThumbs', { tids, thumbs: response }));
|
||||||
return singular ? response.pop() : response;
|
return singular ? response.pop() : response;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
async function getThumbs(set) {
|
||||||
|
const cached = cache.get(set);
|
||||||
|
if (cached !== undefined) {
|
||||||
|
return cached.slice();
|
||||||
|
}
|
||||||
|
const thumbs = await db.getSortedSetRange(set, 0, -1);
|
||||||
|
cache.set(set, thumbs, 600000);
|
||||||
|
return thumbs.slice();
|
||||||
|
}
|
||||||
|
|
||||||
Thumbs.associate = async function ({ id, path: relativePath, url }) {
|
Thumbs.associate = async function ({ id, path: relativePath, url }) {
|
||||||
// Associates a newly uploaded file as a thumb to the passed-in draft or topic
|
// Associates a newly uploaded file as a thumb to the passed-in draft or topic
|
||||||
const isDraft = validator.isUUID(String(id));
|
const isDraft = validator.isUUID(String(id));
|
||||||
@@ -52,6 +67,7 @@ Thumbs.associate = async function ({ id, path: relativePath, url }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await db.sortedSetAdd(set, numThumbs, value);
|
await db.sortedSetAdd(set, numThumbs, value);
|
||||||
|
cache.del(set);
|
||||||
|
|
||||||
// Associate thumbnails with the main pid (only on local upload)
|
// Associate thumbnails with the main pid (only on local upload)
|
||||||
if (!isDraft && relativePath) {
|
if (!isDraft && relativePath) {
|
||||||
@@ -67,6 +83,7 @@ Thumbs.migrate = async function (uuid, id) {
|
|||||||
const thumbs = await db.getSortedSetRange(set, 0, -1);
|
const thumbs = await db.getSortedSetRange(set, 0, -1);
|
||||||
await Promise.all(thumbs.map(async path => await Thumbs.associate({ id, path })));
|
await Promise.all(thumbs.map(async path => await Thumbs.associate({ id, path })));
|
||||||
await db.delete(set);
|
await db.delete(set);
|
||||||
|
cache.del(set);
|
||||||
};
|
};
|
||||||
|
|
||||||
Thumbs.delete = async function (id, relativePath) {
|
Thumbs.delete = async function (id, relativePath) {
|
||||||
@@ -80,6 +97,7 @@ Thumbs.delete = async function (id, relativePath) {
|
|||||||
|
|
||||||
if (associated) {
|
if (associated) {
|
||||||
await db.sortedSetRemove(set, relativePath);
|
await db.sortedSetRemove(set, relativePath);
|
||||||
|
cache.del(set);
|
||||||
|
|
||||||
if (existsOnDisk) {
|
if (existsOnDisk) {
|
||||||
await file.delete(absolutePath);
|
await file.delete(absolutePath);
|
||||||
|
|||||||
Reference in New Issue
Block a user