mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: #7743 navigation
This commit is contained in:
@@ -1,23 +1,22 @@
|
||||
'use strict';
|
||||
|
||||
var async = require('async');
|
||||
const _ = require('lodash');
|
||||
|
||||
var plugins = require('../plugins');
|
||||
var db = require('../database');
|
||||
var translator = require('../translator');
|
||||
var pubsub = require('../pubsub');
|
||||
const plugins = require('../plugins');
|
||||
const db = require('../database');
|
||||
const translator = require('../translator');
|
||||
const pubsub = require('../pubsub');
|
||||
|
||||
var admin = module.exports;
|
||||
const admin = module.exports;
|
||||
let cache = null;
|
||||
|
||||
pubsub.on('admin:navigation:save', function () {
|
||||
cache = null;
|
||||
});
|
||||
|
||||
admin.save = function (data, callback) {
|
||||
var order = Object.keys(data);
|
||||
var items = data.map(function (item, index) {
|
||||
admin.save = async function (data) {
|
||||
const order = Object.keys(data);
|
||||
const items = data.map(function (item, index) {
|
||||
for (var i in item) {
|
||||
if (item.hasOwnProperty(i) && typeof item[i] === 'string' && (i === 'title' || i === 'text')) {
|
||||
item[i] = translator.escape(item[i]);
|
||||
@@ -29,54 +28,42 @@ admin.save = function (data, callback) {
|
||||
|
||||
cache = null;
|
||||
pubsub.publish('admin:navigation:save');
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
db.delete('navigation:enabled', next);
|
||||
},
|
||||
function (next) {
|
||||
db.sortedSetAdd('navigation:enabled', order, items, next);
|
||||
},
|
||||
], callback);
|
||||
await db.delete('navigation:enabled');
|
||||
await db.sortedSetAdd('navigation:enabled', order, items);
|
||||
};
|
||||
|
||||
admin.getAdmin = function (callback) {
|
||||
async.parallel({
|
||||
enabled: admin.get,
|
||||
available: getAvailable,
|
||||
}, callback);
|
||||
admin.getAdmin = async function () {
|
||||
const [enabled, available] = await Promise.all([
|
||||
admin.get(),
|
||||
getAvailable(),
|
||||
]);
|
||||
return { enabled: enabled, available: available };
|
||||
};
|
||||
|
||||
admin.get = function (callback) {
|
||||
admin.get = async function () {
|
||||
if (cache) {
|
||||
return setImmediate(callback, null, _.cloneDeep(cache));
|
||||
return _.cloneDeep(cache);
|
||||
}
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
db.getSortedSetRange('navigation:enabled', 0, -1, next);
|
||||
},
|
||||
function (data, next) {
|
||||
data = data.map(function (item) {
|
||||
item = JSON.parse(item);
|
||||
item.groups = item.groups || [];
|
||||
if (item.groups && !Array.isArray(item.groups)) {
|
||||
item.groups = [item.groups];
|
||||
}
|
||||
return item;
|
||||
});
|
||||
const data = await db.getSortedSetRange('navigation:enabled', 0, -1);
|
||||
cache = data.map(function (item) {
|
||||
item = JSON.parse(item);
|
||||
item.groups = item.groups || [];
|
||||
if (item.groups && !Array.isArray(item.groups)) {
|
||||
item.groups = [item.groups];
|
||||
}
|
||||
return item;
|
||||
});
|
||||
|
||||
cache = data;
|
||||
next(null, _.cloneDeep(cache));
|
||||
},
|
||||
], callback);
|
||||
return _.cloneDeep(cache);
|
||||
};
|
||||
|
||||
function getAvailable(callback) {
|
||||
var core = require('../../install/data/navigation.json').map(function (item) {
|
||||
async function getAvailable() {
|
||||
const core = require('../../install/data/navigation.json').map(function (item) {
|
||||
item.core = true;
|
||||
return item;
|
||||
});
|
||||
|
||||
plugins.fireHook('filter:navigation.available', core, callback);
|
||||
return await plugins.fireHook('filter:navigation.available', core);
|
||||
}
|
||||
|
||||
require('../promisify')(admin);
|
||||
|
||||
@@ -1,42 +1,36 @@
|
||||
'use strict';
|
||||
|
||||
var async = require('async');
|
||||
var nconf = require('nconf');
|
||||
|
||||
var admin = require('./admin');
|
||||
var translator = require('../translator');
|
||||
const nconf = require('nconf');
|
||||
const admin = require('./admin');
|
||||
const translator = require('../translator');
|
||||
const groups = require('../groups');
|
||||
|
||||
var navigation = module.exports;
|
||||
const navigation = module.exports;
|
||||
|
||||
navigation.get = function (uid, callback) {
|
||||
async.waterfall([
|
||||
admin.get,
|
||||
function (data, next) {
|
||||
data = data.filter(function (item) {
|
||||
return item && item.enabled;
|
||||
}).map(function (item) {
|
||||
item.originalRoute = item.route;
|
||||
navigation.get = async function (uid) {
|
||||
let data = await admin.get();
|
||||
|
||||
if (!item.route.startsWith('http')) {
|
||||
item.route = nconf.get('relative_path') + item.route;
|
||||
}
|
||||
data = data.filter(item => item && item.enabled).map(function (item) {
|
||||
item.originalRoute = item.route;
|
||||
|
||||
Object.keys(item).forEach(function (key) {
|
||||
item[key] = translator.unescape(item[key]);
|
||||
});
|
||||
if (!item.route.startsWith('http')) {
|
||||
item.route = nconf.get('relative_path') + item.route;
|
||||
}
|
||||
|
||||
return item;
|
||||
});
|
||||
Object.keys(item).forEach(function (key) {
|
||||
item[key] = translator.unescape(item[key]);
|
||||
});
|
||||
|
||||
async.filter(data, function (navItem, next) {
|
||||
if (!navItem.groups.length) {
|
||||
return setImmediate(next, null, true);
|
||||
}
|
||||
groups.isMemberOfAny(uid, navItem.groups, next);
|
||||
}, next);
|
||||
},
|
||||
], callback);
|
||||
return item;
|
||||
});
|
||||
|
||||
const pass = await Promise.all(data.map(async function (navItem) {
|
||||
if (!navItem.groups.length) {
|
||||
return true;
|
||||
}
|
||||
return await groups.isMemberOfAny(uid, navItem.groups);
|
||||
}));
|
||||
return data.filter((navItem, i) => pass[i]);
|
||||
};
|
||||
|
||||
require('../promisify')(navigation);
|
||||
|
||||
Reference in New Issue
Block a user