diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 7722a99ac3..33a96fc193 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -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); diff --git a/src/navigation/index.js b/src/navigation/index.js index 4e4dd9a760..cf47d3dd5c 100644 --- a/src/navigation/index.js +++ b/src/navigation/index.js @@ -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; - -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; - - if (!item.route.startsWith('http')) { - item.route = nconf.get('relative_path') + item.route; - } - - Object.keys(item).forEach(function (key) { - item[key] = translator.unescape(item[key]); - }); - - return item; - }); - - async.filter(data, function (navItem, next) { - if (!navItem.groups.length) { - return setImmediate(next, null, true); - } - groups.isMemberOfAny(uid, navItem.groups, next); - }, next); - }, - ], callback); +const navigation = module.exports; + +navigation.get = async function (uid) { + let data = await admin.get(); + + data = data.filter(item => item && item.enabled).map(function (item) { + item.originalRoute = item.route; + + if (!item.route.startsWith('http')) { + item.route = nconf.get('relative_path') + item.route; + } + + Object.keys(item).forEach(function (key) { + item[key] = translator.unescape(item[key]); + }); + + 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);