feat: #7743 navigation

v1.18.x
Barış Soner Uşaklı 6 years ago
parent e72f3e4ffe
commit 764a2b1210

@ -1,23 +1,22 @@
'use strict'; 'use strict';
var async = require('async');
const _ = require('lodash'); const _ = require('lodash');
var plugins = require('../plugins'); const plugins = require('../plugins');
var db = require('../database'); const db = require('../database');
var translator = require('../translator'); const translator = require('../translator');
var pubsub = require('../pubsub'); const pubsub = require('../pubsub');
var admin = module.exports; const admin = module.exports;
let cache = null; let cache = null;
pubsub.on('admin:navigation:save', function () { pubsub.on('admin:navigation:save', function () {
cache = null; cache = null;
}); });
admin.save = function (data, callback) { admin.save = async function (data) {
var order = Object.keys(data); const order = Object.keys(data);
var items = data.map(function (item, index) { const items = data.map(function (item, index) {
for (var i in item) { for (var i in item) {
if (item.hasOwnProperty(i) && typeof item[i] === 'string' && (i === 'title' || i === 'text')) { if (item.hasOwnProperty(i) && typeof item[i] === 'string' && (i === 'title' || i === 'text')) {
item[i] = translator.escape(item[i]); item[i] = translator.escape(item[i]);
@ -29,33 +28,24 @@ admin.save = function (data, callback) {
cache = null; cache = null;
pubsub.publish('admin:navigation:save'); pubsub.publish('admin:navigation:save');
async.waterfall([ await db.delete('navigation:enabled');
function (next) { await db.sortedSetAdd('navigation:enabled', order, items);
db.delete('navigation:enabled', next);
},
function (next) {
db.sortedSetAdd('navigation:enabled', order, items, next);
},
], callback);
}; };
admin.getAdmin = function (callback) { admin.getAdmin = async function () {
async.parallel({ const [enabled, available] = await Promise.all([
enabled: admin.get, admin.get(),
available: getAvailable, getAvailable(),
}, callback); ]);
return { enabled: enabled, available: available };
}; };
admin.get = function (callback) { admin.get = async function () {
if (cache) { if (cache) {
return setImmediate(callback, null, _.cloneDeep(cache)); return _.cloneDeep(cache);
} }
async.waterfall([ const data = await db.getSortedSetRange('navigation:enabled', 0, -1);
function (next) { cache = data.map(function (item) {
db.getSortedSetRange('navigation:enabled', 0, -1, next);
},
function (data, next) {
data = data.map(function (item) {
item = JSON.parse(item); item = JSON.parse(item);
item.groups = item.groups || []; item.groups = item.groups || [];
if (item.groups && !Array.isArray(item.groups)) { if (item.groups && !Array.isArray(item.groups)) {
@ -64,19 +54,16 @@ admin.get = function (callback) {
return item; return item;
}); });
cache = data; return _.cloneDeep(cache);
next(null, _.cloneDeep(cache));
},
], callback);
}; };
function getAvailable(callback) { async function getAvailable() {
var core = require('../../install/data/navigation.json').map(function (item) { const core = require('../../install/data/navigation.json').map(function (item) {
item.core = true; item.core = true;
return item; return item;
}); });
plugins.fireHook('filter:navigation.available', core, callback); return await plugins.fireHook('filter:navigation.available', core);
} }
require('../promisify')(admin); require('../promisify')(admin);

@ -1,21 +1,16 @@
'use strict'; 'use strict';
var async = require('async'); const nconf = require('nconf');
var nconf = require('nconf'); const admin = require('./admin');
const translator = require('../translator');
var admin = require('./admin');
var translator = require('../translator');
const groups = require('../groups'); const groups = require('../groups');
var navigation = module.exports; const navigation = module.exports;
navigation.get = async function (uid) {
let data = await admin.get();
navigation.get = function (uid, callback) { data = data.filter(item => item && item.enabled).map(function (item) {
async.waterfall([
admin.get,
function (data, next) {
data = data.filter(function (item) {
return item && item.enabled;
}).map(function (item) {
item.originalRoute = item.route; item.originalRoute = item.route;
if (!item.route.startsWith('http')) { if (!item.route.startsWith('http')) {
@ -29,14 +24,13 @@ navigation.get = function (uid, callback) {
return item; return item;
}); });
async.filter(data, function (navItem, next) { const pass = await Promise.all(data.map(async function (navItem) {
if (!navItem.groups.length) { if (!navItem.groups.length) {
return setImmediate(next, null, true); return true;
} }
groups.isMemberOfAny(uid, navItem.groups, next); return await groups.isMemberOfAny(uid, navItem.groups);
}, next); }));
}, return data.filter((navItem, i) => pass[i]);
], callback);
}; };
require('../promisify')(navigation); require('../promisify')(navigation);

Loading…
Cancel
Save