NodeBB/NodeBB

View on GitHub
src/controllers/admin/cache.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

const cacheController = module.exports;

const utils = require('../../utils');
const plugins = require('../../plugins');

cacheController.get = async function (req, res) {
    const postCache = require('../../posts/cache');
    const groupCache = require('../../groups').cache;
    const { objectCache } = require('../../database');
    const localCache = require('../../cache');
    const uptimeInSeconds = process.uptime();
    function getInfo(cache) {
        return {
            length: cache.length,
            max: cache.max,
            maxSize: cache.maxSize,
            itemCount: cache.itemCount,
            percentFull: cache.name === 'post' ?
                ((cache.length / cache.maxSize) * 100).toFixed(2) :
                ((cache.itemCount / cache.max) * 100).toFixed(2),
            hits: utils.addCommas(String(cache.hits)),
            hitsPerSecond: (cache.hits / uptimeInSeconds).toFixed(2),
            misses: utils.addCommas(String(cache.misses)),
            hitRatio: ((cache.hits / (cache.hits + cache.misses) || 0)).toFixed(4),
            enabled: cache.enabled,
            ttl: cache.ttl,
        };
    }
    let caches = {
        post: postCache,
        group: groupCache,
        local: localCache,
    };
    if (objectCache) {
        caches.object = objectCache;
    }
    caches = await plugins.hooks.fire('filter:admin.cache.get', caches);
    for (const [key, value] of Object.entries(caches)) {
        caches[key] = getInfo(value);
    }

    res.render('admin/advanced/cache', { caches });
};

cacheController.dump = async function (req, res, next) {
    let caches = {
        post: require('../../posts/cache'),
        object: require('../../database').objectCache,
        group: require('../../groups').cache,
        local: require('../../cache'),
    };
    caches = await plugins.hooks.fire('filter:admin.cache.get', caches);
    if (!caches[req.query.name]) {
        return next();
    }

    const data = JSON.stringify(caches[req.query.name].dump(), null, 4);
    res.setHeader('Content-disposition', `attachment; filename= ${req.query.name}-cache.json`);
    res.setHeader('Content-type', 'application/json');
    res.write(data, (err) => {
        if (err) {
            return next(err);
        }
        res.end();
    });
};