From 707b55b6a5a08b5c94e769356b0b89a787788cb7 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Wed, 3 Feb 2021 23:59:08 -0700 Subject: [PATCH] chore: eslint prefer-template --- .eslintrc | 1 - Gruntfile.js | 28 +- app.js | 2 +- install/databases.js | 6 +- install/web.js | 14 +- loader.js | 12 +- src/admin/search.js | 14 +- src/admin/versions.js | 2 +- src/analytics.js | 16 +- src/api/groups.js | 6 +- src/api/helpers.js | 10 +- src/api/posts.js | 22 +- src/api/users.js | 14 +- src/batch.js | 2 +- src/cacheCreate.js | 8 +- src/categories/activeusers.js | 2 +- src/categories/create.js | 40 +- src/categories/data.js | 6 +- src/categories/delete.js | 54 +-- src/categories/index.js | 22 +- src/categories/recentreplies.js | 32 +- src/categories/search.js | 2 +- src/categories/topics.js | 22 +- src/categories/unread.js | 8 +- src/categories/update.js | 40 +- src/categories/watch.js | 6 +- src/cli/colors.js | 26 +- src/cli/index.js | 12 +- src/cli/manage.js | 28 +- src/cli/package-install.js | 6 +- src/cli/reset.js | 12 +- src/cli/running.js | 30 +- src/cli/setup.js | 10 +- src/cli/upgrade-plugins.js | 8 +- src/cli/upgrade.js | 6 +- src/controllers/404.js | 6 +- src/controllers/accounts/blocks.js | 4 +- src/controllers/accounts/categories.js | 4 +- src/controllers/accounts/chats.js | 2 +- src/controllers/accounts/consent.js | 4 +- src/controllers/accounts/edit.js | 18 +- src/controllers/accounts/follow.js | 4 +- src/controllers/accounts/groups.js | 4 +- src/controllers/accounts/helpers.js | 20 +- src/controllers/accounts/info.js | 8 +- src/controllers/accounts/posts.js | 32 +- src/controllers/accounts/profile.js | 4 +- src/controllers/accounts/sessions.js | 2 +- src/controllers/accounts/settings.js | 10 +- src/controllers/accounts/uploads.js | 8 +- src/controllers/admin/appearance.js | 2 +- src/controllers/admin/cache.js | 2 +- src/controllers/admin/categories.js | 4 +- src/controllers/admin/dashboard.js | 4 +- src/controllers/admin/events.js | 2 +- src/controllers/admin/groups.js | 6 +- src/controllers/admin/hooks.js | 4 +- src/controllers/admin/info.js | 10 +- src/controllers/admin/settings.js | 4 +- src/controllers/admin/uploads.js | 14 +- src/controllers/admin/users.js | 8 +- src/controllers/authentication.js | 38 +- src/controllers/categories.js | 2 +- src/controllers/category.js | 22 +- src/controllers/composer.js | 4 +- src/controllers/errors.js | 12 +- src/controllers/groups.js | 8 +- src/controllers/helpers.js | 20 +- src/controllers/home.js | 4 +- src/controllers/index.js | 32 +- src/controllers/mods.js | 8 +- src/controllers/osd.js | 6 +- src/controllers/ping.js | 2 +- src/controllers/popular.js | 8 +- src/controllers/posts.js | 2 +- src/controllers/recent.js | 10 +- src/controllers/tags.js | 6 +- src/controllers/top.js | 8 +- src/controllers/topics.js | 30 +- src/controllers/unread.js | 6 +- src/controllers/uploads.js | 8 +- src/controllers/user.js | 8 +- src/controllers/users.js | 4 +- src/controllers/write/users.js | 4 +- src/coverPhoto.js | 6 +- src/database/cache.js | 2 +- src/database/index.js | 4 +- src/database/mongo/connection.js | 6 +- src/database/mongo/helpers.js | 2 +- src/database/mongo/sorted/add.js | 8 +- src/database/mongo/sorted/intersect.js | 2 +- src/database/mongo/sorted/union.js | 2 +- src/database/postgres.js | 4 +- src/database/postgres/helpers.js | 8 +- src/database/postgres/main.js | 4 +- src/database/postgres/sorted.js | 48 +-- src/database/postgres/sorted/add.js | 8 +- src/database/postgres/sorted/intersect.js | 6 +- src/database/postgres/sorted/union.js | 6 +- src/database/redis.js | 4 +- src/database/redis/pubsub.js | 2 +- src/database/redis/sorted.js | 4 +- src/database/redis/sorted/add.js | 8 +- src/database/redis/sorted/intersect.js | 4 +- src/database/redis/sorted/union.js | 4 +- src/emailer.js | 20 +- src/events.js | 12 +- src/file.js | 8 +- src/flags.js | 84 ++--- src/groups/cache.js | 2 +- src/groups/cover.js | 6 +- src/groups/create.js | 8 +- src/groups/data.js | 4 +- src/groups/delete.js | 16 +- src/groups/index.js | 12 +- src/groups/invite.js | 32 +- src/groups/join.js | 12 +- src/groups/leave.js | 14 +- src/groups/membership.js | 40 +- src/groups/ownership.js | 10 +- src/groups/posts.js | 10 +- src/groups/update.js | 40 +- src/image.js | 4 +- src/install.js | 10 +- src/languages.js | 2 +- src/logger.js | 2 +- src/messaging/create.js | 10 +- src/messaging/data.js | 8 +- src/messaging/delete.js | 6 +- src/messaging/edit.js | 6 +- src/messaging/index.js | 16 +- src/messaging/notifications.js | 18 +- src/messaging/rooms.js | 50 +-- src/messaging/unread.js | 10 +- src/meta/aliases.js | 10 +- src/meta/blacklist.js | 8 +- src/meta/build.js | 22 +- src/meta/cacheBuster.js | 2 +- src/meta/configs.js | 2 +- src/meta/css.js | 22 +- src/meta/debugFork.js | 2 +- src/meta/dependencies.js | 6 +- src/meta/js.js | 6 +- src/meta/languages.js | 6 +- src/meta/minifier.js | 8 +- src/meta/settings.js | 32 +- src/meta/tags.js | 48 +-- src/meta/templates.js | 2 +- src/meta/themes.js | 8 +- src/middleware/admin.js | 8 +- src/middleware/header.js | 2 +- src/middleware/headers.js | 6 +- src/middleware/index.js | 8 +- src/middleware/ratelimit.js | 2 +- src/middleware/render.js | 28 +- src/middleware/user.js | 8 +- src/notifications.js | 60 +-- src/pagination.js | 4 +- src/plugins/data.js | 34 +- src/plugins/hooks.js | 18 +- src/plugins/index.js | 8 +- src/plugins/install.js | 6 +- src/plugins/load.js | 8 +- src/plugins/usage.js | 4 +- src/posts/bookmarks.js | 14 +- src/posts/category.js | 2 +- src/posts/create.js | 6 +- src/posts/data.js | 4 +- src/posts/delete.js | 58 +-- src/posts/diffs.js | 12 +- src/posts/edit.js | 6 +- src/posts/index.js | 6 +- src/posts/parse.js | 2 +- src/posts/queue.js | 14 +- src/posts/topics.js | 2 +- src/posts/uploads.js | 22 +- src/posts/user.js | 28 +- src/posts/votes.js | 42 +-- src/prestart.js | 8 +- src/privileges/admin.js | 2 +- src/privileges/categories.js | 4 +- src/privileges/global.js | 8 +- src/privileges/helpers.js | 22 +- src/privileges/index.js | 2 +- src/privileges/posts.js | 6 +- src/privileges/topics.js | 2 +- src/privileges/users.js | 4 +- src/rewards/admin.js | 14 +- src/rewards/index.js | 14 +- src/routes/authentication.js | 2 +- src/routes/debug.js | 4 +- src/routes/feeds.js | 66 ++-- src/routes/helpers.js | 4 +- src/routes/index.js | 8 +- src/routes/meta.js | 2 +- src/search.js | 2 +- src/settings.js | 2 +- src/sitemap.js | 4 +- src/socket.io/admin.js | 4 +- src/socket.io/admin/config.js | 2 +- src/socket.io/admin/email.js | 2 +- src/socket.io/admin/plugins.js | 4 +- src/socket.io/admin/rooms.js | 4 +- src/socket.io/admin/user.js | 8 +- src/socket.io/blacklist.js | 2 +- src/socket.io/categories/search.js | 4 +- src/socket.io/helpers.js | 28 +- src/socket.io/index.js | 22 +- src/socket.io/meta.js | 2 +- src/socket.io/modules.js | 10 +- src/socket.io/posts.js | 14 +- src/socket.io/posts/votes.js | 4 +- src/socket.io/topics/infinitescroll.js | 4 +- src/socket.io/topics/unread.js | 2 +- src/socket.io/uploads.js | 2 +- src/socket.io/user.js | 6 +- src/socket.io/user/profile.js | 16 +- src/start.js | 4 +- src/topics/bookmarks.js | 10 +- src/topics/create.js | 26 +- src/topics/data.js | 10 +- src/topics/delete.js | 48 +-- src/topics/follow.js | 24 +- src/topics/fork.js | 26 +- src/topics/index.js | 2 +- src/topics/posts.js | 28 +- src/topics/recent.js | 4 +- src/topics/sorted.js | 10 +- src/topics/suggested.js | 4 +- src/topics/tags.js | 90 ++--- src/topics/teaser.js | 2 +- src/topics/thumbs.js | 2 +- src/topics/tools.js | 50 +-- src/topics/unread.js | 34 +- src/topics/user.js | 2 +- src/upgrade.js | 10 +- src/upgrades/1.0.0/chat_room_hashes.js | 4 +- src/upgrades/1.0.0/chat_upgrade.js | 16 +- src/upgrades/1.0.0/user_best_posts.js | 6 +- src/upgrades/1.0.0/users_notvalidated.js | 4 +- .../1.1.0/assign_topic_read_privilege.js | 10 +- .../dismiss_flags_from_deleted_topics.js | 24 +- src/upgrades/1.1.0/group_title_update.js | 4 +- .../1.1.0/separate_upvote_downvote.js | 6 +- src/upgrades/1.1.0/user_post_count_per_tid.js | 8 +- .../1.1.1/remove_negative_best_posts.js | 4 +- src/upgrades/1.10.0/view_deleted_privilege.js | 4 +- src/upgrades/1.10.2/event_filters.js | 8 +- .../1.10.2/fix_category_post_zsets.js | 6 +- .../1.10.2/fix_category_topic_zsets.js | 4 +- src/upgrades/1.10.2/upgrade_bans_to_hashes.js | 12 +- src/upgrades/1.10.2/username_email_history.js | 8 +- .../1.11.1/remove_ignored_cids_per_user.js | 2 +- src/upgrades/1.12.0/category_watch_state.js | 6 +- .../1.12.1/clear_username_email_history.js | 2 +- .../1.12.1/moderation_notes_refactor.js | 8 +- .../1.12.3/give_mod_info_privilege.js | 2 +- src/upgrades/1.12.3/give_mod_privileges.js | 6 +- src/upgrades/1.12.3/user_pid_sets.js | 4 +- src/upgrades/1.13.0/clean_flag_byCid.js | 4 +- src/upgrades/1.13.0/clean_post_topic_hash.js | 8 +- .../1.13.0/cleanup_old_notifications.js | 6 +- src/upgrades/1.13.3/fix_users_sorted_sets.js | 4 +- .../1.14.0/fix_category_image_field.js | 6 +- .../1.14.1/readd_deleted_recent_topics.js | 2 +- .../1.15.0/add_target_uid_to_flags.js | 6 +- src/upgrades/1.15.0/fix_category_colors.js | 6 +- src/upgrades/1.15.0/fullname_search_set.js | 2 +- src/upgrades/1.15.0/topic_poster_count.js | 4 +- src/upgrades/1.15.4/clear_purged_replies.js | 8 +- src/upgrades/1.16.0/category_tags.js | 6 +- src/upgrades/1.17.0/category_name_zset.js | 4 +- src/upgrades/1.17.0/subcategories_per_page.js | 2 +- src/upgrades/1.17.0/topic_thumb_count.js | 4 +- src/upgrades/1.2.0/category_recent_tids.js | 6 +- .../edit_delete_deletetopic_privileges.js | 22 +- src/upgrades/1.3.0/favourites_to_bookmarks.js | 10 +- .../1.3.0/sorted_sets_for_post_replies.js | 6 +- .../1.4.0/global_and_user_language_keys.js | 2 +- .../1.4.0/sorted_set_for_pinned_topics.js | 8 +- src/upgrades/1.4.4/sound_settings.js | 4 +- src/upgrades/1.5.0/flags_refactor.js | 4 +- .../1.5.0/moderation_history_refactor.js | 4 +- src/upgrades/1.5.0/post_votes_zset.js | 2 +- .../remove_relative_uploaded_profile_cover.js | 4 +- src/upgrades/1.5.1/rename_mods_group.js | 6 +- src/upgrades/1.5.2/rss_token_wipe.js | 2 +- .../1.6.2/topics_lastposttime_zset.js | 4 +- src/upgrades/1.7.1/notification-settings.js | 8 +- src/upgrades/1.7.3/topic_votes.js | 8 +- .../1.7.4/fix_moved_topics_byvotes.js | 6 +- .../1.7.4/fix_user_topics_per_category.js | 8 +- src/upgrades/1.7.4/global_upload_privilege.js | 2 +- src/upgrades/1.8.0/give_spiders_privileges.js | 2 +- src/upgrades/1.8.1/diffs_zset_to_listhash.js | 8 +- src/user/admin.js | 14 +- src/user/approval.js | 24 +- src/user/auth.js | 44 +-- src/user/bans.js | 12 +- src/user/blocks.js | 8 +- src/user/categories.js | 2 +- src/user/create.js | 18 +- src/user/data.js | 8 +- src/user/delete.js | 82 ++--- src/user/digest.js | 16 +- src/user/email.js | 22 +- src/user/follow.js | 18 +- src/user/index.js | 4 +- src/user/info.js | 16 +- src/user/invite.js | 28 +- src/user/jobs.js | 16 +- src/user/jobs/export-posts.js | 6 +- src/user/jobs/export-profile.js | 26 +- src/user/jobs/export-uploads.js | 12 +- src/user/notifications.js | 46 +-- src/user/online.js | 2 +- src/user/password.js | 4 +- src/user/picture.js | 12 +- src/user/posts.js | 12 +- src/user/profile.js | 28 +- src/user/reset.js | 16 +- src/user/search.js | 4 +- src/user/settings.js | 14 +- src/user/topics.js | 4 +- src/user/uploads.js | 8 +- src/webserver.js | 20 +- src/widgets/index.js | 14 +- test/api.js | 24 +- test/authentication.js | 36 +- test/batch.js | 2 +- test/categories.js | 10 +- test/controllers-admin.js | 112 +++--- test/controllers.js | 344 +++++++++--------- test/coverPhoto.js | 4 +- test/database/sorted.js | 4 +- test/defer-logger.js | 2 +- test/emailer.js | 2 +- test/feeds.js | 46 +-- test/file.js | 8 +- test/flags.js | 18 +- test/groups.js | 2 +- test/helpers/index.js | 14 +- test/locale-detect.js | 4 +- test/messaging.js | 24 +- test/meta.js | 12 +- test/mocks/databasemock.js | 5 +- test/notifications.js | 26 +- test/plugins.js | 8 +- test/posts.js | 50 +-- test/search.js | 2 +- test/socket.io.js | 4 +- test/template-helpers.js | 14 +- test/topics.js | 114 +++--- test/translator.js | 4 +- test/uploads.js | 46 +-- test/user.js | 94 ++--- test/utils.js | 4 +- 357 files changed, 2425 insertions(+), 2427 deletions(-) diff --git a/.eslintrc b/.eslintrc index 2dc290ffcf..e22f8a9618 100644 --- a/.eslintrc +++ b/.eslintrc @@ -111,7 +111,6 @@ "prefer-rest-params": "off", "prefer-spread": "off", "prefer-arrow-callback": "off", - "prefer-template": "off", "no-var": "off", "vars-on-top": "off", diff --git a/Gruntfile.js b/Gruntfile.js index 7f61bad989..bdf465d608 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -53,22 +53,22 @@ module.exports = function (grunt) { } } - const styleUpdated_Client = plugins.map(p => 'node_modules/' + p + '/*.less') - .concat(plugins.map(p => 'node_modules/' + p + '/*.css')) - .concat(plugins.map(p => 'node_modules/' + p + '/+(public|static|less)/**/*.less')) - .concat(plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.css')); + const styleUpdated_Client = plugins.map(p => `node_modules/${p}/*.less`) + .concat(plugins.map(p => `node_modules/${p}/*.css`)) + .concat(plugins.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`)) + .concat(plugins.map(p => `node_modules/${p}/+(public|static)/**/*.css`)); - const styleUpdated_Admin = plugins.map(p => 'node_modules/' + p + '/*.less') - .concat(plugins.map(p => 'node_modules/' + p + '/*.css')) - .concat(plugins.map(p => 'node_modules/' + p + '/+(public|static|less)/**/*.less')) - .concat(plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.css')); + const styleUpdated_Admin = plugins.map(p => `node_modules/${p}/*.less`) + .concat(plugins.map(p => `node_modules/${p}/*.css`)) + .concat(plugins.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`)) + .concat(plugins.map(p => `node_modules/${p}/+(public|static)/**/*.css`)); - const clientUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.js'); - const serverUpdated = plugins.map(p => 'node_modules/' + p + '/*.js') - .concat(plugins.map(p => 'node_modules/' + p + '/+(lib|src)/**/*.js')); + const clientUpdated = plugins.map(p => `node_modules/${p}/+(public|static)/**/*.js`); + const serverUpdated = plugins.map(p => `node_modules/${p}/*.js`) + .concat(plugins.map(p => `node_modules/${p}/+(lib|src)/**/*.js`)); - const templatesUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static|templates)/**/*.tpl'); - const langUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static|languages)/**/*.json'); + const templatesUpdated = plugins.map(p => `node_modules/${p}/+(public|static|templates)/**/*.tpl`); + const langUpdated = plugins.map(p => `node_modules/${p}/+(public|static|languages)/**/*.json`); grunt.config(['watch'], { styleUpdated_Client: { @@ -202,7 +202,7 @@ function addBaseThemes(plugins) { let baseTheme; do { try { - baseTheme = require(themeId + '/theme').baseTheme; + baseTheme = require(`${themeId}/theme`).baseTheme; } catch (err) { console.log(err); } diff --git a/app.js b/app.js index d55802f76c..a1a7e1be87 100644 --- a/app.js +++ b/app.js @@ -49,7 +49,7 @@ winston.verbose('* using configuration stored in: %s', configFile); if (!process.send) { // If run using `node app`, log GNU copyright info along with server info - winston.info('NodeBB v' + nconf.get('version') + ' Copyright (C) 2013-' + (new Date()).getFullYear() + ' NodeBB Inc.'); + winston.info(`NodeBB v${nconf.get('version')} Copyright (C) 2013-${(new Date()).getFullYear()} NodeBB Inc.`); winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); winston.info(''); diff --git a/install/databases.js b/install/databases.js index f9affceeb9..6a08c700ab 100644 --- a/install/databases.js +++ b/install/databases.js @@ -14,7 +14,7 @@ const questions = { }; module.exports = async function (config) { - winston.info('\nNow configuring ' + config.database + ' database:'); + winston.info(`\nNow configuring ${config.database} database:`); const databaseConfig = await getDatabaseConfig(config); return saveDatabaseConfig(config, databaseConfig); }; @@ -40,7 +40,7 @@ async function getDatabaseConfig(config) { } return await promptGet(questions.postgres); } - throw new Error('unknown database : ' + config.database); + throw new Error(`unknown database : ${config.database}`); } function saveDatabaseConfig(config, databaseConfig) { @@ -79,7 +79,7 @@ function saveDatabaseConfig(config, databaseConfig) { ssl: databaseConfig['postgres:ssl'], }; } else { - throw new Error('unknown database : ' + config.database); + throw new Error(`unknown database : ${config.database}`); } const allQuestions = questions.redis.concat(questions.mongo).concat(questions.postgres); diff --git a/install/web.js b/install/web.js index 4e216e99d9..cd500f104f 100644 --- a/install/web.js +++ b/install/web.js @@ -27,8 +27,8 @@ const formats = [ ]; const timestampFormat = winston.format((info) => { - var dateString = new Date().toISOString() + ' [' + global.process.pid + ']'; - info.level = dateString + ' - ' + info.level; + var dateString = `${new Date().toISOString()} [${global.process.pid}]`; + info.level = `${dateString} - ${info.level}`; return info; }); formats.push(timestampFormat()); @@ -69,7 +69,7 @@ const viewsDir = path.join(paths.baseDir, 'build/public/templates'); web.install = async function (port) { port = port || 4567; - winston.info('Launching web installer on port ' + port); + winston.info(`Launching web installer on port ${port}`); app.use(express.static('public', {})); app.engine('tpl', function (filepath, options, callback) { @@ -119,7 +119,7 @@ function ping(req, res) { function welcome(req, res) { var dbs = ['redis', 'mongo', 'postgres']; var databases = dbs.map(function (databaseName) { - var questions = require('../src/database/' + databaseName).questions.filter(function (question) { + var questions = require(`../src/database/${databaseName}`).questions.filter(function (question) { return question && !question.hideOnWebInstall; }); @@ -132,7 +132,7 @@ function welcome(req, res) { var defaults = require('./data/defaults'); res.render('install/index', { - url: nconf.get('url') || (req.protocol + '://' + req.get('host')), + url: nconf.get('url') || (`${req.protocol}://${req.get('host')}`), launchUrl: launchUrl, skipGeneralSetup: !!nconf.get('url'), databases: databases, @@ -161,7 +161,7 @@ function install(req, res) { // Flatten any objects in setupEnvVars const pushToRoot = function (parentKey, key) { - setupEnvVars[parentKey + '__' + key] = setupEnvVars[parentKey][key]; + setupEnvVars[`${parentKey}__${key}`] = setupEnvVars[parentKey][key]; }; for (var j in setupEnvVars) { if (setupEnvVars.hasOwnProperty(j) && typeof setupEnvVars[j] === 'object' && setupEnvVars[j] !== null && !Array.isArray(setupEnvVars[j])) { @@ -258,7 +258,7 @@ async function compileLess() { const css = await lessRenderAsync(style, { filename: path.resolve(installSrc) }); await fs.promises.writeFile(path.join(__dirname, '../public/installer.css'), css.css); } catch (err) { - winston.error('Unable to compile LESS: \n' + err.stack); + winston.error(`Unable to compile LESS: \n${err.stack}`); throw err; } } diff --git a/loader.js b/loader.js index 1a3233a876..c6e35ac912 100644 --- a/loader.js +++ b/loader.js @@ -40,7 +40,7 @@ Loader.init = function (callback) { if (silent) { console.log = function () { var args = Array.prototype.slice.call(arguments); - output.write(args.join(' ') + '\n'); + output.write(`${args.join(' ')}\n`); }; } @@ -51,7 +51,7 @@ Loader.init = function (callback) { Loader.displayStartupMessages = function (callback) { console.log(''); - console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); + console.log(`NodeBB v${pkg.version} Copyright (C) 2013-2014 NodeBB Inc.`); console.log('This program comes with ABSOLUTELY NO WARRANTY.'); console.log('This is free software, and you are welcome to redistribute it under certain conditions.'); console.log('For the full license, please visit: http://www.gnu.org/copyleft/gpl.html'); @@ -71,12 +71,12 @@ Loader.addWorkerEvents = function (worker) { Loader.timesStarted = 0; }, 10000); } else { - console.log((numProcs * 3) + ' restarts in 10 seconds, most likely an error on startup. Halting.'); + console.log(`${numProcs * 3} restarts in 10 seconds, most likely an error on startup. Halting.`); process.exit(); } } - console.log('[cluster] Child Process (' + worker.pid + ') has exited (code: ' + code + ', signal: ' + signal + ')'); + console.log(`[cluster] Child Process (${worker.pid}) has exited (code: ${code}, signal: ${signal})`); if (!(worker.suicide || code === 0)) { console.log('[cluster] Spinning up another process...'); @@ -110,7 +110,7 @@ Loader.addWorkerEvents = function (worker) { Loader.start = function (callback) { numProcs = getPorts().length; - console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n'); + console.log(`Clustering enabled: Spinning up ${numProcs} process(es).\n`); for (var x = 0; x < numProcs; x += 1) { forkWorker(x, x === 0); @@ -126,7 +126,7 @@ function forkWorker(index, isPrimary) { var args = []; if (!ports[index]) { - return console.log('[cluster] invalid port for worker : ' + index + ' ports: ' + ports.length); + return console.log(`[cluster] invalid port for worker : ${index} ports: ${ports.length}`); } process.env.isPrimary = isPrimary; diff --git a/src/admin/search.js b/src/admin/search.js index d4cbe287b5..64dd6ab0e0 100644 --- a/src/admin/search.js +++ b/src/admin/search.js @@ -59,13 +59,13 @@ function nsToTitle(namespace) { const fallbackCache = {}; async function initFallback(namespace) { - const template = await fs.promises.readFile(path.resolve(nconf.get('views_dir'), namespace + '.tpl'), 'utf8'); + const template = await fs.promises.readFile(path.resolve(nconf.get('views_dir'), `${namespace}.tpl`), 'utf8'); var title = nsToTitle(namespace); var translations = sanitize(template); translations = Translator.removePatterns(translations); translations = simplify(translations); - translations += '\n' + title; + translations += `\n${title}`; return { namespace: namespace, @@ -107,16 +107,16 @@ async function buildNamespace(language, namespace) { title = '[[admin/menu:dashboard]]'; } else { title = title.match(/admin\/(.+?)\/(.+?)$/); - title = '[[admin/menu:section-' + - (title[1] === 'development' ? 'advanced' : title[1]) + - ']]' + (title[2] ? (' > [[admin/menu:' + - title[1] + '/' + title[2] + ']]') : ''); + title = `[[admin/menu:section-${ + title[1] === 'development' ? 'advanced' : title[1] + }]]${title[2] ? (` > [[admin/menu:${ + title[1]}/${title[2]}]]`) : ''}`; } title = await translator.translate(title); return { namespace: namespace, - translations: str + '\n' + title, + translations: `${str}\n${title}`, title: title, }; } catch (err) { diff --git a/src/admin/versions.js b/src/admin/versions.js index c1aa46d11a..3d1570704b 100644 --- a/src/admin/versions.js +++ b/src/admin/versions.js @@ -12,7 +12,7 @@ const isPrerelease = /^v?\d+\.\d+\.\d+-.+$/; function getLatestVersion(callback) { const headers = { Accept: 'application/vnd.github.v3+json', - 'User-Agent': encodeURIComponent('NodeBB Admin Control Panel/' + meta.config.title), + 'User-Agent': encodeURIComponent(`NodeBB Admin Control Panel/${meta.config.title}`), }; if (versionCacheLastModified) { diff --git a/src/analytics.js b/src/analytics.js index 1fe00f9803..068e54c743 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -131,7 +131,7 @@ Analytics.writeData = async function () { if (Object.keys(counters).length > 0) { for (const key in counters) { if (counters.hasOwnProperty(key)) { - dbQueue.push(db.sortedSetIncrBy('analytics:' + key, counters[key], today.getTime())); + dbQueue.push(db.sortedSetIncrBy(`analytics:${key}`, counters[key], today.getTime())); delete counters[key]; } } @@ -139,7 +139,7 @@ Analytics.writeData = async function () { try { await Promise.all(dbQueue); } catch (err) { - winston.error('[analytics] Encountered error while writing analytics to data store\n' + err.stack); + winston.error(`[analytics] Encountered error while writing analytics to data store\n${err.stack}`); throw err; } }; @@ -147,7 +147,7 @@ Analytics.writeData = async function () { Analytics.getHourlyStatsForSet = async function (set, hour, numHours) { // Guard against accidental ommission of `analytics:` prefix if (!set.startsWith('analytics:')) { - set = 'analytics:' + set; + set = `analytics:${set}`; } const terms = {}; @@ -180,7 +180,7 @@ Analytics.getHourlyStatsForSet = async function (set, hour, numHours) { Analytics.getDailyStatsForSet = async function (set, day, numDays) { // Guard against accidental ommission of `analytics:` prefix if (!set.startsWith('analytics:')) { - set = 'analytics:' + set; + set = `analytics:${set}`; } const daysArr = []; @@ -218,10 +218,10 @@ Analytics.getSummary = async function () { Analytics.getCategoryAnalytics = async function (cid) { return await utils.promiseParallel({ - 'pageviews:hourly': Analytics.getHourlyStatsForSet('analytics:pageviews:byCid:' + cid, Date.now(), 24), - 'pageviews:daily': Analytics.getDailyStatsForSet('analytics:pageviews:byCid:' + cid, Date.now(), 30), - 'topics:daily': Analytics.getDailyStatsForSet('analytics:topics:byCid:' + cid, Date.now(), 7), - 'posts:daily': Analytics.getDailyStatsForSet('analytics:posts:byCid:' + cid, Date.now(), 7), + 'pageviews:hourly': Analytics.getHourlyStatsForSet(`analytics:pageviews:byCid:${cid}`, Date.now(), 24), + 'pageviews:daily': Analytics.getDailyStatsForSet(`analytics:pageviews:byCid:${cid}`, Date.now(), 30), + 'topics:daily': Analytics.getDailyStatsForSet(`analytics:topics:byCid:${cid}`, Date.now(), 7), + 'posts:daily': Analytics.getDailyStatsForSet(`analytics:posts:byCid:${cid}`, Date.now(), 7), }); }; diff --git a/src/api/groups.js b/src/api/groups.js index 9f68d31afe..ad8f3c4f51 100644 --- a/src/api/groups.js +++ b/src/api/groups.js @@ -163,9 +163,9 @@ groupsAPI.leave = async function (caller, data) { const username = await user.getUserField(data.uid, 'username'); const notification = await notifications.create({ type: 'group-leave', - bodyShort: '[[groups:membership.leave.notification_title, ' + username + ', ' + groupName + ']]', - nid: 'group:' + validator.escape(groupName) + ':uid:' + data.uid + ':group-leave', - path: '/groups/' + slugify(groupName), + bodyShort: `[[groups:membership.leave.notification_title, ${username}, ${groupName}]]`, + nid: `group:${validator.escape(groupName)}:uid:${data.uid}:group-leave`, + path: `/groups/${slugify(groupName)}`, from: data.uid, }); const uids = await groups.getOwners(groupName); diff --git a/src/api/helpers.js b/src/api/helpers.js index b2f9e0e592..9d50c2cbc6 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -70,7 +70,7 @@ async function logTopicAction(action, req, tid, title) { return; } await events.log({ - type: 'topic-' + action, + type: `topic-${action}`, uid: req.uid, ip: req.ip, tid: tid, @@ -88,7 +88,7 @@ exports.postCommand = async function (caller, command, eventName, notification, } if (!data.room_id) { - throw new Error('[[error:invalid-room-id, ' + data.room_id + ' ]]'); + throw new Error(`[[error:invalid-room-id, ${data.room_id} ]]`); } const [exists, deleted] = await Promise.all([ posts.exists(data.pid), @@ -111,7 +111,7 @@ exports.postCommand = async function (caller, command, eventName, notification, filter:post.bookmark filter:post.unbookmark */ - const filteredData = await plugins.hooks.fire('filter:post.' + command, { + const filteredData = await plugins.hooks.fire(`filter:post.${command}`, { data: data, uid: caller.uid, }); @@ -121,8 +121,8 @@ exports.postCommand = async function (caller, command, eventName, notification, async function executeCommand(caller, command, eventName, notification, data) { const result = await posts[command](data.pid, caller.uid); if (result && eventName) { - websockets.in('uid_' + caller.uid).emit('posts.' + command, result); - websockets.in(data.room_id).emit('event:' + eventName, result); + websockets.in(`uid_${caller.uid}`).emit(`posts.${command}`, result); + websockets.in(data.room_id).emit(`event:${eventName}`, result); } if (result && command === 'upvote') { socketHelpers.upvote(result, notification); diff --git a/src/api/posts.js b/src/api/posts.js index fdef453be3..9379385de5 100644 --- a/src/api/posts.js +++ b/src/api/posts.js @@ -50,13 +50,13 @@ postsAPI.edit = async function (caller, data) { const contentLen = utils.stripHTMLTags(data.content).trim().length; if (data.title && data.title.length < meta.config.minimumTitleLength) { - throw new Error('[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]'); + throw new Error(`[[error:title-too-short, ${meta.config.minimumTitleLength}]]`); } else if (data.title && data.title.length > meta.config.maximumTitleLength) { - throw new Error('[[error:title-too-long, ' + meta.config.maximumTitleLength + ']]'); + throw new Error(`[[error:title-too-long, ${meta.config.maximumTitleLength}]]`); } else if (meta.config.minimumPostLength !== 0 && contentLen < meta.config.minimumPostLength) { - throw new Error('[[error:content-too-short, ' + meta.config.minimumPostLength + ']]'); + throw new Error(`[[error:content-too-short, ${meta.config.minimumPostLength}]]`); } else if (contentLen > meta.config.maximumPostLength) { - throw new Error('[[error:content-too-long, ' + meta.config.maximumPostLength + ']]'); + throw new Error(`[[error:content-too-long, ${meta.config.maximumPostLength}]]`); } data.uid = caller.uid; @@ -81,19 +81,19 @@ postsAPI.edit = async function (caller, data) { returnData.topic = { ...postObj[0].topic, ...editResult.post.topic }; if (!editResult.post.deleted) { - websockets.in('topic_' + editResult.topic.tid).emit('event:post_edited', editResult); + websockets.in(`topic_${editResult.topic.tid}`).emit('event:post_edited', editResult); return returnData; } const memberData = await groups.getMembersOfGroups([ 'administrators', 'Global Moderators', - 'cid:' + editResult.topic.cid + ':privileges:moderate', - 'cid:' + editResult.topic.cid + ':privileges:groups:moderate', + `cid:${editResult.topic.cid}:privileges:moderate`, + `cid:${editResult.topic.cid}:privileges:groups:moderate`, ]); const uids = _.uniq(_.flatten(memberData).concat(String(caller.uid))); - uids.forEach(uid => websockets.in('uid_' + uid).emit('event:post_edited', editResult)); + uids.forEach(uid => websockets.in(`uid_${uid}`).emit('event:post_edited', editResult)); return returnData; }; @@ -123,7 +123,7 @@ async function deleteOrRestore(caller, data, params) { await deleteOrRestoreTopicOf(params.command, data.pid, caller); } - websockets.in('topic_' + postData.tid).emit(params.event, postData); + websockets.in(`topic_${postData.tid}`).emit(params.event, postData); await events.log({ type: params.type, @@ -165,7 +165,7 @@ postsAPI.purge = async function (caller, data) { require('../posts/cache').del(data.pid); await posts.purge(data.pid, caller.uid); - websockets.in('topic_' + postData.tid).emit('event:post_purged', postData); + websockets.in(`topic_${postData.tid}`).emit('event:post_purged', postData); const topicData = await topics.getTopicFields(postData.tid, ['title', 'cid']); await events.log({ @@ -295,5 +295,5 @@ postsAPI.restoreDiff = async (caller, data) => { } const edit = await posts.diffs.restore(data.pid, data.since, caller.uid, apiHelpers.buildReqObject(caller)); - websockets.in('topic_' + edit.topic.tid).emit('event:post_edited', edit); + websockets.in(`topic_${edit.topic.tid}`).emit('event:post_edited', edit); }; diff --git a/src/api/users.js b/src/api/users.js index f159ed226a..73717e5bb1 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -117,7 +117,7 @@ usersAPI.updateSettings = async function (caller, data) { acpLang: defaults.acpLang, }; // load raw settings without parsing values to booleans - const current = await db.getObject('user:' + data.uid + ':settings'); + const current = await db.getObject(`user:${data.uid}:settings`); const payload = { ...defaults, ...current, ...data.settings }; delete payload.uid; @@ -144,10 +144,10 @@ usersAPI.follow = async function (caller, data) { const userData = await user.getUserFields(caller.uid, ['username', 'userslug']); const notifObj = await notifications.create({ type: 'follow', - bodyShort: '[[notifications:user_started_following_you, ' + userData.username + ']]', - nid: 'follow:' + data.uid + ':uid:' + caller.uid, + bodyShort: `[[notifications:user_started_following_you, ${userData.username}]]`, + nid: `follow:${data.uid}:uid:${caller.uid}`, from: caller.uid, - path: '/uid/' + data.uid + '/followers', + path: `/uid/${data.uid}/followers`, mergeId: 'notifications:user_started_following_you', }); if (!notifObj) { @@ -173,13 +173,13 @@ usersAPI.ban = async function (caller, data) { } const banData = await user.bans.ban(data.uid, data.until, data.reason); - await db.setObjectField('uid:' + data.uid + ':ban:' + banData.timestamp, 'fromUid', caller.uid); + await db.setObjectField(`uid:${data.uid}:ban:${banData.timestamp}`, 'fromUid', caller.uid); if (!data.reason) { data.reason = await translator.translate('[[user:info.banned-no-reason]]'); } - sockets.in('uid_' + data.uid).emit('event:banned', { + sockets.in(`uid_${data.uid}`).emit('event:banned', { until: data.until, reason: validator.escape(String(data.reason || '')), }); @@ -213,7 +213,7 @@ usersAPI.unban = async function (caller, data) { await user.bans.unban(data.uid); - sockets.in('uid_' + data.uid).emit('event:unbanned'); + sockets.in(`uid_${data.uid}`).emit('event:unbanned'); await events.log({ type: 'user-unban', diff --git a/src/batch.js b/src/batch.js index 58ad6d2aba..dbce61f432 100644 --- a/src/batch.js +++ b/src/batch.js @@ -41,7 +41,7 @@ exports.processSortedSet = async function (setKey, process, options) { while (true) { /* eslint-disable no-await-in-loop */ - const ids = await db['getSortedSetRange' + (options.withScores ? 'WithScores' : '')](setKey, start, stop); + const ids = await db[`getSortedSetRange${options.withScores ? 'WithScores' : ''}`](setKey, start, stop); if (!ids.length || options.doneIf(start, stop, ids)) { return; } diff --git a/src/cacheCreate.js b/src/cacheCreate.js index e2c8dcfe96..98b60ff7f9 100644 --- a/src/cacheCreate.js +++ b/src/cacheCreate.js @@ -40,12 +40,12 @@ module.exports = function (opts) { if (!Array.isArray(keys)) { keys = [keys]; } - pubsub.publish(cache.name + ':cache:del', keys); + pubsub.publish(`${cache.name}:cache:del`, keys); keys.forEach(key => cacheDel.apply(cache, [key])); }; cache.reset = function () { - pubsub.publish(cache.name + ':cache:reset'); + pubsub.publish(`${cache.name}:cache:reset`); localReset(); }; @@ -55,11 +55,11 @@ module.exports = function (opts) { cache.misses = 0; } - pubsub.on(cache.name + ':cache:reset', function () { + pubsub.on(`${cache.name}:cache:reset`, function () { localReset(); }); - pubsub.on(cache.name + ':cache:del', function (keys) { + pubsub.on(`${cache.name}:cache:del`, function (keys) { if (Array.isArray(keys)) { keys.forEach(key => cacheDel.apply(cache, [key])); } diff --git a/src/categories/activeusers.js b/src/categories/activeusers.js index 5164868529..4a55be445a 100644 --- a/src/categories/activeusers.js +++ b/src/categories/activeusers.js @@ -10,7 +10,7 @@ module.exports = function (Categories) { if (!Array.isArray(cids)) { cids = [cids]; } - const pids = await db.getSortedSetRevRange(cids.map(cid => 'cid:' + cid + ':pids'), 0, 24); + const pids = await db.getSortedSetRevRange(cids.map(cid => `cid:${cid}:pids`), 0, 24); const postData = await posts.getPostsFields(pids, ['uid']); return _.uniq(postData.map(post => post.uid).filter(uid => uid)); }; diff --git a/src/categories/create.js b/src/categories/create.js index fa6bbf3a9a..2bb97ff267 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -15,8 +15,8 @@ module.exports = function (Categories) { const parentCid = data.parentCid ? data.parentCid : 0; const cid = await db.incrObjectField('global', 'nextCid'); - data.name = String(data.name || 'Category ' + cid); - const slug = cid + '/' + slugify(data.name); + data.name = String(data.name || `Category ${cid}`); + const slug = `${cid}/${slugify(data.name)}`; const order = data.order || cid; // If no order provided, place it at the end const colours = Categories.assignColours(); @@ -50,15 +50,15 @@ module.exports = function (Categories) { category = result.category; - await db.setObject('category:' + category.cid, category); + await db.setObject(`category:${category.cid}`, category); if (!category.descriptionParsed) { await Categories.parseDescription(category.cid, category.description); } await db.sortedSetAddBulk([ ['categories:cid', category.order, category.cid], - ['cid:' + parentCid + ':children', category.order, category.cid], - ['categories:name', 0, data.name.substr(0, 200).toLowerCase() + ':' + category.cid], + [`cid:${parentCid}:children`, category.order, category.cid], + ['categories:name', 0, `${data.name.substr(0, 200).toLowerCase()}:${category.cid}`], ]); const defaultPrivileges = [ @@ -83,7 +83,7 @@ module.exports = function (Categories) { await privileges.categories.give(modPrivileges, category.cid, ['administrators', 'Global Moderators']); await privileges.categories.give(['groups:find', 'groups:read', 'groups:topics:read'], category.cid, ['guests', 'spiders']); - cache.del(['categories:cid', 'cid:' + parentCid + ':children']); + cache.del(['categories:cid', `cid:${parentCid}:children`]); if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) { category = await Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid); } @@ -125,8 +125,8 @@ module.exports = function (Categories) { Categories.copySettingsFrom = async function (fromCid, toCid, copyParent) { const [source, destination] = await Promise.all([ - db.getObject('category:' + fromCid), - db.getObject('category:' + toCid), + db.getObject(`category:${fromCid}`), + db.getObject(`category:${toCid}`), ]); if (!source) { throw new Error('[[error:invalid-cid]]'); @@ -135,9 +135,9 @@ module.exports = function (Categories) { const oldParent = parseInt(destination.parentCid, 10) || 0; const newParent = parseInt(source.parentCid, 10) || 0; if (copyParent && newParent !== parseInt(toCid, 10)) { - await db.sortedSetRemove('cid:' + oldParent + ':children', toCid); - await db.sortedSetAdd('cid:' + newParent + ':children', source.order, toCid); - cache.del(['cid:' + oldParent + ':children', 'cid:' + newParent + ':children']); + await db.sortedSetRemove(`cid:${oldParent}:children`, toCid); + await db.sortedSetAdd(`cid:${newParent}:children`, source.order, toCid); + cache.del([`cid:${oldParent}:children`, `cid:${newParent}:children`]); } destination.description = source.description; @@ -157,7 +157,7 @@ module.exports = function (Categories) { destination.parentCid = source.parentCid || 0; } - await db.setObject('category:' + toCid, destination); + await db.setObject(`category:${toCid}`, destination); await copyTagWhitelist(fromCid, toCid); @@ -167,10 +167,10 @@ module.exports = function (Categories) { }; async function copyTagWhitelist(fromCid, toCid) { - const data = await db.getSortedSetRangeWithScores('cid:' + fromCid + ':tag:whitelist', 0, -1); - await db.delete('cid:' + toCid + ':tag:whitelist'); - await db.sortedSetAdd('cid:' + toCid + ':tag:whitelist', data.map(item => item.score), data.map(item => item.value)); - cache.del('cid:' + toCid + ':tag:whitelist'); + const data = await db.getSortedSetRangeWithScores(`cid:${fromCid}:tag:whitelist`, 0, -1); + await db.delete(`cid:${toCid}:tag:whitelist`); + await db.sortedSetAdd(`cid:${toCid}:tag:whitelist`, data.map(item => item.score), data.map(item => item.value)); + cache.del(`cid:${toCid}:tag:whitelist`); } Categories.copyPrivilegesFrom = async function (fromCid, toCid, group) { @@ -190,8 +190,8 @@ module.exports = function (Categories) { }; async function copyPrivileges(privileges, fromCid, toCid) { - const toGroups = privileges.map(privilege => 'group:cid:' + toCid + ':privileges:' + privilege + ':members'); - const fromGroups = privileges.map(privilege => 'group:cid:' + fromCid + ':privileges:' + privilege + ':members'); + const toGroups = privileges.map(privilege => `group:cid:${toCid}:privileges:${privilege}:members`); + const fromGroups = privileges.map(privilege => `group:cid:${fromCid}:privileges:${privilege}:members`); const currentMembers = await db.getSortedSetsMembers(toGroups.concat(fromGroups)); const copyGroups = _.uniq(_.flatten(currentMembers)); @@ -201,8 +201,8 @@ module.exports = function (Categories) { } async function copyPrivilegesByGroup(privilegeList, fromCid, toCid, group) { - const fromGroups = privilegeList.map(privilege => 'group:cid:' + fromCid + ':privileges:' + privilege + ':members'); - const toGroups = privilegeList.map(privilege => 'group:cid:' + toCid + ':privileges:' + privilege + ':members'); + const fromGroups = privilegeList.map(privilege => `group:cid:${fromCid}:privileges:${privilege}:members`); + const toGroups = privilegeList.map(privilege => `group:cid:${toCid}:privileges:${privilege}:members`); const [fromChecks, toChecks] = await Promise.all([ db.isMemberOfSortedSets(fromGroups, group), db.isMemberOfSortedSets(toGroups, group), diff --git a/src/categories/data.js b/src/categories/data.js index d7fe32f766..d78ba90d4e 100644 --- a/src/categories/data.js +++ b/src/categories/data.js @@ -19,7 +19,7 @@ module.exports = function (Categories) { return []; } - const keys = cids.map(cid => 'category:' + cid); + const keys = cids.map(cid => `category:${cid}`); const categories = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); const result = await plugins.hooks.fire('filter:category.getFields', { cids: cids, @@ -56,11 +56,11 @@ module.exports = function (Categories) { }; Categories.setCategoryField = async function (cid, field, value) { - await db.setObjectField('category:' + cid, field, value); + await db.setObjectField(`category:${cid}`, field, value); }; Categories.incrementCategoryFieldBy = async function (cid, field, value) { - await db.incrObjectFieldBy('category:' + cid, field, value); + await db.incrObjectFieldBy(`category:${cid}`, field, value); }; }; diff --git a/src/categories/delete.js b/src/categories/delete.js index 984ba88e28..86061ad13c 100644 --- a/src/categories/delete.js +++ b/src/categories/delete.js @@ -11,13 +11,13 @@ var cache = require('../cache'); module.exports = function (Categories) { Categories.purge = async function (cid, uid) { - await batch.processSortedSet('cid:' + cid + ':tids', async function (tids) { + await batch.processSortedSet(`cid:${cid}:tids`, async function (tids) { await async.eachLimit(tids, 10, async function (tid) { await topics.purgePostsAndTopic(tid, uid); }); }, { alwaysStartAt: 0 }); - const pinnedTids = await db.getSortedSetRevRange('cid:' + cid + ':tids:pinned', 0, -1); + const pinnedTids = await db.getSortedSetRevRange(`cid:${cid}:tids:pinned`, 0, -1); await async.eachLimit(pinnedTids, 10, async function (tid) { await topics.purgePostsAndTopic(tid, uid); }); @@ -30,41 +30,41 @@ module.exports = function (Categories) { const cid = categoryData.cid; await db.sortedSetRemoveBulk([ ['categories:cid', cid], - ['categories:name', categoryData.name.substr(0, 200).toLowerCase() + ':' + cid], + ['categories:name', `${categoryData.name.substr(0, 200).toLowerCase()}:${cid}`], ]); await removeFromParent(cid); await deleteTags(cid); await db.deleteAll([ - 'cid:' + cid + ':tids', - 'cid:' + cid + ':tids:pinned', - 'cid:' + cid + ':tids:posts', - 'cid:' + cid + ':tids:votes', - 'cid:' + cid + ':tids:lastposttime', - 'cid:' + cid + ':recent_tids', - 'cid:' + cid + ':pids', - 'cid:' + cid + ':read_by_uid', - 'cid:' + cid + ':uid:watch:state', - 'cid:' + cid + ':children', - 'cid:' + cid + ':tag:whitelist', - 'category:' + cid, + `cid:${cid}:tids`, + `cid:${cid}:tids:pinned`, + `cid:${cid}:tids:posts`, + `cid:${cid}:tids:votes`, + `cid:${cid}:tids:lastposttime`, + `cid:${cid}:recent_tids`, + `cid:${cid}:pids`, + `cid:${cid}:read_by_uid`, + `cid:${cid}:uid:watch:state`, + `cid:${cid}:children`, + `cid:${cid}:tag:whitelist`, + `category:${cid}`, ]); - await groups.destroy(privileges.privilegeList.map(privilege => 'cid:' + cid + ':privileges:' + privilege)); + await groups.destroy(privileges.privilegeList.map(privilege => `cid:${cid}:privileges:${privilege}`)); } async function removeFromParent(cid) { const [parentCid, children] = await Promise.all([ Categories.getCategoryField(cid, 'parentCid'), - db.getSortedSetRange('cid:' + cid + ':children', 0, -1), + db.getSortedSetRange(`cid:${cid}:children`, 0, -1), ]); const bulkAdd = []; const childrenKeys = children.map(function (cid) { bulkAdd.push(['cid:0:children', cid, cid]); - return 'category:' + cid; + return `category:${cid}`; }); await Promise.all([ - db.sortedSetRemove('cid:' + parentCid + ':children', cid), + db.sortedSetRemove(`cid:${parentCid}:children`, cid), db.setObjectField(childrenKeys, 'parentCid', 0), db.sortedSetAddBulk(bulkAdd), ]); @@ -72,17 +72,17 @@ module.exports = function (Categories) { cache.del([ 'categories:cid', 'cid:0:children', - 'cid:' + parentCid + ':children', - 'cid:' + parentCid + ':children:all', - 'cid:' + cid + ':children', - 'cid:' + cid + ':children:all', - 'cid:' + cid + ':tag:whitelist', + `cid:${parentCid}:children`, + `cid:${parentCid}:children:all`, + `cid:${cid}:children`, + `cid:${cid}:children:all`, + `cid:${cid}:tag:whitelist`, ]); } async function deleteTags(cid) { - const tags = await db.getSortedSetMembers('cid:' + cid + ':tags'); - await db.deleteAll(tags.map(tag => 'cid:' + cid + ':tag:' + tag + ':topics')); - await db.delete('cid:' + cid + ':tags'); + const tags = await db.getSortedSetMembers(`cid:${cid}:tags`); + await db.deleteAll(tags.map(tag => `cid:${cid}:tag:${tag}:topics`)); + await db.delete(`cid:${cid}:tags`); } }; diff --git a/src/categories/index.js b/src/categories/index.js index 6320ccd620..2779080084 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -25,9 +25,9 @@ require('./search')(Categories); Categories.exists = async function (cid) { if (Array.isArray(cid)) { - return await db.exists(cid.map(cid => 'category:' + cid)); + return await db.exists(cid.map(cid => `category:${cid}`)); } - return await db.exists('category:' + cid); + return await db.exists(`category:${cid}`); }; Categories.getCategoryById = async function (data) { @@ -98,8 +98,8 @@ Categories.getModerators = async function (cid) { Categories.getModeratorUids = async function (cids) { const groupNames = cids.reduce(function (memo, cid) { - memo.push('cid:' + cid + ':privileges:moderate'); - memo.push('cid:' + cid + ':privileges:groups:moderate'); + memo.push(`cid:${cid}:privileges:moderate`); + memo.push(`cid:${cid}:privileges:groups:moderate`); return memo; }, []); @@ -150,7 +150,7 @@ Categories.getTagWhitelist = async function (cids) { const cachedData = {}; const nonCachedCids = cids.filter((cid) => { - const data = cache.get('cid:' + cid + ':tag:whitelist'); + const data = cache.get(`cid:${cid}:tag:whitelist`); const isInCache = data !== undefined; if (isInCache) { cachedData[cid] = data; @@ -162,12 +162,12 @@ Categories.getTagWhitelist = async function (cids) { return cids.map(cid => cachedData[cid]); } - const keys = nonCachedCids.map(cid => 'cid:' + cid + ':tag:whitelist'); + const keys = nonCachedCids.map(cid => `cid:${cid}:tag:whitelist`); const data = await db.getSortedSetsMembers(keys); nonCachedCids.forEach((cid, index) => { cachedData[cid] = data[index]; - cache.set('cid:' + cid + ':tag:whitelist', data[index]); + cache.set(`cid:${cid}:tag:whitelist`, data[index]); }); return cids.map(cid => cachedData[cid]); }; @@ -252,12 +252,12 @@ Categories.getChildrenCids = async function (rootCid) { if (!childrenCids.length) { return; } - keys = childrenCids.map(cid => 'cid:' + cid + ':children'); + keys = childrenCids.map(cid => `cid:${cid}:children`); childrenCids.forEach(cid => allCids.push(parseInt(cid, 10))); await recursive(keys); } - const key = 'cid:' + rootCid + ':children'; - const cacheKey = key + ':all'; + const key = `cid:${rootCid}:children`; + const cacheKey = `${key}:all`; const childrenCids = cache.get(cacheKey); if (childrenCids) { return childrenCids.slice(); @@ -368,7 +368,7 @@ Categories.buildForSelectCategories = function (categories, fields, parentCid) { category.depth = depth; categoriesData.push(category); if (Array.isArray(category.children)) { - category.children.forEach(child => recursive(child, categoriesData, '    ' + level, depth + 1)); + category.children.forEach(child => recursive(child, categoriesData, `    ${level}`, depth + 1)); } } parentCid = parentCid || 0; diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index e2eb0746ce..da4915ed23 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -15,26 +15,26 @@ module.exports = function (Categories) { if (!parseInt(count, 10)) { return []; } - let pids = await db.getSortedSetRevRange('cid:' + cid + ':pids', 0, count - 1); + let pids = await db.getSortedSetRevRange(`cid:${cid}:pids`, 0, count - 1); pids = await privileges.posts.filter('topics:read', pids, uid); return await posts.getPostSummaryByPids(pids, uid, { stripTags: true }); }; Categories.updateRecentTid = async function (cid, tid) { const [count, numRecentReplies] = await Promise.all([ - db.sortedSetCard('cid:' + cid + ':recent_tids'), - db.getObjectField('category:' + cid, 'numRecentReplies'), + db.sortedSetCard(`cid:${cid}:recent_tids`), + db.getObjectField(`category:${cid}`, 'numRecentReplies'), ]); if (count >= numRecentReplies) { - const data = await db.getSortedSetRangeWithScores('cid:' + cid + ':recent_tids', 0, count - numRecentReplies); + const data = await db.getSortedSetRangeWithScores(`cid:${cid}:recent_tids`, 0, count - numRecentReplies); const shouldRemove = !(data.length === 1 && count === 1 && data[0].value === String(tid)); if (data.length && shouldRemove) { - await db.sortedSetsRemoveRangeByScore(['cid:' + cid + ':recent_tids'], '-inf', data[data.length - 1].score); + await db.sortedSetsRemoveRangeByScore([`cid:${cid}:recent_tids`], '-inf', data[data.length - 1].score); } } if (numRecentReplies > 0) { - await db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid); + await db.sortedSetAdd(`cid:${cid}:recent_tids`, Date.now(), tid); } await plugins.hooks.fire('action:categories.updateRecentTid', { cid: cid, tid: tid }); }; @@ -45,7 +45,7 @@ module.exports = function (Categories) { let index = 0; do { /* eslint-disable no-await-in-loop */ - const pids = await db.getSortedSetRevRange('cid:' + cid + ':pids', index, index); + const pids = await db.getSortedSetRevRange(`cid:${cid}:pids`, index, index); if (!pids.length) { return; } @@ -77,7 +77,7 @@ module.exports = function (Categories) { }); keys = result.keys; } else { - keys = categoriesToLoad.map(c => 'cid:' + c.cid + ':recent_tids'); + keys = categoriesToLoad.map(c => `cid:${c.cid}:recent_tids`); } const results = await db.getSortedSetsMembers(keys); @@ -174,19 +174,19 @@ module.exports = function (Categories) { const bulkRemove = []; const bulkAdd = []; postData.forEach((post) => { - bulkRemove.push(['cid:' + oldCid + ':uid:' + post.uid + ':pids', post.pid]); - bulkRemove.push(['cid:' + oldCid + ':uid:' + post.uid + ':pids:votes', post.pid]); - bulkAdd.push(['cid:' + cid + ':uid:' + post.uid + ':pids', post.timestamp, post.pid]); + bulkRemove.push([`cid:${oldCid}:uid:${post.uid}:pids`, post.pid]); + bulkRemove.push([`cid:${oldCid}:uid:${post.uid}:pids:votes`, post.pid]); + bulkAdd.push([`cid:${cid}:uid:${post.uid}:pids`, post.timestamp, post.pid]); if (post.votes > 0) { - bulkAdd.push(['cid:' + cid + ':uid:' + post.uid + ':pids:votes', post.votes, post.pid]); + bulkAdd.push([`cid:${cid}:uid:${post.uid}:pids:votes`, post.votes, post.pid]); } }); const postsToReAdd = postData.filter(p => !p.deleted && !topicDeleted); const timestamps = postsToReAdd.map(p => p && p.timestamp); await Promise.all([ - db.sortedSetRemove('cid:' + oldCid + ':pids', pids), - db.sortedSetAdd('cid:' + cid + ':pids', timestamps, postsToReAdd.map(p => p.pid)), + db.sortedSetRemove(`cid:${oldCid}:pids`, pids), + db.sortedSetAdd(`cid:${cid}:pids`, timestamps, postsToReAdd.map(p => p.pid)), db.sortedSetRemoveBulk(bulkRemove), db.sortedSetAddBulk(bulkAdd), ]); @@ -200,8 +200,8 @@ module.exports = function (Categories) { } await Promise.all([ - db.incrObjectFieldBy('category:' + oldCid, 'post_count', -postCount), - db.incrObjectFieldBy('category:' + newCid, 'post_count', postCount), + db.incrObjectFieldBy(`category:${oldCid}`, 'post_count', -postCount), + db.incrObjectFieldBy(`category:${newCid}`, 'post_count', postCount), ]); } }; diff --git a/src/categories/search.js b/src/categories/search.js index dab0f6a9d5..e878b2d9de 100644 --- a/src/categories/search.js +++ b/src/categories/search.js @@ -67,7 +67,7 @@ module.exports = function (Categories) { } const data = await db.getSortedSetScan({ key: 'categories:name', - match: '*' + String(query).toLowerCase() + '*', + match: `*${String(query).toLowerCase()}*`, limit: hardCap || 500, }); return data.map(data => parseInt(data.split(':').pop(), 10)); diff --git a/src/categories/topics.js b/src/categories/topics.js index 1326960754..221e25b7b8 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -92,24 +92,24 @@ module.exports = function (Categories) { Categories.buildTopicsSortedSet = async function (data) { const cid = data.cid; - let set = 'cid:' + cid + ':tids'; + let set = `cid:${cid}:tids`; const sort = data.sort || (data.settings && data.settings.categoryTopicSort) || meta.config.categoryTopicSort || 'newest_to_oldest'; if (sort === 'most_posts') { - set = 'cid:' + cid + ':tids:posts'; + set = `cid:${cid}:tids:posts`; } else if (sort === 'most_votes') { - set = 'cid:' + cid + ':tids:votes'; + set = `cid:${cid}:tids:votes`; } if (data.targetUid) { - set = 'cid:' + cid + ':uid:' + data.targetUid + ':tids'; + set = `cid:${cid}:uid:${data.targetUid}:tids`; } if (data.tag) { if (Array.isArray(data.tag)) { - set = [set].concat(data.tag.map(tag => 'tag:' + tag + ':topics')); + set = [set].concat(data.tag.map(tag => `tag:${tag}:topics`)); } else { - set = [set, 'tag:' + data.tag + ':topics']; + set = [set, `tag:${data.tag}:topics`]; } } const result = await plugins.hooks.fire('filter:categories.buildTopicsSortedSet', { @@ -130,7 +130,7 @@ module.exports = function (Categories) { }; Categories.getAllTopicIds = async function (cid, start, stop) { - return await db.getSortedSetRange(['cid:' + cid + ':tids:pinned', 'cid:' + cid + ':tids'], start, stop); + return await db.getSortedSetRange([`cid:${cid}:tids:pinned`, `cid:${cid}:tids`], start, stop); }; Categories.getPinnedTids = async function (data) { @@ -141,7 +141,7 @@ module.exports = function (Categories) { }); return result && result.pinnedTids; } - const pinnedTids = await db.getSortedSetRevRange('cid:' + data.cid + ':tids:pinned', data.start, data.stop); + const pinnedTids = await db.getSortedSetRevRange(`cid:${data.cid}:tids:pinned`, data.start, data.stop); return await topics.tools.checkPinExpiry(pinnedTids); }; @@ -166,11 +166,11 @@ module.exports = function (Categories) { return; } const promises = [ - db.sortedSetAdd('cid:' + cid + ':pids', postData.timestamp, postData.pid), - db.incrObjectField('category:' + cid, 'post_count'), + db.sortedSetAdd(`cid:${cid}:pids`, postData.timestamp, postData.pid), + db.incrObjectField(`category:${cid}`, 'post_count'), ]; if (!pinned) { - promises.push(db.sortedSetIncrBy('cid:' + cid + ':tids:posts', 1, postData.tid)); + promises.push(db.sortedSetIncrBy(`cid:${cid}:tids:posts`, 1, postData.tid)); } await Promise.all(promises); await Categories.updateRecentTidForCid(cid); diff --git a/src/categories/unread.js b/src/categories/unread.js index 4b90efd21b..123afef413 100644 --- a/src/categories/unread.js +++ b/src/categories/unread.js @@ -7,7 +7,7 @@ module.exports = function (Categories) { if (!Array.isArray(cids) || !cids.length || parseInt(uid, 10) <= 0) { return; } - let keys = cids.map(cid => 'cid:' + cid + ':read_by_uid'); + let keys = cids.map(cid => `cid:${cid}:read_by_uid`); const hasRead = await db.isMemberOfSets(keys, uid); keys = keys.filter((key, index) => !hasRead[index]); await db.setsAdd(keys, uid); @@ -17,7 +17,7 @@ module.exports = function (Categories) { if (!parseInt(cid, 10)) { return; } - await db.delete('cid:' + cid + ':read_by_uid'); + await db.delete(`cid:${cid}:read_by_uid`); }; Categories.hasReadCategories = async function (cids, uid) { @@ -25,7 +25,7 @@ module.exports = function (Categories) { return cids.map(() => false); } - const sets = cids.map(cid => 'cid:' + cid + ':read_by_uid'); + const sets = cids.map(cid => `cid:${cid}:read_by_uid`); return await db.isMemberOfSets(sets, uid); }; @@ -33,6 +33,6 @@ module.exports = function (Categories) { if (parseInt(uid, 10) <= 0) { return false; } - return await db.isSetMember('cid:' + cid + ':read_by_uid', uid); + return await db.isSetMember(`cid:${cid}:read_by_uid`, uid); }; }; diff --git a/src/categories/update.js b/src/categories/update.js index 54624dd173..04de42b0fd 100644 --- a/src/categories/update.js +++ b/src/categories/update.js @@ -25,7 +25,7 @@ module.exports = function (Categories) { if (modifiedFields.hasOwnProperty('name')) { const translated = await translator.translate(modifiedFields.name); - modifiedFields.slug = cid + '/' + slugify(translated); + modifiedFields.slug = `${cid}/${slugify(translated)}`; } const result = await plugins.hooks.fire('filter:category.update', { cid: cid, category: modifiedFields }); @@ -54,7 +54,7 @@ module.exports = function (Categories) { return await updateOrder(cid, value); } - await db.setObjectField('category:' + cid, key, value); + await db.setObjectField(`category:${cid}`, key, value); if (key === 'description') { await Categories.parseDescription(cid, value); } @@ -71,26 +71,26 @@ module.exports = function (Categories) { } const oldParent = await Categories.getCategoryField(cid, 'parentCid'); await Promise.all([ - db.sortedSetRemove('cid:' + oldParent + ':children', cid), - db.sortedSetAdd('cid:' + newParent + ':children', cid, cid), - db.setObjectField('category:' + cid, 'parentCid', newParent), + db.sortedSetRemove(`cid:${oldParent}:children`, cid), + db.sortedSetAdd(`cid:${newParent}:children`, cid, cid), + db.setObjectField(`category:${cid}`, 'parentCid', newParent), ]); cache.del([ - 'cid:' + oldParent + ':children', - 'cid:' + newParent + ':children', - 'cid:' + oldParent + ':children:all', - 'cid:' + newParent + ':children:all', + `cid:${oldParent}:children`, + `cid:${newParent}:children`, + `cid:${oldParent}:children:all`, + `cid:${newParent}:children:all`, ]); } async function updateTagWhitelist(cid, tags) { tags = tags.split(',').map(tag => utils.cleanUpTag(tag, meta.config.maximumTagLength)) .filter(Boolean); - await db.delete('cid:' + cid + ':tag:whitelist'); + await db.delete(`cid:${cid}:tag:whitelist`); const scores = tags.map((tag, index) => index); - await db.sortedSetAdd('cid:' + cid + ':tag:whitelist', scores, tags); - cache.del('cid:' + cid + ':tag:whitelist'); + await db.sortedSetAdd(`cid:${cid}:tag:whitelist`, scores, tags); + cache.del(`cid:${cid}:tag:whitelist`); } async function updateOrder(cid, order) { @@ -98,7 +98,7 @@ module.exports = function (Categories) { await db.sortedSetsAdd('categories:cid', order, cid); const childrenCids = await db.getSortedSetRange( - 'cid:' + parentCid + ':children', 0, -1 + `cid:${parentCid}:children`, 0, -1 ); const currentIndex = childrenCids.indexOf(String(cid)); @@ -112,20 +112,20 @@ module.exports = function (Categories) { // recalculate orders from array indices await db.sortedSetAdd( - 'cid:' + parentCid + ':children', + `cid:${parentCid}:children`, childrenCids.map((cid, index) => index + 1), childrenCids ); await db.setObjectBulk( - childrenCids.map(cid => 'category:' + cid), + childrenCids.map(cid => `category:${cid}`), childrenCids.map((cid, index) => ({ order: index + 1 })) ); cache.del([ 'categories:cid', - 'cid:' + parentCid + ':children', - 'cid:' + parentCid + ':children:all', + `cid:${parentCid}:children`, + `cid:${parentCid}:children:all`, ]); } @@ -136,8 +136,8 @@ module.exports = function (Categories) { async function updateName(cid, newName) { const oldName = await Categories.getCategoryField(cid, 'name'); - await db.sortedSetRemove('categories:name', oldName.substr(0, 200).toLowerCase() + ':' + cid); - await db.sortedSetAdd('categories:name', 0, newName.substr(0, 200).toLowerCase() + ':' + cid); - await db.setObjectField('category:' + cid, 'name', newName); + await db.sortedSetRemove('categories:name', `${oldName.substr(0, 200).toLowerCase()}:${cid}`); + await db.sortedSetAdd('categories:name', 0, `${newName.substr(0, 200).toLowerCase()}:${cid}`); + await db.setObjectField(`category:${cid}`, 'name', newName); } }; diff --git a/src/categories/watch.js b/src/categories/watch.js index 76048b942b..4a64fa9ec8 100644 --- a/src/categories/watch.js +++ b/src/categories/watch.js @@ -25,7 +25,7 @@ module.exports = function (Categories) { if (!Array.isArray(cids) || !cids.length) { return []; } - const keys = cids.map(cid => 'cid:' + cid + ':uid:watch:state'); + const keys = cids.map(cid => `cid:${cid}:uid:watch:state`); const [userSettings, states] = await Promise.all([ user.getSettings(uid), db.sortedSetsScore(keys, uid), @@ -35,7 +35,7 @@ module.exports = function (Categories) { Categories.getIgnorers = async function (cid, start, stop) { const count = (stop === -1) ? -1 : (stop - start + 1); - return await db.getSortedSetRevRangeByScore('cid:' + cid + ':uid:watch:state', start, count, Categories.watchStates.ignoring, Categories.watchStates.ignoring); + return await db.getSortedSetRevRangeByScore(`cid:${cid}:uid:watch:state`, start, count, Categories.watchStates.ignoring, Categories.watchStates.ignoring); }; Categories.filterIgnoringUids = async function (cid, uids) { @@ -47,7 +47,7 @@ module.exports = function (Categories) { Categories.getUidsWatchStates = async function (cid, uids) { const [userSettings, states] = await Promise.all([ user.getMultipleUserSettings(uids), - db.sortedSetScores('cid:' + cid + ':uid:watch:state', uids), + db.sortedSetScores(`cid:${cid}:uid:watch:state`, uids), ]); return states.map((state, index) => state || Categories.watchStates[userSettings[index].categoryWatchState]); }; diff --git a/src/cli/colors.js b/src/cli/colors.js index bb2648e1d5..5430e60e09 100644 --- a/src/cli/colors.js +++ b/src/cli/colors.js @@ -18,18 +18,18 @@ Command.prototype.helpInformation = function () { var desc = []; if (this._description) { desc = [ - ' ' + this._description, + ` ${this._description}`, '', ]; } var cmdName = this._name; if (this._alias) { - cmdName = cmdName + ' | ' + this._alias; + cmdName = `${cmdName} | ${this._alias}`; } var usage = [ '', - ' Usage: ' + cmdName[commandColor] + ' '.reset + this.usage(), + ` Usage: ${cmdName[commandColor]}${' '.reset}${this.usage()}`, '', ]; @@ -43,7 +43,7 @@ Command.prototype.helpInformation = function () { '', ' Options:', '', - '' + this.optionHelp().replace(/^/gm, ' '), + `${this.optionHelp().replace(/^/gm, ' ')}`, '', ]; @@ -57,7 +57,7 @@ Command.prototype.helpInformation = function () { function humanReadableArgName(arg) { var nameOutput = arg.name + (arg.variadic === true ? '...' : ''); - return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']'; + return arg.required ? `<${nameOutput}>` : `[${nameOutput}]`; } Command.prototype.usage = function () { @@ -67,7 +67,7 @@ Command.prototype.usage = function () { var usage = '[options]'[optionColor] + (this.commands.length ? ' [command]' : '')[subCommandColor] + - (this._args.length ? ' ' + args.join(' ') : '')[argColor]; + (this._args.length ? ` ${args.join(' ')}` : '')[argColor]; return usage; }; @@ -90,10 +90,10 @@ Command.prototype.commandHelp = function () { }).join(' '); return [ - cmd._name[subCommandColor] + - (cmd._alias ? ' | ' + cmd._alias : '')[subCommandColor] + - (cmd.options.length ? ' [options]' : '')[subOptionColor] + - ' ' + args[subArgColor], + `${cmd._name[subCommandColor] + + (cmd._alias ? ` | ${cmd._alias}` : '')[subCommandColor] + + (cmd.options.length ? ' [options]' : '')[subOptionColor] + } ${args[subArgColor]}`, cmd._description, ]; }); @@ -107,7 +107,7 @@ Command.prototype.commandHelp = function () { ' Commands:', '', commands.map(function (cmd) { - var desc = cmd[1] ? ' ' + cmd[1] : ''; + var desc = cmd[1] ? ` ${cmd[1]}` : ''; return pad(cmd[0], width) + desc; }).join('\n').replace(/^/gm, ' '), '', @@ -120,8 +120,8 @@ Command.prototype.optionHelp = function () { // Append the help information return this.options .map(function (option) { - return pad(option.flags, width)[optionColor] + ' ' + option.description; + return `${pad(option.flags, width)[optionColor]} ${option.description}`; }) - .concat([pad('-h, --help', width)[optionColor] + ' output usage information']) + .concat([`${pad('-h, --help', width)[optionColor]} output usage information`]) .join('\n'); }; diff --git a/src/cli/index.js b/src/cli/index.js index 88683d24ba..9d00c4d44c 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -43,7 +43,7 @@ try { const checkVersion = function (packageName) { const version = JSON.parse(fs.readFileSync(path.join(paths.nodeModules, packageName, 'package.json'), 'utf8')).version; if (!semver.satisfies(version, defaultPackage.dependencies[packageName])) { - const e = new TypeError('Incorrect dependency version: ' + packageName); + const e = new TypeError(`Incorrect dependency version: ${packageName}`); e.code = 'DEP_WRONG_VERSION'; throw e; } @@ -194,7 +194,7 @@ program }); program .command('build [targets...]') - .description('Compile static assets ' + '(JS, CSS, templates, languages)'.red) + .description(`Compile static assets ${'(JS, CSS, templates, languages)'.red}`) .option('-s, --series', 'Run builds in series without extra processes') .action(function (targets, options) { require('./manage').build(targets.length ? targets : true, options); @@ -265,12 +265,12 @@ program .option('-s, --schema', 'Update NodeBB data store schema', false) .option('-b, --build', 'Rebuild assets', false) .on('--help', function () { - console.log('\n' + [ + console.log(`\n${[ 'When running particular upgrade scripts, options are ignored.', 'By default all options are enabled. Passing any options disables that default.', - 'Only package and dependency updates: ' + './nodebb upgrade -mi'.yellow, - 'Only database update: ' + './nodebb upgrade -s'.yellow, - ].join('\n')); + `Only package and dependency updates: ${'./nodebb upgrade -mi'.yellow}`, + `Only database update: ${'./nodebb upgrade -s'.yellow}`, + ].join('\n')}`); }) .action(function (scripts, options) { require('./upgrade').upgrade(scripts.length ? scripts : true, options); diff --git a/src/cli/manage.js b/src/cli/manage.js index acce6810c9..a03c3c91ff 100644 --- a/src/cli/manage.js +++ b/src/cli/manage.js @@ -23,7 +23,7 @@ async function activate(plugin) { await db.init(); if (!pluginNamePattern.test(plugin)) { // Allow omission of `nodebb-plugin-` - plugin = 'nodebb-plugin-' + plugin; + plugin = `nodebb-plugin-${plugin}`; } const isInstalled = await plugins.isInstalled(plugin); if (!isInstalled) { @@ -42,7 +42,7 @@ async function activate(plugin) { text: plugin, }); } catch (err) { - winston.error('An error occurred during plugin activation\n' + err.stack); + winston.error(`An error occurred during plugin activation\n${err.stack}`); } process.exit(0); } @@ -72,7 +72,7 @@ async function listPlugins() { // Pretty output process.stdout.write('Active plugins:\n'); combined.forEach((plugin) => { - process.stdout.write('\t* ' + plugin.id + (plugin.version ? '@' + plugin.version : '') + ' ('); + process.stdout.write(`\t* ${plugin.id}${plugin.version ? `@${plugin.version}` : ''} (`); process.stdout.write(plugin.installed ? 'installed'.green : 'not installed'.red); process.stdout.write(', '); process.stdout.write(plugin.active ? 'enabled'.green : 'disabled'.yellow); @@ -85,9 +85,9 @@ async function listPlugins() { async function listEvents(count) { await db.init(); const eventData = await events.getEvents('', 0, (count || 10) - 1); - console.log(('\nDisplaying last ' + count + ' administrative events...').bold); + console.log((`\nDisplaying last ${count} administrative events...`).bold); eventData.forEach(function (event) { - console.log(' * ' + String(event.timestampISO).green + ' ' + String(event.type).yellow + (event.text ? ' ' + event.text : '') + ' (uid: '.reset + (event.uid ? event.uid : 0) + ')'); + console.log(` * ${String(event.timestampISO).green} ${String(event.type).yellow}${event.text ? ` ${event.text}` : ''}${' (uid: '.reset}${event.uid ? event.uid : 0})`); }); process.exit(); } @@ -95,28 +95,28 @@ async function listEvents(count) { async function info() { console.log(''); const version = require('../../package.json').version; - console.log(' version: ' + version); + console.log(` version: ${version}`); - console.log(' Node ver: ' + process.version); + console.log(` Node ver: ${process.version}`); const hash = childProcess.execSync('git rev-parse HEAD'); - console.log(' git hash: ' + hash); + console.log(` git hash: ${hash}`); const config = require('../../config.json'); - console.log(' database: ' + config.database); + console.log(` database: ${config.database}`); await db.init(); const info = await db.info(db.client); switch (config.database) { case 'redis': - console.log(' version: ' + info.redis_version); - console.log(' disk sync: ' + info.rdb_last_bgsave_status); + console.log(` version: ${info.redis_version}`); + console.log(` disk sync: ${info.rdb_last_bgsave_status}`); break; case 'mongo': - console.log(' version: ' + info.version); - console.log(' engine: ' + info.storageEngine); + console.log(` version: ${info.version}`); + console.log(` engine: ${info.storageEngine}`); break; } @@ -138,7 +138,7 @@ async function info() { console.log(''); console.log(graph.toString()); - console.log('Pageviews, last 24h (min: ' + min + ' max: ' + max + ')'); + console.log(`Pageviews, last 24h (min: ${min} max: ${max})`); process.exit(); } diff --git a/src/cli/package-install.js b/src/cli/package-install.js index d3ac543767..521763c075 100644 --- a/src/cli/package-install.js +++ b/src/cli/package-install.js @@ -75,9 +75,9 @@ function installAll() { }); } catch (e) { console.log('Error installing dependencies!'); - console.log('message: ' + e.message); - console.log('stdout: ' + e.stdout); - console.log('stderr: ' + e.stderr); + console.log(`message: ${e.message}`); + console.log(`stdout: ${e.stdout}`); + console.log(`stderr: ${e.stderr}`); throw e; } } diff --git a/src/cli/reset.js b/src/cli/reset.js index a7822ba2c1..290f5bf7a2 100644 --- a/src/cli/reset.js +++ b/src/cli/reset.js @@ -22,7 +22,7 @@ exports.reset = async function (options) { } else { if (!themeNamePattern.test(themeId)) { // Allow omission of `nodebb-theme-` - themeId = 'nodebb-theme-' + themeId; + themeId = `nodebb-theme-${themeId}`; } await resetTheme(themeId); @@ -35,7 +35,7 @@ exports.reset = async function (options) { } else { if (!pluginNamePattern.test(pluginId)) { // Allow omission of `nodebb-plugin-` - pluginId = 'nodebb-plugin-' + pluginId; + pluginId = `nodebb-plugin-${pluginId}`; } await resetPlugin(pluginId); @@ -56,7 +56,7 @@ exports.reset = async function (options) { if (!tasks.length) { console.log([ 'No arguments passed in, so nothing was reset.\n'.yellow, - 'Use ./nodebb reset ' + '{-t|-p|-w|-s|-a}'.red, + `Use ./nodebb reset ${'{-t|-p|-w|-s|-a}'.red}`, ' -t\tthemes', ' -p\tplugins', ' -w\twidgets', @@ -80,7 +80,7 @@ exports.reset = async function (options) { winston.info('[reset] Reset complete. Please run `./nodebb build` to rebuild assets.'); process.exit(0); } catch (err) { - winston.error('[reset] Errors were encountered during reset -- ' + err.message); + winston.error(`[reset] Errors were encountered during reset -- ${err.message}`); process.exit(1); } }; @@ -111,7 +111,7 @@ async function resetThemeTo(themeId) { id: themeId, }); await meta.configs.set('bootswatchSkin', ''); - winston.info('[reset] Theme reset to ' + themeId + ' and default skin'); + winston.info(`[reset] Theme reset to ${themeId} and default skin`); } async function resetPlugin(pluginId) { @@ -133,7 +133,7 @@ async function resetPlugin(pluginId) { winston.info('[reset] No action taken.'); } } catch (err) { - winston.error('[reset] Could not disable plugin: ' + pluginId + ' encountered error %s\n' + err.stack); + winston.error(`[reset] Could not disable plugin: ${pluginId} encountered error %s\n${err.stack}`); throw err; } } diff --git a/src/cli/running.js b/src/cli/running.js index 7a40874512..47dd180858 100644 --- a/src/cli/running.js +++ b/src/cli/running.js @@ -38,19 +38,19 @@ function start(options) { return; } if (options.log) { - console.log('\n' + [ + console.log(`\n${[ 'Starting NodeBB with logging output'.bold, 'Hit '.red + 'Ctrl-C '.bold + 'to exit'.red, 'The NodeBB process will continue to run in the background', - 'Use "' + './nodebb stop'.yellow + '" to stop the NodeBB server', - ].join('\n')); + `Use "${'./nodebb stop'.yellow}" to stop the NodeBB server`, + ].join('\n')}`); } else if (!options.silent) { - console.log('\n' + [ + console.log(`\n${[ 'Starting NodeBB'.bold, - ' "' + './nodebb stop'.yellow + '" to stop the NodeBB server', - ' "' + './nodebb log'.yellow + '" to view server output', - ' "' + './nodebb help'.yellow + '" for more commands\n'.reset, - ].join('\n')); + ` "${'./nodebb stop'.yellow}" to stop the NodeBB server`, + ` "${'./nodebb log'.yellow}" to view server output`, + ` "${'./nodebb help'.yellow}${'" for more commands\n'.reset}`, + ].join('\n')}`); } // Spawn a new NodeBB process @@ -96,15 +96,15 @@ function restart(options) { function status() { getRunningPid(function (err, pid) { if (!err) { - console.log('\n' + [ - 'NodeBB Running '.bold + ('(pid ' + pid.toString() + ')').cyan, - '\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server', - '\t"' + './nodebb log'.yellow + '" to view server output', - '\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n', - ].join('\n')); + console.log(`\n${[ + 'NodeBB Running '.bold + (`(pid ${pid.toString()})`).cyan, + `\t"${'./nodebb stop'.yellow}" to stop the NodeBB server`, + `\t"${'./nodebb log'.yellow}" to view server output`, + `\t"${'./nodebb restart'.yellow}" to restart NodeBB\n`, + ].join('\n')}`); } else { console.log('\nNodeBB is not running'.bold); - console.log('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n'.reset); + console.log(`\t"${'./nodebb start'.yellow}${'" to launch the NodeBB server\n'.reset}`); } }); } diff --git a/src/cli/setup.js b/src/cli/setup.js index e3e59f38cd..7ec26a3f88 100644 --- a/src/cli/setup.js +++ b/src/cli/setup.js @@ -16,7 +16,7 @@ function setup(initConfig) { winston.info('NodeBB Setup Triggered via Command Line'); - console.log('\nWelcome to NodeBB v' + pkg.version + '!'); + console.log(`\nWelcome to NodeBB v${pkg.version}!`); console.log('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.'); console.log('Press enter to accept the default setting (shown in brackets).'); @@ -50,16 +50,16 @@ function setup(initConfig) { separator += '='; } } - console.log('\n' + separator + '\n'); + console.log(`\n${separator}\n`); if (err) { - winston.error('There was a problem completing NodeBB setup\n' + err.stack); + winston.error(`There was a problem completing NodeBB setup\n${err.stack}`); throw err; } else { if (data.hasOwnProperty('password')) { console.log('An administrative user was automatically created for you:'); - console.log(' Username: ' + data.username + ''); - console.log(' Password: ' + data.password + ''); + console.log(` Username: ${data.username}`); + console.log(` Password: ${data.password}`); console.log(''); } console.log('NodeBB Setup Completed. Run "./nodebb start" to manually start your NodeBB server.'); diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js index c45dd10405..f82584a4cd 100644 --- a/src/cli/upgrade-plugins.js +++ b/src/cli/upgrade-plugins.js @@ -126,7 +126,7 @@ function checkPlugins(standalone, callback) { request({ method: 'GET', - url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), + url: `https://packages.nodebb.org/api/v1/suggest?version=${payload.version}&package[]=${toCheck.join('&package[]=')}`, json: true, }, function (err, res, body) { if (err) { @@ -175,9 +175,9 @@ function upgradePlugins(callback) { } if (found && found.length) { - process.stdout.write('\n\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n\n'); + process.stdout.write(`\n\nA total of ${String(found.length).bold} package(s) can be upgraded:\n\n`); found.forEach(function (suggestObj) { - process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); + process.stdout.write(`${' * '.yellow + suggestObj.name.reset} (${suggestObj.current.yellow}${' -> '.reset}${suggestObj.suggested.green}${')\n'.reset}`); }); } else { if (standalone) { @@ -202,7 +202,7 @@ function upgradePlugins(callback) { if (['y', 'Y', 'yes', 'YES'].includes(result.upgrade)) { console.log('\nUpgrading packages...'); const args = packageManagerInstallArgs.concat(found.map(function (suggestObj) { - return suggestObj.name + '@' + suggestObj.suggested; + return `${suggestObj.name}@${suggestObj.suggested}`; })); cproc.execFile(packageManagerExecutable, args, { stdio: 'ignore' }, function (err) { diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js index dd3410cf84..6ad0ef36a3 100644 --- a/src/cli/upgrade.js +++ b/src/cli/upgrade.js @@ -55,7 +55,7 @@ var steps = { function runSteps(tasks) { tasks = tasks.map(function (key, i) { return function (next) { - process.stdout.write('\n' + ((i + 1) + '. ').bold + steps[key].message.yellow); + process.stdout.write(`\n${(`${i + 1}. `).bold}${steps[key].message.yellow}`); return steps[key].handler(function (err) { if (err) { return next(err); } next(); @@ -65,7 +65,7 @@ function runSteps(tasks) { async.series(tasks, function (err) { if (err) { - console.error('Error occurred during upgrade: ' + err.stack); + console.error(`Error occurred during upgrade: ${err.stack}`); throw err; } @@ -74,7 +74,7 @@ function runSteps(tasks) { var columns = process.stdout.columns; var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; - console.log('\n\n' + spaces + message.green.bold + '\n'.reset); + console.log(`\n\n${spaces}${message.green.bold}${'\n'.reset}`); process.exit(); }); diff --git a/src/controllers/404.js b/src/controllers/404.js index 529d8f339b..64802ffadb 100644 --- a/src/controllers/404.js +++ b/src/controllers/404.js @@ -10,7 +10,7 @@ const middleware = require('../middleware'); exports.handle404 = function handle404(req, res) { const relativePath = nconf.get('relative_path'); - const isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$'); + const isClientScript = new RegExp(`^${relativePath}\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$`); if (plugins.hooks.hasListeners('action:meta.override404')) { return plugins.hooks.fire('action:meta.override404', { @@ -22,12 +22,12 @@ exports.handle404 = function handle404(req, res) { if (isClientScript.test(req.url)) { res.type('text/javascript').status(404).send('Not Found'); - } else if (req.path.startsWith(relativePath + '/assets/uploads') || (req.get('accept') && !req.get('accept').includes('text/html')) || req.path === '/favicon.ico') { + } else if (req.path.startsWith(`${relativePath}/assets/uploads`) || (req.get('accept') && !req.get('accept').includes('text/html')) || req.path === '/favicon.ico') { meta.errors.log404(req.path || ''); res.sendStatus(404); } else if (req.accepts('html')) { if (process.env.NODE_ENV === 'development') { - winston.warn('Route requested but not found: ' + req.url); + winston.warn(`Route requested but not found: ${req.url}`); } meta.errors.log404(req.path.replace(/^\/api/, '') || ''); diff --git a/src/controllers/accounts/blocks.js b/src/controllers/accounts/blocks.js index fac52e8227..7665d4d2b9 100644 --- a/src/controllers/accounts/blocks.js +++ b/src/controllers/accounts/blocks.js @@ -28,12 +28,12 @@ blocksController.getBlocks = async function (req, res, next) { data.uids = data.uids.slice(start, stop + 1); userData.users = await user.getUsers(data.uids, req.uid); - userData.title = '[[pages:account/blocks, ' + userData.username + ']]'; + userData.title = `[[pages:account/blocks, ${userData.username}]]`; const pageCount = Math.ceil(userData.counts.blocks / resultsPerPage); userData.pagination = pagination.create(page, pageCount); - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:blocks]]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[user:blocks]]' }]); res.render('account/blocks', userData); }; diff --git a/src/controllers/accounts/categories.js b/src/controllers/accounts/categories.js index 4e4f4b458b..347edc3e22 100644 --- a/src/controllers/accounts/categories.js +++ b/src/controllers/accounts/categories.js @@ -34,9 +34,9 @@ categoriesController.get = async function (req, res, next) { } }); userData.categories = categoriesData; - userData.title = '[[pages:account/watched_categories, ' + userData.username + ']]'; + userData.title = `[[pages:account/watched_categories, ${userData.username}]]`; userData.breadcrumbs = helpers.buildBreadcrumbs([ - { text: userData.username, url: '/user/' + userData.userslug }, + { text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[pages:categories]]' }, ]); userData.pagination = pagination.create(page, pageCount, req.query); diff --git a/src/controllers/accounts/chats.js b/src/controllers/accounts/chats.js index d470445264..9efd537813 100644 --- a/src/controllers/accounts/chats.js +++ b/src/controllers/accounts/chats.js @@ -61,5 +61,5 @@ chatsController.redirectToChat = async function (req, res, next) { return next(); } const roomid = parseInt(req.params.roomid, 10); - helpers.redirect(res, '/user/' + userslug + '/chats' + (roomid ? '/' + roomid : '')); + helpers.redirect(res, `/user/${userslug}/chats${roomid ? `/${roomid}` : ''}`); }; diff --git a/src/controllers/accounts/consent.js b/src/controllers/accounts/consent.js index a4989ff31f..3456fceb54 100644 --- a/src/controllers/accounts/consent.js +++ b/src/controllers/accounts/consent.js @@ -16,7 +16,7 @@ consentController.get = async function (req, res, next) { if (!userData) { return next(); } - const consented = await db.getObjectField('user:' + userData.uid, 'gdpr_consent'); + const consented = await db.getObjectField(`user:${userData.uid}`, 'gdpr_consent'); userData.gdpr_consent = parseInt(consented, 10) === 1; userData.digest = { frequency: meta.config.dailyDigestFreq || 'off', @@ -24,7 +24,7 @@ consentController.get = async function (req, res, next) { }; userData.title = '[[user:consent.title]]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:consent.title]]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[user:consent.title]]' }]); res.render('account/consent', userData); }; diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js index d885df5f50..d680cfcbb9 100644 --- a/src/controllers/accounts/edit.js +++ b/src/controllers/accounts/edit.js @@ -24,7 +24,7 @@ editController.get = async function (req, res, next) { userData.allowProfilePicture = !userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:profile-picture']; userData.allowCoverPicture = !userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:cover-picture']; userData.allowProfileImageUploads = meta.config.allowProfileImageUploads; - userData.allowedProfileImageExtensions = user.getAllowedProfileImageExtensions().map(ext => '.' + ext).join(', '); + userData.allowedProfileImageExtensions = user.getAllowedProfileImageExtensions().map(ext => `.${ext}`).join(', '); userData.allowMultipleBadges = meta.config.allowMultipleBadges === 1; userData.allowAccountDelete = meta.config.allowAccountDelete === 1; userData.allowWebsite = !userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:website']; @@ -55,11 +55,11 @@ editController.get = async function (req, res, next) { }); userData.groupSelectSize = Math.min(10, Math.max(5, userData.groups.length + 1)); - userData.title = '[[pages:account/edit, ' + userData.username + ']]'; + userData.title = `[[pages:account/edit, ${userData.username}]]`; userData.breadcrumbs = helpers.buildBreadcrumbs([ { text: userData.username, - url: '/user/' + userData.userslug, + url: `/user/${userData.userslug}`, }, { text: '[[user:edit]]', @@ -86,7 +86,7 @@ async function renderRoute(name, req, res, next) { if (!userData) { return next(); } - if (meta.config[name + ':disableEdit'] && !userData.isAdmin) { + if (meta.config[`${name}:disableEdit`] && !userData.isAdmin) { return helpers.notAllowed(req, res); } @@ -95,22 +95,22 @@ async function renderRoute(name, req, res, next) { userData.minimumPasswordStrength = meta.config.minimumPasswordStrength; } - userData.title = '[[pages:account/edit/' + name + ', ' + userData.username + ']]'; + userData.title = `[[pages:account/edit/${name}, ${userData.username}]]`; userData.breadcrumbs = helpers.buildBreadcrumbs([ { text: userData.username, - url: '/user/' + userData.userslug, + url: `/user/${userData.userslug}`, }, { text: '[[user:edit]]', - url: '/user/' + userData.userslug + '/edit', + url: `/user/${userData.userslug}/edit`, }, { - text: '[[user:' + name + ']]', + text: `[[user:${name}]]`, }, ]); - res.render('account/edit/' + name, userData); + res.render(`account/edit/${name}`, userData); } async function getUserData(req) { diff --git a/src/controllers/accounts/follow.js b/src/controllers/accounts/follow.js index 65dedbe14f..77543b5271 100644 --- a/src/controllers/accounts/follow.js +++ b/src/controllers/accounts/follow.js @@ -26,7 +26,7 @@ async function getFollow(tpl, name, req, res, next) { const start = Math.max(0, page - 1) * resultsPerPage; const stop = start + resultsPerPage - 1; - userData.title = '[[pages:' + tpl + ', ' + userData.username + ']]'; + userData.title = `[[pages:${tpl}, ${userData.username}]]`; const method = name === 'following' ? 'getFollowing' : 'getFollowers'; userData.users = await user[method](userData.uid, start, stop); @@ -35,7 +35,7 @@ async function getFollow(tpl, name, req, res, next) { const pageCount = Math.ceil(count / resultsPerPage); userData.pagination = pagination.create(page, pageCount); - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:' + name + ']]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: `[[user:${name}]]` }]); res.render(tpl, userData); } diff --git a/src/controllers/accounts/groups.js b/src/controllers/accounts/groups.js index fea0d19408..f86664b019 100644 --- a/src/controllers/accounts/groups.js +++ b/src/controllers/accounts/groups.js @@ -19,7 +19,7 @@ groupsController.get = async function (req, res, next) { group.members = members[index]; }); userData.groups = groupsData; - userData.title = '[[pages:account/groups, ' + userData.username + ']]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[global:header.groups]]' }]); + userData.title = `[[pages:account/groups, ${userData.username}]]`; + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[global:header.groups]]' }]); res.render('account/groups', userData); }; diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index f83db12480..02611c6bac 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -93,7 +93,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID) { userData.sso = results.sso.associations; userData.banned = Boolean(userData.banned); userData.website = validator.escape(String(userData.website || '')); - userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; + userData.websiteLink = !userData.website.startsWith('http') ? `http://${userData.website}` : userData.website; userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), ''); userData.fullname = validator.escape(String(userData.fullname || '')); @@ -143,17 +143,17 @@ async function getCounts(userData, callerUID) { const uid = userData.uid; const cids = await categories.getCidsByPrivilege('categories:cid', callerUID, 'topics:read'); const promises = { - posts: db.sortedSetsCardSum(cids.map(c => 'cid:' + c + ':uid:' + uid + ':pids')), - best: db.sortedSetsCardSum(cids.map(c => 'cid:' + c + ':uid:' + uid + ':pids:votes')), - topics: db.sortedSetsCardSum(cids.map(c => 'cid:' + c + ':uid:' + uid + ':tids')), + posts: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:pids`)), + best: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:pids:votes`)), + topics: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:tids`)), }; if (userData.isAdmin || userData.isSelf) { - promises.ignored = db.sortedSetCard('uid:' + uid + ':ignored_tids'); - promises.watched = db.sortedSetCard('uid:' + uid + ':followed_tids'); - promises.upvoted = db.sortedSetCard('uid:' + uid + ':upvote'); - promises.downvoted = db.sortedSetCard('uid:' + uid + ':downvote'); - promises.bookmarks = db.sortedSetCard('uid:' + uid + ':bookmarks'); - promises.uploaded = db.sortedSetCard('uid:' + uid + ':uploads'); + promises.ignored = db.sortedSetCard(`uid:${uid}:ignored_tids`); + promises.watched = db.sortedSetCard(`uid:${uid}:followed_tids`); + promises.upvoted = db.sortedSetCard(`uid:${uid}:upvote`); + promises.downvoted = db.sortedSetCard(`uid:${uid}:downvote`); + promises.bookmarks = db.sortedSetCard(`uid:${uid}:bookmarks`); + promises.uploaded = db.sortedSetCard(`uid:${uid}:uploads`); promises.categoriesWatched = user.getWatchedCategories(uid); promises.blocks = user.getUserField(userData.uid, 'blocksCount'); } diff --git a/src/controllers/accounts/info.js b/src/controllers/accounts/info.js index 98eb83b9c7..6fd247eb31 100644 --- a/src/controllers/accounts/info.js +++ b/src/controllers/accounts/info.js @@ -21,8 +21,8 @@ infoController.get = async function (req, res, next) { const [history, sessions, usernames, emails, notes] = await Promise.all([ user.getModerationHistory(userData.uid), user.auth.getSessions(userData.uid, req.sessionID), - user.getHistory('user:' + userData.uid + ':usernames'), - user.getHistory('user:' + userData.uid + ':emails'), + user.getHistory(`user:${userData.uid}:usernames`), + user.getHistory(`user:${userData.uid}:emails`), getNotes(userData, start, stop), ]); @@ -37,7 +37,7 @@ infoController.get = async function (req, res, next) { userData.pagination = pagination.create(page, pageCount, req.query); } userData.title = '[[pages:account/info]]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:account_info]]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[user:account_info]]' }]); res.render('account/info', userData); }; @@ -48,7 +48,7 @@ async function getNotes(userData, start, stop) { } const [notes, count] = await Promise.all([ user.getModerationNotes(userData.uid, start, stop), - db.sortedSetCard('uid:' + userData.uid + ':moderation:notes'), + db.sortedSetCard(`uid:${userData.uid}:moderation:notes`), ]); return { notes: notes, count: count }; } diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index 1179d47c76..daf7ffbf45 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -17,7 +17,7 @@ const templateToData = { noItemsFoundKey: '[[topic:bookmarks.has_no_bookmarks]]', crumb: '[[user:bookmarks]]', getSets: function (callerUid, userData) { - return 'uid:' + userData.uid + ':bookmarks'; + return `uid:${userData.uid}:bookmarks`; }, }, 'account/posts': { @@ -26,7 +26,7 @@ const templateToData = { crumb: '[[global:posts]]', getSets: async function (callerUid, userData) { const cids = await categories.getCidsByPrivilege('categories:cid', callerUid, 'topics:read'); - return cids.map(c => 'cid:' + c + ':uid:' + userData.uid + ':pids'); + return cids.map(c => `cid:${c}:uid:${userData.uid}:pids`); }, }, 'account/upvoted': { @@ -34,7 +34,7 @@ const templateToData = { noItemsFoundKey: '[[user:has_no_upvoted_posts]]', crumb: '[[global:upvoted]]', getSets: function (callerUid, userData) { - return 'uid:' + userData.uid + ':upvote'; + return `uid:${userData.uid}:upvote`; }, }, 'account/downvoted': { @@ -42,7 +42,7 @@ const templateToData = { noItemsFoundKey: '[[user:has_no_downvoted_posts]]', crumb: '[[global:downvoted]]', getSets: function (callerUid, userData) { - return 'uid:' + userData.uid + ':downvote'; + return `uid:${userData.uid}:downvote`; }, }, 'account/best': { @@ -51,7 +51,7 @@ const templateToData = { crumb: '[[global:best]]', getSets: async function (callerUid, userData) { const cids = await categories.getCidsByPrivilege('categories:cid', callerUid, 'topics:read'); - return cids.map(c => 'cid:' + c + ':uid:' + userData.uid + ':pids:votes'); + return cids.map(c => `cid:${c}:uid:${userData.uid}:pids:votes`); }, }, 'account/watched': { @@ -59,7 +59,7 @@ const templateToData = { noItemsFoundKey: '[[user:has_no_watched_topics]]', crumb: '[[user:watched]]', getSets: function (callerUid, userData) { - return 'uid:' + userData.uid + ':followed_tids'; + return `uid:${userData.uid}:followed_tids`; }, getTopics: async function (set, req, start, stop) { const sort = req.query.sort; @@ -92,7 +92,7 @@ const templateToData = { noItemsFoundKey: '[[user:has_no_ignored_topics]]', crumb: '[[user:ignored]]', getSets: function (callerUid, userData) { - return 'uid:' + userData.uid + ':ignored_tids'; + return `uid:${userData.uid}:ignored_tids`; }, }, 'account/topics': { @@ -101,7 +101,7 @@ const templateToData = { crumb: '[[global:topics]]', getSets: async function (callerUid, userData) { const cids = await categories.getCidsByPrivilege('categories:cid', callerUid, 'topics:read'); - return cids.map(c => 'cid:' + c + ':uid:' + userData.uid + ':tids'); + return cids.map(c => `cid:${c}:uid:${userData.uid}:tids`); }, }, }; @@ -167,19 +167,19 @@ async function getFromUserSet(template, req, res, callback) { userData.pagination = pagination.create(page, pageCount, req.query); userData.noItemsFoundKey = data.noItemsFoundKey; - userData.title = '[[pages:' + template + ', ' + userData.username + ']]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: data.crumb }]); + userData.title = `[[pages:${template}, ${userData.username}]]`; + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: data.crumb }]); userData.showSort = template === 'account/watched'; const baseUrl = (req.baseUrl + req.path.replace(/^\/api/, '')); userData.sortOptions = [ - { url: baseUrl + '?sort=votes', name: '[[global:votes]]' }, - { url: baseUrl + '?sort=posts', name: '[[global:posts]]' }, - { url: baseUrl + '?sort=views', name: '[[global:views]]' }, - { url: baseUrl + '?sort=lastpost', name: '[[global:lastpost]]' }, - { url: baseUrl + '?sort=firstpost', name: '[[global:firstpost]]' }, + { url: `${baseUrl}?sort=votes`, name: '[[global:votes]]' }, + { url: `${baseUrl}?sort=posts`, name: '[[global:posts]]' }, + { url: `${baseUrl}?sort=views`, name: '[[global:views]]' }, + { url: `${baseUrl}?sort=lastpost`, name: '[[global:lastpost]]' }, + { url: `${baseUrl}?sort=firstpost`, name: '[[global:firstpost]]' }, ]; userData.sortOptions.forEach(function (option) { - option.selected = option.url.includes('sort=' + req.query.sort); + option.selected = option.url.includes(`sort=${req.query.sort}`); }); res.render(template, userData); diff --git a/src/controllers/accounts/profile.js b/src/controllers/accounts/profile.js index e1baf1a5ef..b721b04c46 100644 --- a/src/controllers/accounts/profile.js +++ b/src/controllers/accounts/profile.js @@ -21,7 +21,7 @@ profileController.get = async function (req, res, next) { if (res.locals.isAPI) { req.params.userslug = lowercaseSlug; } else { - return res.redirect(nconf.get('relative_path') + '/user/' + lowercaseSlug); + return res.redirect(`${nconf.get('relative_path')}/user/${lowercaseSlug}`); } } @@ -82,7 +82,7 @@ async function getBestPosts(callerUid, userData) { async function getPosts(callerUid, userData, setSuffix) { const cids = await categories.getCidsByPrivilege('categories:cid', callerUid, 'topics:read'); - const keys = cids.map(c => 'cid:' + c + ':uid:' + userData.uid + ':' + setSuffix); + const keys = cids.map(c => `cid:${c}:uid:${userData.uid}:${setSuffix}`); let hasMorePosts = true; let start = 0; const count = 10; diff --git a/src/controllers/accounts/sessions.js b/src/controllers/accounts/sessions.js index 72e1afaaac..26bbc3c8b9 100644 --- a/src/controllers/accounts/sessions.js +++ b/src/controllers/accounts/sessions.js @@ -14,7 +14,7 @@ sessionController.get = async function (req, res, next) { userData.sessions = await user.auth.getSessions(userData.uid, req.sessionID); userData.title = '[[pages:account/sessions]]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[pages:account/sessions]]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[pages:account/sessions]]' }]); res.render('account/sessions', userData); }; diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index b80bb4b46a..c09cb4c97a 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -116,7 +116,7 @@ settingsController.get = async function (req, res, next) { userData.maxPostsPerPage = meta.config.maxPostsPerPage; userData.title = '[[pages:account/settings]]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:settings]]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[user:settings]]' }]); res.render('account/settings', userData); }; @@ -132,8 +132,8 @@ const doUnsubscribe = async (payload) => { user.updateDigestSetting(payload.uid, 'off'), ]); } else if (payload.template === 'notification') { - const current = await db.getObjectField('user:' + payload.uid + ':settings', 'notificationType_' + payload.type); - await user.setSetting(payload.uid, 'notificationType_' + payload.type, (current === 'notificationemail' ? 'notification' : 'none')); + const current = await db.getObjectField(`user:${payload.uid}:settings`, `notificationType_${payload.type}`); + await user.setSetting(payload.uid, `notificationType_${payload.type}`, (current === 'notificationemail' ? 'notification' : 'none')); } return true; }; @@ -173,7 +173,7 @@ settingsController.unsubscribePost = async function (req, res) { await doUnsubscribe(payload); res.sendStatus(200); } catch (err) { - winston.error('[settings/unsubscribe] One-click unsubscribe failed with error: ' + err.message); + winston.error(`[settings/unsubscribe] One-click unsubscribe failed with error: ${err.message}`); res.sendStatus(500); } }; @@ -200,7 +200,7 @@ async function getNotificationSettings(userData) { const setting = userData.settings[type]; return { name: type, - label: '[[notifications:' + type + ']]', + label: `[[notifications:${type}]]`, none: setting === 'none', notification: setting === 'notification', email: setting === 'email', diff --git a/src/controllers/accounts/uploads.js b/src/controllers/accounts/uploads.js index 02cc1e9ca7..aed470a44e 100644 --- a/src/controllers/accounts/uploads.js +++ b/src/controllers/accounts/uploads.js @@ -21,8 +21,8 @@ uploadsController.get = async function (req, res, next) { const start = (page - 1) * itemsPerPage; const stop = start + itemsPerPage - 1; const [itemCount, uploadNames] = await Promise.all([ - db.sortedSetCard('uid:' + userData.uid + ':uploads'), - db.getSortedSetRevRange('uid:' + userData.uid + ':uploads', start, stop), + db.sortedSetCard(`uid:${userData.uid}:uploads`), + db.getSortedSetRevRange(`uid:${userData.uid}:uploads`, start, stop), ]); userData.uploads = uploadNames.map(function (uploadName) { @@ -34,7 +34,7 @@ uploadsController.get = async function (req, res, next) { const pageCount = Math.ceil(itemCount / itemsPerPage); userData.pagination = pagination.create(page, pageCount, req.query); userData.privateUploads = meta.config.privateUploads === 1; - userData.title = '[[pages:account/uploads, ' + userData.username + ']]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[global:uploads]]' }]); + userData.title = `[[pages:account/uploads, ${userData.username}]]`; + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[global:uploads]]' }]); res.render('account/uploads', userData); }; diff --git a/src/controllers/admin/appearance.js b/src/controllers/admin/appearance.js index 90b143ceb9..5bcfa5321e 100644 --- a/src/controllers/admin/appearance.js +++ b/src/controllers/admin/appearance.js @@ -5,5 +5,5 @@ const appearanceController = module.exports; appearanceController.get = function (req, res) { const term = req.params.term ? req.params.term : 'themes'; - res.render('admin/appearance/' + term, {}); + res.render(`admin/appearance/${term}`, {}); }; diff --git a/src/controllers/admin/cache.js b/src/controllers/admin/cache.js index 840ff65efa..a0f6692943 100644 --- a/src/controllers/admin/cache.js +++ b/src/controllers/admin/cache.js @@ -48,7 +48,7 @@ cacheController.dump = function (req, res, 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-disposition', `attachment; filename= ${req.query.name}-cache.json`); res.setHeader('Content-type', 'application/json'); res.write(data, function (err) { if (err) { diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js index 7755d93d3d..9eec6a9818 100644 --- a/src/controllers/admin/categories.js +++ b/src/controllers/admin/categories.js @@ -109,7 +109,7 @@ async function buildBreadcrumbs(req, categoryData) { const breadcrumbs = [ { text: categoryData.name, - url: nconf.get('relative_path') + '/admin/manage/categories?cid=' + categoryData.cid, + url: `${nconf.get('relative_path')}/admin/manage/categories?cid=${categoryData.cid}`, cid: categoryData.cid, }, ]; @@ -117,7 +117,7 @@ async function buildBreadcrumbs(req, categoryData) { const crumbs = allCrumbs.filter(c => c.cid); crumbs.forEach(function (c) { - c.url = '/admin/manage/categories?cid=' + c.cid; + c.url = `/admin/manage/categories?cid=${c.cid}`; }); crumbs.unshift({ text: '[[admin/manage/categories:top-level]]', diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index 49e34db80a..f291a55f27 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -69,7 +69,7 @@ async function getLatestVersion() { try { return await versions.getLatestVersion(); } catch (err) { - winston.error('[acp] Failed to fetch latest version\n' + err.stack); + winston.error(`[acp] Failed to fetch latest version\n${err.stack}`); } return null; } @@ -94,7 +94,7 @@ dashboardController.getAnalytics = async (req, res, next) => { } const method = req.query.units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet; - let payload = await Promise.all(sets.map(set => method('analytics:' + set, until, count))); + let payload = await Promise.all(sets.map(set => method(`analytics:${set}`, until, count))); payload = _.zipObject(sets, payload); res.json({ diff --git a/src/controllers/admin/events.js b/src/controllers/admin/events.js index 7a6c5a3c99..f6828d42d1 100644 --- a/src/controllers/admin/events.js +++ b/src/controllers/admin/events.js @@ -21,7 +21,7 @@ eventsController.get = async function (req, res) { const currentFilter = req.query.type || ''; const [eventCount, eventData] = await Promise.all([ - db.sortedSetCount('events:time' + (currentFilter ? ':' + currentFilter : ''), from || '-inf', to), + db.sortedSetCount(`events:time${currentFilter ? `:${currentFilter}` : ''}`, from || '-inf', to), events.getEvents(currentFilter, start, stop, from || '-inf', to), ]); diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js index 0be3de5543..9f789cd0b7 100644 --- a/src/controllers/admin/groups.js +++ b/src/controllers/admin/groups.js @@ -85,13 +85,13 @@ groupsController.getCSV = async function (req, res) { const members = (await groups.getMembersOfGroups([groupName]))[0]; const fields = ['email', 'username', 'uid']; const userData = await user.getUsersFields(members, fields); - let csvContent = fields.join(',') + '\n'; + let csvContent = `${fields.join(',')}\n`; csvContent += userData.reduce((memo, user) => { - memo += user.email + ',' + user.username + ',' + user.uid + '\n'; + memo += `${user.email},${user.username},${user.uid}\n`; return memo; }, ''); - res.attachment(validator.escape(groupName) + '_members.csv'); + res.attachment(`${validator.escape(groupName)}_members.csv`); res.setHeader('Content-Type', 'text/csv'); res.end(csvContent); }; diff --git a/src/controllers/admin/hooks.js b/src/controllers/admin/hooks.js index 35a2600553..86cbc0ddd1 100644 --- a/src/controllers/admin/hooks.js +++ b/src/controllers/admin/hooks.js @@ -11,7 +11,7 @@ hooksController.get = function (req, res) { const current = { hookName: key, methods: [], - index: 'hook-' + hookIndex, + index: `hook-${hookIndex}`, count: plugins.loadedHooks[key].length, }; @@ -20,7 +20,7 @@ hooksController.get = function (req, res) { id: hookData.id, priority: hookData.priority, method: hookData.method ? validator.escape(hookData.method.toString()) : 'No plugin function!', - index: hookIndex + '-code-' + methodIndex, + index: `${hookIndex}-code-${methodIndex}`, }); }); hooks.push(current); diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index 9919deb8cc..854a98d347 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -49,7 +49,7 @@ infoController.get = function (req, res) { pubsub.on('sync:node:info:start', async function () { try { const data = await getNodeInfo(); - data.id = os.hostname() + ':' + nconf.get('port'); + data.id = `${os.hostname()}:${nconf.get('port')}`; pubsub.publish('sync:node:info:end', { data: data, id: data.id }); } catch (err) { winston.error(err.stack); @@ -107,13 +107,13 @@ async function getNodeInfo() { function humanReadableUptime(seconds) { if (seconds < 60) { - return Math.floor(seconds) + 's'; + return `${Math.floor(seconds)}s`; } else if (seconds < 3600) { - return Math.floor(seconds / 60) + 'm'; + return `${Math.floor(seconds / 60)}m`; } else if (seconds < 3600 * 24) { - return Math.floor(seconds / (60 * 60)) + 'h'; + return `${Math.floor(seconds / (60 * 60))}h`; } - return Math.floor(seconds / (60 * 60 * 24)) + 'd'; + return `${Math.floor(seconds / (60 * 60 * 24))}d`; } async function getGitInfo() { diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index 15bf20ac79..f85d867529 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -15,7 +15,7 @@ const settingsController = module.exports; settingsController.get = async function (req, res) { const term = req.params.term || 'general'; - res.render('admin/settings/' + term); + res.render(`admin/settings/${term}`); }; settingsController.email = async (req, res) => { @@ -33,7 +33,7 @@ settingsController.user = async (req, res) => { const notificationSettings = notificationTypes.map(function (type) { return { name: type, - label: '[[notifications:' + type + ']]', + label: `[[notifications:${type}]]`, }; }); res.render('admin/settings/user', { diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index b1a5b3ce31..45169d25ca 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -73,8 +73,8 @@ function buildBreadcrumbs(currentFolder) { crumbs.push({ text: part || 'Uploads', url: part ? - (nconf.get('relative_path') + '/admin/manage/uploads?dir=' + dir) : - nconf.get('relative_path') + '/admin/manage/uploads', + (`${nconf.get('relative_path')}/admin/manage/uploads?dir=${dir}`) : + `${nconf.get('relative_path')}/admin/manage/uploads`, }); currentPath = dir; }); @@ -92,14 +92,14 @@ async function getFileData(currentDir, file) { if (stat.isDirectory()) { filesInDir = await fs.promises.readdir(path.join(currentDir, file)); } - const url = nconf.get('upload_url') + currentDir.replace(nconf.get('upload_path'), '') + '/' + file; + const url = `${nconf.get('upload_url') + currentDir.replace(nconf.get('upload_path'), '')}/${file}`; return { name: file, path: path.join(currentDir, file).replace(nconf.get('upload_path'), ''), url: url, fileCount: Math.max(0, filesInDir.length - 1), // ignore .gitignore size: stat.size, - sizeHumanReadable: (stat.size / 1024).toFixed(1) + 'KiB', + sizeHumanReadable: `${(stat.size / 1024).toFixed(1)}KiB`, isDirectory: stat.isDirectory(), isFile: stat.isFile(), mtime: stat.mtimeMs, @@ -118,7 +118,7 @@ uploadsController.uploadCategoryPicture = async function (req, res, next) { } if (validateUpload(res, uploadedFile, allowedImageTypes)) { - const filename = 'category-' + params.cid + path.extname(uploadedFile.name); + const filename = `category-${params.cid}${path.extname(uploadedFile.name)}`; await uploadImage(filename, 'category', uploadedFile, req, res, next); } }; @@ -152,7 +152,7 @@ uploadsController.uploadTouchIcon = async function (req, res, next) { /* eslint-disable no-await-in-loop */ await image.resizeImage({ path: uploadedFile.path, - target: path.join(nconf.get('upload_path'), 'system', 'touchicon-' + size + '.png'), + target: path.join(nconf.get('upload_path'), 'system', `touchicon-${size}.png`), width: size, height: size, }); @@ -227,7 +227,7 @@ async function upload(name, req, res, next) { function validateUpload(res, uploadedFile, allowedTypes) { if (!allowedTypes.includes(uploadedFile.type)) { file.delete(uploadedFile.path); - res.json({ error: '[[error:invalid-image-type, ' + allowedTypes.join(', ') + ']]' }); + res.json({ error: `[[error:invalid-image-type, ${allowedTypes.join(', ')}]]` }); return false; } diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 764cc98240..95268e323c 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -153,7 +153,7 @@ usersController.search = async function (req, res) { } const data = await db.getSortedSetScan({ - key: searchBy + ':sorted', + key: `${searchBy}:sorted`, match: query, limit: hardCap || (resultsPerPage * 10), }); @@ -233,13 +233,13 @@ async function render(req, res, data) { data.inviteOnly = registrationType === 'invite-only' || registrationType === 'admin-invite-only'; data.adminInviteOnly = registrationType === 'admin-invite-only'; - data['sort_' + data.sortBy] = true; + data[`sort_${data.sortBy}`] = true; if (req.query.searchBy) { - data['searchBy_' + validator.escape(String(req.query.searchBy))] = true; + data[`searchBy_${validator.escape(String(req.query.searchBy))}`] = true; } const filterBy = Array.isArray(req.query.filters || []) ? (req.query.filters || []) : [req.query.filters]; filterBy.forEach(function (filter) { - data['filterBy_' + validator.escape(String(filter))] = true; + data[`filterBy_${validator.escape(String(filter))}`] = true; }); data.userCount = parseInt(await db.getObjectField('global', 'userCount'), 10); if (data.adminInviteOnly) { diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 11c4678890..fed337b52a 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -35,10 +35,10 @@ async function registerAndLoginUser(req, res, userData) { req.session.registration = userData; if (req.body.noscript === 'true') { - res.redirect(nconf.get('relative_path') + '/register/complete'); + res.redirect(`${nconf.get('relative_path')}/register/complete`); return; } - res.json({ next: nconf.get('relative_path') + '/register/complete' }); + res.json({ next: `${nconf.get('relative_path')}/register/complete` }); return; } const queue = await user.shouldQueueUser(req.ip); @@ -57,7 +57,7 @@ async function registerAndLoginUser(req, res, userData) { await user.joinGroupsFromInvitation(uid, userData.email); } await user.deleteInvitationKey(userData.email); - const next = req.session.returnTo || nconf.get('relative_path') + '/'; + const next = req.session.returnTo || `${nconf.get('relative_path')}/`; const complete = await plugins.hooks.fire('filter:register.complete', { uid: uid, next: next }); req.session.returnTo = complete.next; return complete; @@ -154,17 +154,17 @@ authenticationController.registerComplete = function (req, res, next) { var done = function (err, data) { delete req.session.registration; if (err) { - return res.redirect(nconf.get('relative_path') + '/?register=' + encodeURIComponent(err.message)); + return res.redirect(`${nconf.get('relative_path')}/?register=${encodeURIComponent(err.message)}`); } if (!err && data && data.message) { - return res.redirect(nconf.get('relative_path') + '/?register=' + encodeURIComponent(data.message)); + return res.redirect(`${nconf.get('relative_path')}/?register=${encodeURIComponent(data.message)}`); } if (req.session.returnTo) { res.redirect(nconf.get('relative_path') + req.session.returnTo); } else { - res.redirect(nconf.get('relative_path') + '/'); + res.redirect(`${nconf.get('relative_path')}/`); } }; @@ -174,7 +174,7 @@ authenticationController.registerComplete = function (req, res, next) { const errors = results.map(result => result.reason && result.reason.message).filter(Boolean); if (errors.length) { req.flash('errors', errors); - return res.redirect(nconf.get('relative_path') + '/register/complete'); + return res.redirect(`${nconf.get('relative_path')}/register/complete`); } if (req.session.registration.register === true) { @@ -203,7 +203,7 @@ authenticationController.registerAbort = function (req, res) { // End the session and redirect to home req.session.destroy(function () { res.clearCookie(nconf.get('sessionKey'), meta.configs.cookie.get()); - res.redirect(nconf.get('relative_path') + '/'); + res.redirect(`${nconf.get('relative_path')}/`); }); }; @@ -241,7 +241,7 @@ authenticationController.login = async (req, res, next) => { } else if (loginWith.includes('username') && !validator.isEmail(req.body.username)) { (res.locals.continueLogin || continueLogin)(strategy, req, res, next); } else { - err = '[[error:wrong-login-type-' + loginWith + ']]'; + err = `[[error:wrong-login-type-${loginWith}]]`; (res.locals.noScriptErrors || helpers.noScriptErrors)(req, res, err, 400); } }); @@ -273,12 +273,12 @@ function continueLogin(strategy, req, res, next) { plugins.hooks.fire('action:login.continue', { req, userData }); if (userData.passwordExpiry && userData.passwordExpiry < Date.now()) { - winston.verbose('[auth] Triggering password reset for uid ' + userData.uid + ' due to password policy'); + winston.verbose(`[auth] Triggering password reset for uid ${userData.uid} due to password policy`); req.session.passwordExpired = true; const code = await user.reset.generate(userData.uid); res.status(200).send({ - next: nconf.get('relative_path') + '/reset/' + code, + next: `${nconf.get('relative_path')}/reset/${code}`, }); } else { delete req.query.lang; @@ -290,11 +290,11 @@ function continueLogin(strategy, req, res, next) { nconf.get('relative_path') + req.session.returnTo; delete req.session.returnTo; } else { - destination = nconf.get('relative_path') + '/'; + destination = `${nconf.get('relative_path')}/`; } if (req.body.noscript === 'true') { - res.redirect(destination + '?loggedin'); + res.redirect(`${destination}?loggedin`); } else { res.status(200).send({ next: destination, @@ -352,11 +352,11 @@ authenticationController.onSuccessfulLogin = async function (req, uid) { user.updateOnlineUsers(uid), ]); if (uid > 0) { - await db.setObjectField('uid:' + uid + ':sessionUUID:sessionId', uuid, req.sessionID); + await db.setObjectField(`uid:${uid}:sessionUUID:sessionId`, uuid, req.sessionID); } // Force session check for all connected socket.io clients with the same session id - sockets.in('sess_' + req.sessionID).emit('checkSession', uid); + sockets.in(`sess_${req.sessionID}`).emit('checkSession', uid); plugins.hooks.fire('action:user.loggedIn', { uid: uid, req: req }); } catch (err) { @@ -435,9 +435,9 @@ authenticationController.logout = async function (req, res, next) { await plugins.hooks.fire('static:user.loggedOut', { req: req, res: res, uid: uid, sessionID: sessionID }); // Force session check for all connected socket.io clients with the same session id - sockets.in('sess_' + sessionID).emit('checkSession', 0); + sockets.in(`sess_${sessionID}`).emit('checkSession', 0); const payload = { - next: nconf.get('relative_path') + '/', + next: `${nconf.get('relative_path')}/`, }; plugins.hooks.fire('filter:user.logout', payload); @@ -458,8 +458,8 @@ async function getBanInfo(uid) { banInfo.reason = await translator.translate('[[user:info.banned-no-reason]]'); } return banInfo.banned_until ? - '[[error:user-banned-reason-until, ' + banInfo.banned_until_readable + ', ' + banInfo.reason + ']]' : - '[[error:user-banned-reason, ' + banInfo.reason + ']]'; + `[[error:user-banned-reason-until, ${banInfo.banned_until_readable}, ${banInfo.reason}]]` : + `[[error:user-banned-reason, ${banInfo.reason}]]`; } catch (err) { if (err.message === 'no-ban-info') { return '[[error:user-banned]]'; diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 640227fa9a..ee3040ef49 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -48,7 +48,7 @@ categoriesController.list = async function (req, res) { } }); - if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/categories') || req.originalUrl.startsWith(nconf.get('relative_path') + '/categories')) { + if (req.originalUrl.startsWith(`${nconf.get('relative_path')}/api/categories`) || req.originalUrl.startsWith(`${nconf.get('relative_path')}/categories`)) { data.title = '[[pages:categories]]'; data.breadcrumbs = helpers.buildBreadcrumbs([{ text: data.title }]); res.locals.metaTags.push({ diff --git a/src/controllers/category.js b/src/controllers/category.js index 13fcdd2edb..9265424c44 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -42,19 +42,19 @@ categoryController.get = async function (req, res, next) { return next(); } if (topicIndex < 0) { - return helpers.redirect(res, '/category/' + categoryFields.slug); + return helpers.redirect(res, `/category/${categoryFields.slug}`); } if (!userPrivileges.read) { return helpers.notAllowed(req, res); } - if (!res.locals.isAPI && (!req.params.slug || categoryFields.slug !== cid + '/' + req.params.slug) && (categoryFields.slug && categoryFields.slug !== cid + '/')) { - return helpers.redirect(res, '/category/' + categoryFields.slug, true); + if (!res.locals.isAPI && (!req.params.slug || categoryFields.slug !== `${cid}/${req.params.slug}`) && (categoryFields.slug && categoryFields.slug !== `${cid}/`)) { + return helpers.redirect(res, `/category/${categoryFields.slug}`, true); } if (categoryFields.link) { - await db.incrObjectField('category:' + cid, 'timesClicked'); + await db.incrObjectField(`category:${cid}`, 'timesClicked'); return helpers.redirect(res, validator.unescape(categoryFields.link)); } @@ -86,7 +86,7 @@ categoryController.get = async function (req, res, next) { } if (topicIndex > Math.max(categoryData.topic_count - 1, 0)) { - return helpers.redirect(res, '/category/' + categoryData.slug + '/' + categoryData.topic_count); + return helpers.redirect(res, `/category/${categoryData.slug}/${categoryData.topic_count}`); } const pageCount = Math.max(1, Math.ceil(categoryData.topic_count / userSettings.topicsPerPage)); if (userSettings.usePagination && currentPage > pageCount) { @@ -119,10 +119,10 @@ categoryController.get = async function (req, res, next) { categoryData.showSelect = userPrivileges.editable; categoryData.showTopicTools = userPrivileges.editable; categoryData.topicIndex = topicIndex; - categoryData.rssFeedUrl = url + '/category/' + categoryData.cid + '.rss'; + categoryData.rssFeedUrl = `${url}/category/${categoryData.cid}.rss`; if (parseInt(req.uid, 10)) { categories.markAsRead([cid], req.uid); - categoryData.rssFeedUrl += '?uid=' + req.uid + '&token=' + rssToken; + categoryData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; } addTags(categoryData, res); @@ -131,11 +131,11 @@ categoryController.get = async function (req, res, next) { categoryData['reputation:disabled'] = meta.config['reputation:disabled']; categoryData.pagination = pagination.create(currentPage, pageCount, req.query); categoryData.pagination.rel.forEach(function (rel) { - rel.href = url + '/category/' + categoryData.slug + rel.href; + rel.href = `${url}/category/${categoryData.slug}${rel.href}`; res.locals.linkTags.push(rel); }); - analytics.increment(['pageviews:byCid:' + categoryData.cid]); + analytics.increment([`pageviews:byCid:${categoryData.cid}`]); res.render('category', categoryData); }; @@ -144,12 +144,12 @@ async function buildBreadcrumbs(req, categoryData) { const breadcrumbs = [ { text: categoryData.name, - url: relative_path + '/category/' + categoryData.slug, + url: `${relative_path}/category/${categoryData.slug}`, cid: categoryData.cid, }, ]; const crumbs = await helpers.buildCategoryBreadcrumbs(categoryData.parentCid); - if (req.originalUrl.startsWith(relative_path + '/api/category') || req.originalUrl.startsWith(relative_path + '/category')) { + if (req.originalUrl.startsWith(`${relative_path}/api/category`) || req.originalUrl.startsWith(`${relative_path}/category`)) { categoryData.breadcrumbs = crumbs.concat(breadcrumbs); } } diff --git a/src/controllers/composer.js b/src/controllers/composer.js index ca0dc208f6..df20ecee37 100644 --- a/src/controllers/composer.js +++ b/src/controllers/composer.js @@ -77,11 +77,11 @@ exports.post = async function (req, res) { throw new Error('[[error:invalid-data]]'); } if (result.queued) { - return res.redirect((nconf.get('relative_path') || '/') + '?noScriptMessage=[[success:post-queued]]'); + return res.redirect(`${nconf.get('relative_path') || '/'}?noScriptMessage=[[success:post-queued]]`); } const uid = result.uid ? result.uid : result.topicData.uid; user.updateOnlineUsers(uid); - const path = result.pid ? '/post/' + result.pid : '/topic/' + result.topicData.slug; + const path = result.pid ? `/post/${result.pid}` : `/topic/${result.topicData.slug}`; res.redirect(nconf.get('relative_path') + path); } catch (err) { helpers.noScriptErrors(req, res, err.message, 400); diff --git a/src/controllers/errors.js b/src/controllers/errors.js index bb8951b038..177da067a3 100644 --- a/src/controllers/errors.js +++ b/src/controllers/errors.js @@ -9,7 +9,7 @@ var middleware = require('../middleware'); exports.handleURIErrors = async function handleURIErrors(err, req, res, next) { // Handle cases where malformed URIs are passed in if (err instanceof URIError) { - const cleanPath = req.path.replace(new RegExp('^' + nconf.get('relative_path')), ''); + const cleanPath = req.path.replace(new RegExp(`^${nconf.get('relative_path')}`), ''); var tidMatch = cleanPath.match(/^\/topic\/(\d+)\//); var cidMatch = cleanPath.match(/^\/category\/(\d+)\//); @@ -18,8 +18,8 @@ exports.handleURIErrors = async function handleURIErrors(err, req, res, next) { } else if (cidMatch) { res.redirect(nconf.get('relative_path') + cidMatch[0]); } else { - winston.warn('[controller] Bad request: ' + req.path); - if (req.path.startsWith(nconf.get('relative_path') + '/api')) { + winston.warn(`[controller] Bad request: ${req.path}`); + if (req.path.startsWith(`${nconf.get('relative_path')}/api`)) { res.status(400).json({ error: '[[global:400.title]]', }); @@ -38,7 +38,7 @@ exports.handleURIErrors = async function handleURIErrors(err, req, res, next) { exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-disable-line no-unused-vars var cases = { EBADCSRFTOKEN: function () { - winston.error(req.path + '\n' + err.message); + winston.error(`${req.path}\n${err.message}`); res.sendStatus(403); }, 'blacklisted-ip': function () { @@ -52,7 +52,7 @@ exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-di return res.locals.isAPI ? res.set('X-Redirect', err.path).status(200).json(err.path) : res.redirect(nconf.get('relative_path') + err.path); } - winston.error(req.path + '\n' + err.stack); + winston.error(`${req.path}\n${err.stack}`); res.status(status || 500); @@ -70,7 +70,7 @@ exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-di }, function (_err, data) { if (_err) { // Assume defaults - winston.warn('[errors/handle] Unable to retrieve plugin handlers for errors: ' + _err.message); + winston.warn(`[errors/handle] Unable to retrieve plugin handlers for errors: ${_err.message}`); data.cases = cases; } diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 14076783ca..e7b32899b7 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -35,7 +35,7 @@ groupsController.details = async function (req, res, next) { if (res.locals.isAPI) { req.params.slug = lowercaseSlug; } else { - return res.redirect(nconf.get('relative_path') + '/groups/' + lowercaseSlug); + return res.redirect(`${nconf.get('relative_path')}/groups/${lowercaseSlug}`); } } const groupName = await groups.getGroupNameByGroupSlug(req.params.slug); @@ -74,7 +74,7 @@ groupsController.details = async function (req, res, next) { groupData.isOwner = groupData.isOwner || isAdmin || (isGlobalMod && !groupData.system); res.render('groups/details', { - title: '[[pages:group, ' + groupData.displayName + ']]', + title: `[[pages:group, ${groupData.displayName}]]`, group: groupData, posts: posts, isAdmin: isAdmin, @@ -103,11 +103,11 @@ groupsController.members = async function (req, res, next) { if (isHidden && !isMember && !isAdminOrGlobalMod) { return next(); } - const users = await user.getUsersFromSet('group:' + groupName + ':members', req.uid, start, stop); + const users = await user.getUsersFromSet(`group:${groupName}:members`, req.uid, start, stop); const breadcrumbs = helpers.buildBreadcrumbs([ { text: '[[pages:groups]]', url: '/groups' }, - { text: validator.escape(String(groupName)), url: '/groups/' + req.params.slug }, + { text: validator.escape(String(groupName)), url: `/groups/${req.params.slug}` }, { text: '[[groups:details.members]]' }, ]); diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 65cced760b..ebfca2eb40 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -30,7 +30,7 @@ helpers.noScriptErrors = async function (req, res, error, httpStatus) { loggedIn: req.loggedIn, error: error, returnLink: true, - title: '[[global:' + httpStatusString + '.title]]', + title: `[[global:${httpStatusString}.title]]`, }); }; @@ -48,18 +48,18 @@ helpers.buildQueryString = function (query, key, value) { delete queryObj[key]; } delete queryObj._; - return Object.keys(queryObj).length ? '?' + querystring.stringify(queryObj) : ''; + return Object.keys(queryObj).length ? `?${querystring.stringify(queryObj)}` : ''; }; helpers.addLinkTags = function (params) { params.res.locals.linkTags = params.res.locals.linkTags || []; params.res.locals.linkTags.push({ rel: 'canonical', - href: url + '/' + params.url, + href: `${url}/${params.url}`, }); params.tags.forEach(function (rel) { - rel.href = url + '/' + params.url + rel.href; + rel.href = `${url}/${params.url}${rel.href}`; params.res.locals.linkTags.push(rel); }); }; @@ -140,7 +140,7 @@ helpers.notAllowed = async function (req, res, error) { helpers.formatApiResponse(401, res, error); } else { req.session.returnTo = req.url; - res.redirect(relative_path + '/login'); + res.redirect(`${relative_path}/login`); } }; @@ -179,7 +179,7 @@ helpers.buildCategoryBreadcrumbs = async function (cid) { if (!data.disabled && !data.isSection) { breadcrumbs.unshift({ text: String(data.name), - url: relative_path + '/category/' + data.slug, + url: `${relative_path}/category/${data.slug}`, cid: cid, }); } @@ -188,13 +188,13 @@ helpers.buildCategoryBreadcrumbs = async function (cid) { if (meta.config.homePageRoute && meta.config.homePageRoute !== 'categories') { breadcrumbs.unshift({ text: '[[global:header.categories]]', - url: relative_path + '/categories', + url: `${relative_path}/categories`, }); } breadcrumbs.unshift({ text: '[[global:home]]', - url: relative_path + '/', + url: `${relative_path}/`, }); return breadcrumbs; @@ -204,7 +204,7 @@ helpers.buildBreadcrumbs = function (crumbs) { const breadcrumbs = [ { text: '[[global:home]]', - url: relative_path + '/', + url: `${relative_path}/`, }, ]; @@ -369,7 +369,7 @@ helpers.trimChildren = function (category) { helpers.setCategoryTeaser = function (category) { if (Array.isArray(category.posts) && category.posts.length && category.posts[0]) { category.teaser = { - url: nconf.get('relative_path') + '/post/' + category.posts[0].pid, + url: `${nconf.get('relative_path')}/post/${category.posts[0].pid}`, timestampISO: category.posts[0].timestampISO, pid: category.posts[0].pid, topic: category.posts[0].topic, diff --git a/src/controllers/home.js b/src/controllers/home.js index d8fa7a1d83..916a9ea49e 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -38,7 +38,7 @@ async function rewrite(req, res, next) { } const pathname = parsedUrl.pathname; - const hook = 'action:homepage.get:' + pathname; + const hook = `action:homepage.get:${pathname}`; if (!plugins.hooks.hasListeners(hook)) { req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname; } else { @@ -52,7 +52,7 @@ async function rewrite(req, res, next) { exports.rewrite = rewrite; function pluginHook(req, res, next) { - var hook = 'action:homepage.get:' + res.locals.homePageRoute; + var hook = `action:homepage.get:${res.locals.homePageRoute}`; plugins.hooks.fire(hook, { req: req, diff --git a/src/controllers/index.js b/src/controllers/index.js index f877820712..6051ead24c 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -113,7 +113,7 @@ Controllers.login = async function (req, res) { data.alternate_logins = loginStrategies.length > 0; data.authentication = loginStrategies; data.allowRegistration = registrationType === 'normal'; - data.allowLoginWith = '[[login:' + allowLoginWith + ']]'; + data.allowLoginWith = `[[login:${allowLoginWith}]]`; data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[global:login]]', }]); @@ -187,7 +187,7 @@ Controllers.register = async function (req, res, next) { Controllers.registerInterstitial = async function (req, res, next) { if (!req.session.hasOwnProperty('registration')) { - return res.redirect(nconf.get('relative_path') + '/register'); + return res.redirect(`${nconf.get('relative_path')}/register`); } try { const data = await plugins.hooks.fire('filter:register.interstitial', { @@ -230,11 +230,11 @@ Controllers.robots = function (req, res) { if (meta.config['robots:txt']) { res.send(meta.config['robots:txt']); } else { - res.send('User-agent: *\n' + - 'Disallow: ' + nconf.get('relative_path') + '/admin/\n' + - 'Disallow: ' + nconf.get('relative_path') + '/reset/\n' + - 'Disallow: ' + nconf.get('relative_path') + '/compose\n' + - 'Sitemap: ' + nconf.get('url') + '/sitemap.xml'); + res.send(`${'User-agent: *\n' + + 'Disallow: '}${nconf.get('relative_path')}/admin/\n` + + `Disallow: ${nconf.get('relative_path')}/reset/\n` + + `Disallow: ${nconf.get('relative_path')}/compose\n` + + `Sitemap: ${nconf.get('url')}/sitemap.xml`); } }; @@ -252,37 +252,37 @@ Controllers.manifest = async function (req, res) { if (meta.config['brand:touchIcon']) { manifest.icons.push({ - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-36.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-36.png`, sizes: '36x36', type: 'image/png', density: 0.75, }, { - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-48.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-48.png`, sizes: '48x48', type: 'image/png', density: 1.0, }, { - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-72.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-72.png`, sizes: '72x72', type: 'image/png', density: 1.5, }, { - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-96.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-96.png`, sizes: '96x96', type: 'image/png', density: 2.0, }, { - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-144.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-144.png`, sizes: '144x144', type: 'image/png', density: 3.0, }, { - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-192.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-192.png`, sizes: '192x192', type: 'image/png', density: 4.0, }, { - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-512.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-512.png`, sizes: '512x512', type: 'image/png', density: 10.0, @@ -292,13 +292,13 @@ Controllers.manifest = async function (req, res) { if (meta.config['brand:maskableIcon']) { manifest.icons.push({ - src: nconf.get('relative_path') + '/assets/uploads/system/maskableicon-orig.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/maskableicon-orig.png`, type: 'image/png', purpose: 'maskable', }); } else if (meta.config['brand:touchIcon']) { manifest.icons.push({ - src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-orig.png', + src: `${nconf.get('relative_path')}/assets/uploads/system/touchicon-orig.png`, type: 'image/png', purpose: 'maskable', }); diff --git a/src/controllers/mods.js b/src/controllers/mods.js index 26d70ea090..0de133d3c9 100644 --- a/src/controllers/mods.js +++ b/src/controllers/mods.js @@ -138,11 +138,11 @@ modsController.flags.detail = async function (req, res, next) { return memo; }, {}), - title: '[[pages:flag-details, ' + req.params.flagId + ']]', + title: `[[pages:flag-details, ${req.params.flagId}]]`, privileges: results.privileges, breadcrumbs: helpers.buildBreadcrumbs([ { text: '[[pages:flags]]', url: '/flags' }, - { text: '[[pages:flag-details, ' + req.params.flagId + ']]' }, + { text: `[[pages:flag-details, ${req.params.flagId}]]` }, ]), })); }; @@ -187,14 +187,14 @@ modsController.postQueue = async function (req, res, next) { title: '[[pages:post-queue]]', posts: postData, ...categoriesData, - allCategoriesUrl: 'post-queue' + helpers.buildQueryString(req.query, 'cid', ''), + allCategoriesUrl: `post-queue${helpers.buildQueryString(req.query, 'cid', '')}`, pagination: pagination.create(page, pageCount), breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[pages:post-queue]]' }]), }); }; async function getQueuedPosts(ids) { - const keys = ids.map(id => 'post:queue:' + id); + const keys = ids.map(id => `post:queue:${id}`); const postData = await db.getObjects(keys); postData.forEach(function (data) { if (data) { diff --git a/src/controllers/osd.js b/src/controllers/osd.js index 95142b0111..194734c26d 100644 --- a/src/controllers/osd.js +++ b/src/controllers/osd.js @@ -30,16 +30,16 @@ function generateXML() { height: '16', type: 'image/x-icon', } }, - nconf.get('url') + '/favicon.ico', + `${nconf.get('url')}/favicon.ico`, ] }, { Url: { _attr: { type: 'text/html', method: 'get', - template: nconf.get('url') + '/search?term={searchTerms}&in=titlesposts', + template: `${nconf.get('url')}/search?term={searchTerms}&in=titlesposts`, }, } }, - { 'moz:SearchForm': nconf.get('url') + '/search' }, + { 'moz:SearchForm': `${nconf.get('url')}/search` }, ], }], { declaration: true, indent: '\t' }); } diff --git a/src/controllers/ping.js b/src/controllers/ping.js index f51270d210..dc4baed1f8 100644 --- a/src/controllers/ping.js +++ b/src/controllers/ping.js @@ -6,7 +6,7 @@ const db = require('../database'); module.exports.ping = async function (req, res, next) { try { await db.getObject('config'); - res.status(200).send(req.path === nconf.get('relative_path') + '/sping' ? 'healthy' : '200'); + res.status(200).send(req.path === `${nconf.get('relative_path')}/sping` ? 'healthy' : '200'); } catch (err) { next(err); } diff --git a/src/controllers/popular.js b/src/controllers/popular.js index 29f62c80ab..3869f35cfd 100644 --- a/src/controllers/popular.js +++ b/src/controllers/popular.js @@ -15,16 +15,16 @@ popularController.get = async function (req, res, next) { return next(); } const term = helpers.terms[req.query.term] || 'alltime'; - if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/popular') || req.originalUrl.startsWith(nconf.get('relative_path') + '/popular')) { - data.title = '[[pages:popular-' + term + ']]'; + if (req.originalUrl.startsWith(`${nconf.get('relative_path')}/api/popular`) || req.originalUrl.startsWith(`${nconf.get('relative_path')}/popular`)) { + data.title = `[[pages:popular-${term}]]`; const breadcrumbs = [{ text: '[[global:header.popular]]' }]; data.breadcrumbs = helpers.buildBreadcrumbs(breadcrumbs); } const feedQs = data.rssFeedUrl.split('?')[1]; - data.rssFeedUrl = nconf.get('relative_path') + '/popular/' + validator.escape(String(req.query.term || 'alltime')) + '.rss'; + data.rssFeedUrl = `${nconf.get('relative_path')}/popular/${validator.escape(String(req.query.term || 'alltime'))}.rss`; if (req.loggedIn) { - data.rssFeedUrl += '?' + feedQs; + data.rssFeedUrl += `?${feedQs}`; } res.render('popular', data); }; diff --git a/src/controllers/posts.js b/src/controllers/posts.js index 3f42f64ebd..128fdc130a 100644 --- a/src/controllers/posts.js +++ b/src/controllers/posts.js @@ -26,7 +26,7 @@ postsController.redirectToPost = async function (req, res, next) { } const qs = querystring.stringify(req.query); - helpers.redirect(res, qs ? path + '?' + qs : path); + helpers.redirect(res, qs ? `${path}?${qs}` : path); }; postsController.getRecentPosts = async function (req, res) { diff --git a/src/controllers/recent.js b/src/controllers/recent.js index 1945b3d538..0f003f4576 100644 --- a/src/controllers/recent.js +++ b/src/controllers/recent.js @@ -62,9 +62,9 @@ recentController.getData = async function (req, url, sort) { data.selectedCategory = categoryData.selectedCategory; data.selectedCids = categoryData.selectedCids; data['feeds:disableRSS'] = meta.config['feeds:disableRSS'] || 0; - data.rssFeedUrl = nconf.get('relative_path') + '/' + url + '.rss'; + data.rssFeedUrl = `${nconf.get('relative_path')}/${url}.rss`; if (req.loggedIn) { - data.rssFeedUrl += '?uid=' + req.uid + '&token=' + rssToken; + data.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; } data.title = meta.config.homePageTitle || '[[pages:home]]'; @@ -77,9 +77,9 @@ recentController.getData = async function (req, url, sort) { data.pagination = pagination.create(page, pageCount, req.query); helpers.addLinkTags({ url: url, res: req.res, tags: data.pagination.rel }); - if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/' + url) || req.originalUrl.startsWith(nconf.get('relative_path') + '/' + url)) { - data.title = '[[pages:' + url + ']]'; - data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[' + url + ':title]]' }]); + if (req.originalUrl.startsWith(`${nconf.get('relative_path')}/api/${url}`) || req.originalUrl.startsWith(`${nconf.get('relative_path')}/${url}`)) { + data.title = `[[pages:${url}]]`; + data.breadcrumbs = helpers.buildBreadcrumbs([{ text: `[[${url}:title]]` }]); } return data; diff --git a/src/controllers/tags.js b/src/controllers/tags.js index 4573afcd20..49df122180 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -22,7 +22,7 @@ tagsController.getTag = async function (req, res) { topics: [], tag: tag, breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]', url: '/tags' }, { text: tag }]), - title: '[[pages:tag, ' + tag + ']]', + title: `[[pages:tag, ${tag}]]`, }; const [settings, cids] = await Promise.all([ user.getSettings(req.uid), @@ -51,10 +51,10 @@ tagsController.getTag = async function (req, res) { const pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); templateData.pagination = pagination.create(page, pageCount); - helpers.addLinkTags({ url: 'tags/' + tag, res: req.res, tags: templateData.pagination.rel }); + helpers.addLinkTags({ url: `tags/${tag}`, res: req.res, tags: templateData.pagination.rel }); templateData['feeds:disableRSS'] = meta.config['feeds:disableRSS']; - templateData.rssFeedUrl = nconf.get('relative_path') + '/tags/' + tag + '.rss'; + templateData.rssFeedUrl = `${nconf.get('relative_path')}/tags/${tag}.rss`; res.render('tag', templateData); }; diff --git a/src/controllers/top.js b/src/controllers/top.js index 40fd8b869c..cc06e794c4 100644 --- a/src/controllers/top.js +++ b/src/controllers/top.js @@ -15,14 +15,14 @@ topController.get = async function (req, res, next) { return next(); } const term = helpers.terms[req.query.term] || 'alltime'; - if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/top') || req.originalUrl.startsWith(nconf.get('relative_path') + '/top')) { - data.title = '[[pages:top-' + term + ']]'; + if (req.originalUrl.startsWith(`${nconf.get('relative_path')}/api/top`) || req.originalUrl.startsWith(`${nconf.get('relative_path')}/top`)) { + data.title = `[[pages:top-${term}]]`; } const feedQs = data.rssFeedUrl.split('?')[1]; - data.rssFeedUrl = nconf.get('relative_path') + '/top/' + validator.escape(String(req.query.term || 'alltime')) + '.rss'; + data.rssFeedUrl = `${nconf.get('relative_path')}/top/${validator.escape(String(req.query.term || 'alltime'))}.rss`; if (req.loggedIn) { - data.rssFeedUrl += '?' + feedQs; + data.rssFeedUrl += `?${feedQs}`; } res.render('top', data); }; diff --git a/src/controllers/topics.js b/src/controllers/topics.js index b04dd7b564..58269efc20 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -48,8 +48,8 @@ topicsController.get = async function getTopic(req, res, callback) { return helpers.notAllowed(req, res); } - if (!res.locals.isAPI && (!req.params.slug || topicData.slug !== tid + '/' + req.params.slug) && (topicData.slug && topicData.slug !== tid + '/')) { - return helpers.redirect(res, '/topic/' + topicData.slug + (postIndex ? '/' + postIndex : '') + (currentPage > 1 ? '?page=' + currentPage : ''), true); + if (!res.locals.isAPI && (!req.params.slug || topicData.slug !== `${tid}/${req.params.slug}`) && (topicData.slug && topicData.slug !== `${tid}/`)) { + return helpers.redirect(res, `/topic/${topicData.slug}${postIndex ? `/${postIndex}` : ''}${currentPage > 1 ? `?page=${currentPage}` : ''}`, true); } if (postIndex === 'unread') { @@ -57,11 +57,11 @@ topicsController.get = async function getTopic(req, res, callback) { } if (utils.isNumber(postIndex) && topicData.postcount > 0 && (postIndex < 1 || postIndex > topicData.postcount)) { - return helpers.redirect(res, '/topic/' + req.params.topic_id + '/' + req.params.slug + (postIndex > topicData.postcount ? '/' + topicData.postcount : '')); + return helpers.redirect(res, `/topic/${req.params.topic_id}/${req.params.slug}${postIndex > topicData.postcount ? `/${topicData.postcount}` : ''}`); } postIndex = Math.max(1, postIndex); const sort = req.query.sort || settings.topicPostSort; - const set = sort === 'most_votes' ? 'tid:' + tid + ':posts:votes' : 'tid:' + tid + ':posts'; + const set = sort === 'most_votes' ? `tid:${tid}:posts:votes` : `tid:${tid}:posts`; const reverse = sort === 'newest_to_oldest' || sort === 'most_votes'; if (settings.usePagination && !req.query.page) { currentPage = calculatePageFromIndex(postIndex, settings); @@ -85,9 +85,9 @@ topicsController.get = async function getTopic(req, res, callback) { topicData.updateUrlWithPostIndex = settings.updateUrlWithPostIndex; topicData.allowMultipleBadges = meta.config.allowMultipleBadges === 1; topicData.privateUploads = meta.config.privateUploads === 1; - topicData.rssFeedUrl = relative_path + '/topic/' + topicData.tid + '.rss'; + topicData.rssFeedUrl = `${relative_path}/topic/${topicData.tid}.rss`; if (req.loggedIn) { - topicData.rssFeedUrl += '?uid=' + req.uid + '&token=' + rssToken; + topicData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; } topicData.postIndex = postIndex; @@ -98,12 +98,12 @@ topicsController.get = async function getTopic(req, res, callback) { addTags(topicData, req, res), incrementViewCount(req, tid), markAsRead(req, tid), - analytics.increment(['pageviews:byCid:' + topicData.category.cid]), + analytics.increment([`pageviews:byCid:${topicData.category.cid}`]), ]); topicData.pagination = pagination.create(currentPage, pageCount, req.query); topicData.pagination.rel.forEach(function (rel) { - rel.href = url + '/topic/' + topicData.slug + rel.href; + rel.href = `${url}/topic/${topicData.slug}${rel.href}`; res.locals.linkTags.push(rel); }); @@ -157,7 +157,7 @@ async function buildBreadcrumbs(topicData) { const breadcrumbs = [ { text: topicData.category.name, - url: relative_path + '/category/' + topicData.category.slug, + url: `${relative_path}/category/${topicData.category.slug}`, cid: topicData.category.cid, }, { @@ -185,7 +185,7 @@ async function addTags(topicData, req, res) { } if (description.length > 255) { - description = description.substr(0, 255) + '...'; + description = `${description.substr(0, 255)}...`; } description = description.replace(/\n/g, ' '); @@ -229,7 +229,7 @@ async function addTags(topicData, req, res) { res.locals.linkTags = [ { rel: 'canonical', - href: url + '/topic/' + topicData.slug, + href: `${url}/topic/${topicData.slug}`, }, ]; @@ -244,7 +244,7 @@ async function addTags(topicData, req, res) { if (topicData.category) { res.locals.linkTags.push({ rel: 'up', - href: url + '/category/' + topicData.category.slug, + href: `${url}/category/${topicData.category.slug}`, }); } } @@ -252,7 +252,7 @@ async function addTags(topicData, req, res) { async function addOGImageTags(res, topicData, postAtIndex) { const uploads = postAtIndex ? await posts.uploads.listWithSizes(postAtIndex.pid) : []; const images = uploads.map((upload) => { - upload.name = url + upload_url + '/files/' + upload.name; + upload.name = `${url + upload_url}/files/${upload.name}`; return upload; }); if (topicData.thumbs) { @@ -270,7 +270,7 @@ async function addOGImageTags(res, topicData, postAtIndex) { function addOGImageTag(res, image) { let imageUrl; if (typeof image === 'string' && !image.startsWith('http')) { - imageUrl = url + image.replace(new RegExp('^' + relative_path), ''); + imageUrl = url + image.replace(new RegExp(`^${relative_path}`), ''); } else if (typeof image === 'object') { imageUrl = image.name; } else { @@ -345,7 +345,7 @@ topicsController.pagination = async function (req, res, callback) { const paginationData = pagination.create(currentPage, pageCount); paginationData.rel.forEach(function (rel) { - rel.href = url + '/topic/' + topic.slug + rel.href; + rel.href = `${url}/topic/${topic.slug}${rel.href}`; }); res.json({ pagination: paginationData }); diff --git a/src/controllers/unread.js b/src/controllers/unread.js index ce1129aeff..6d2792e83a 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -41,15 +41,15 @@ unreadController.get = async function (req, res) { if (userSettings.usePagination && (page < 1 || page > data.pageCount)) { req.query.page = Math.max(1, Math.min(data.pageCount, page)); - return helpers.redirect(res, '/unread?' + querystring.stringify(req.query)); + return helpers.redirect(res, `/unread?${querystring.stringify(req.query)}`); } data.showSelect = true; data.showTopicTools = isPrivileged; - data.allCategoriesUrl = 'unread' + helpers.buildQueryString(req.query, 'cid', ''); + data.allCategoriesUrl = `unread${helpers.buildQueryString(req.query, 'cid', '')}`; data.selectedCategory = categoryData.selectedCategory; data.selectedCids = categoryData.selectedCids; data.selectCategoryLabel = '[[unread:mark_as_read]]'; - if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/unread') || req.originalUrl.startsWith(nconf.get('relative_path') + '/unread')) { + if (req.originalUrl.startsWith(`${nconf.get('relative_path')}/api/unread`) || req.originalUrl.startsWith(`${nconf.get('relative_path')}/unread`)) { data.title = '[[pages:unread]]'; data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[unread:title]]' }]); } diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index 932896bd87..a8a7773f20 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -162,14 +162,14 @@ uploadsController.uploadFile = async function (uid, uploadedFile) { } if (uploadedFile.size > meta.config.maximumFileSize * 1024) { - throw new Error('[[error:file-too-big, ' + meta.config.maximumFileSize + ']]'); + throw new Error(`[[error:file-too-big, ${meta.config.maximumFileSize}]]`); } const allowed = file.allowedExtensions(); const extension = path.extname(uploadedFile.name).toLowerCase(); if (allowed.length > 0 && (!extension || extension === '.' || !allowed.includes(extension))) { - throw new Error('[[error:invalid-file-type, ' + allowed.join(', ') + ']]'); + throw new Error(`[[error:invalid-file-type, ${allowed.join(', ')}]]`); } return await saveFileToLocal(uid, 'files', uploadedFile); @@ -179,7 +179,7 @@ async function saveFileToLocal(uid, folder, uploadedFile) { const name = uploadedFile.name || 'upload'; const extension = path.extname(name) || ''; - const filename = Date.now() + '-' + validator.escape(name.substr(0, name.length - extension.length)).substr(0, 255) + extension; + const filename = `${Date.now()}-${validator.escape(name.substr(0, name.length - extension.length)).substr(0, 255)}${extension}`; const upload = await file.saveFileToLocal(filename, folder, uploadedFile.path); const storedFile = { @@ -188,7 +188,7 @@ async function saveFileToLocal(uid, folder, uploadedFile) { name: uploadedFile.name, }; const fileKey = upload.url.replace(nconf.get('upload_url'), ''); - await db.sortedSetAdd('uid:' + uid + ':uploads', Date.now(), fileKey); + await db.sortedSetAdd(`uid:${uid}:uploads`, Date.now(), fileKey); const data = await plugins.hooks.fire('filter:uploadStored', { uid: uid, uploadedFile: uploadedFile, storedFile: storedFile }); return data.storedFile; } diff --git a/src/controllers/user.js b/src/controllers/user.js index 6d197f3239..ab69b7d8ff 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -77,15 +77,15 @@ userController.getUserDataByUID = async function (callerUid, uid) { }; userController.exportPosts = async function (req, res, next) { - sendExport(res.locals.uid + '_posts.csv', 'text/csv', res, next); + sendExport(`${res.locals.uid}_posts.csv`, 'text/csv', res, next); }; userController.exportUploads = function (req, res, next) { - sendExport(res.locals.uid + '_uploads.zip', 'application/zip', res, next); + sendExport(`${res.locals.uid}_uploads.zip`, 'application/zip', res, next); }; userController.exportProfile = async function (req, res, next) { - sendExport(res.locals.uid + '_profile.json', 'application/json', res, next); + sendExport(`${res.locals.uid}_profile.json`, 'application/json', res, next); }; function sendExport(filename, type, res, next) { @@ -93,7 +93,7 @@ function sendExport(filename, type, res, next) { root: path.join(__dirname, '../../build/export'), headers: { 'Content-Type': type, - 'Content-Disposition': 'attachment; filename=' + filename, + 'Content-Disposition': `attachment; filename=${filename}`, }, }, function (err) { if (err) { diff --git a/src/controllers/users.js b/src/controllers/users.js index 17d10fd517..611cf52619 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -37,7 +37,7 @@ usersController.search = async function (req, res) { const section = req.query.section || 'joindate'; searchData.pagination = pagination.create(req.query.page, searchData.pageCount, req.query); - searchData['section_' + section] = true; + searchData[`section_${section}`] = true; searchData.displayUserSearch = true; await render(req, res, searchData); }; @@ -141,7 +141,7 @@ usersController.getUsers = async function (set, uid, query) { isAdmin: isAdmin, isGlobalMod: isGlobalMod, displayUserSearch: canSearch, - ['section_' + (query.section || 'joindate')]: true, + [`section_${query.section || 'joindate'}`]: true, }; }; diff --git a/src/controllers/write/users.js b/src/controllers/write/users.js index 5e3c7acbc5..4fc80aa6f1 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -146,7 +146,7 @@ Users.revokeSession = async (req, res) => { return helpers.formatApiResponse(404, res); } - const sids = await db.getSortedSetRange('uid:' + req.params.uid + ':sessions', 0, -1); + const sids = await db.getSortedSetRange(`uid:${req.params.uid}:sessions`, 0, -1); let _id; for (const sid of sids) { /* eslint-disable no-await-in-loop */ @@ -204,7 +204,7 @@ Users.invite = async (req, res) => { invites = await user.getInvitesNumber(req.uid); } if (!isAdmin && max && invites >= max) { - return helpers.formatApiResponse(403, res, new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); + return helpers.formatApiResponse(403, res, new Error(`[[error:invite-maximum-met, ${invites}, ${max}]]`)); } await user.sendInvitationEmail(req.uid, email, groupsToJoin); diff --git a/src/coverPhoto.js b/src/coverPhoto.js index 7d18480e11..cf8163fe40 100644 --- a/src/coverPhoto.js +++ b/src/coverPhoto.js @@ -17,9 +17,9 @@ coverPhoto.getDefaultProfileCover = function (uid) { }; function getCover(type, id) { - const defaultCover = relative_path + '/assets/images/cover-default.png'; - if (meta.config[type + ':defaultCovers']) { - const covers = String(meta.config[type + ':defaultCovers']).trim().split(/[\s,]+/g); + const defaultCover = `${relative_path}/assets/images/cover-default.png`; + if (meta.config[`${type}:defaultCovers`]) { + const covers = String(meta.config[`${type}:defaultCovers`]).trim().split(/[\s,]+/g); let coverPhoto = defaultCover; if (!covers.length) { return coverPhoto; diff --git a/src/database/cache.js b/src/database/cache.js index 1e657d6b62..069b181a80 100644 --- a/src/database/cache.js +++ b/src/database/cache.js @@ -3,7 +3,7 @@ module.exports.create = function (name) { const cacheCreate = require('../cacheCreate'); return cacheCreate({ - name: name + '-object', + name: `${name}-object`, max: 40000, length: function () { return 1; }, maxAge: 0, diff --git a/src/database/index.js b/src/database/index.js index 6ecfb42778..7119d55228 100644 --- a/src/database/index.js +++ b/src/database/index.js @@ -10,7 +10,7 @@ if (!databaseName) { process.exit(); } -const primaryDB = require('./' + databaseName); +const primaryDB = require(`./${databaseName}`); primaryDB.parseIntFields = function (data, intFields, requestedFields) { intFields.forEach((field) => { @@ -25,7 +25,7 @@ primaryDB.initSessionStore = async function () { let sessionStoreDB = primaryDB; if (nconf.get('session_store')) { - sessionStoreDB = require('./' + sessionStoreConfig.name); + sessionStoreDB = require(`./${sessionStoreConfig.name}`); } else if (nconf.get('redis')) { // if redis is specified, use it as session store over others sessionStoreDB = require('./redis'); diff --git a/src/database/mongo/connection.js b/src/database/mongo/connection.js index 1001c58c03..21aac81b84 100644 --- a/src/database/mongo/connection.js +++ b/src/database/mongo/connection.js @@ -12,7 +12,7 @@ connection.getConnectionString = function (mongo) { var usernamePassword = ''; var uri = mongo.uri || ''; if (mongo.username && mongo.password) { - usernamePassword = nconf.get('mongo:username') + ':' + encodeURIComponent(nconf.get('mongo:password')) + '@'; + usernamePassword = `${nconf.get('mongo:username')}:${encodeURIComponent(nconf.get('mongo:password'))}@`; } else if (!uri.includes('@') || !uri.slice(uri.indexOf('://') + 3, uri.indexOf('@'))) { winston.warn('You have no mongo username/password setup!'); } @@ -35,10 +35,10 @@ connection.getConnectionString = function (mongo) { var servers = []; for (var i = 0; i < hosts.length; i += 1) { - servers.push(hosts[i] + ':' + ports[i]); + servers.push(`${hosts[i]}:${ports[i]}`); } - return uri || 'mongodb://' + usernamePassword + servers.join() + '/' + mongo.database; + return uri || `mongodb://${usernamePassword}${servers.join()}/${mongo.database}`; }; connection.getConnectionOptions = function (mongo) { diff --git a/src/database/mongo/helpers.js b/src/database/mongo/helpers.js index 69b750572c..f7aed28c41 100644 --- a/src/database/mongo/helpers.js +++ b/src/database/mongo/helpers.js @@ -60,7 +60,7 @@ helpers.buildMatchQuery = function (match) { } _match = utils.escapeRegexChars(_match); if (!match.startsWith('*')) { - _match = '^' + _match; + _match = `^${_match}`; } if (!match.endsWith('*')) { _match += '$'; diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index 77fbc8f7ab..934e77bc1a 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -12,7 +12,7 @@ module.exports = function (module) { return await sortedSetAddBulk(key, score, value); } if (!utils.isNumber(score)) { - throw new Error('[[error:invalid-score, ' + score + ']]'); + throw new Error(`[[error:invalid-score, ${score}]]`); } value = helpers.valueToString(value); @@ -35,7 +35,7 @@ module.exports = function (module) { } for (let i = 0; i < scores.length; i += 1) { if (!utils.isNumber(scores[i])) { - throw new Error('[[error:invalid-score, ' + scores[i] + ']]'); + throw new Error(`[[error:invalid-score, ${scores[i]}]]`); } } values = values.map(helpers.valueToString); @@ -54,7 +54,7 @@ module.exports = function (module) { const isArrayOfScores = Array.isArray(scores); if ((!isArrayOfScores && !utils.isNumber(scores)) || (isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false))) { - throw new Error('[[error:invalid-score, ' + scores + ']]'); + throw new Error(`[[error:invalid-score, ${scores}]]`); } if (isArrayOfScores && scores.length !== keys.length) { @@ -77,7 +77,7 @@ module.exports = function (module) { var bulk = module.client.collection('objects').initializeUnorderedBulkOp(); data.forEach(function (item) { if (!utils.isNumber(item[1])) { - throw new Error('[[error:invalid-score, ' + item[1] + ']]'); + throw new Error(`[[error:invalid-score, ${item[1]}]]`); } bulk.find({ _key: item[0], value: String(item[2]) }).upsert().updateOne({ $set: { score: parseFloat(item[1]) } }); }); diff --git a/src/database/mongo/sorted/intersect.js b/src/database/mongo/sorted/intersect.js index 4ec0cc7471..88bf8830fe 100644 --- a/src/database/mongo/sorted/intersect.js +++ b/src/database/mongo/sorted/intersect.js @@ -164,7 +164,7 @@ module.exports = function (module) { const aggregate = {}; if (params.aggregate) { - aggregate['$' + params.aggregate.toLowerCase()] = '$score'; + aggregate[`$${params.aggregate.toLowerCase()}`] = '$score'; } else { aggregate.$sum = '$score'; } diff --git a/src/database/mongo/sorted/union.js b/src/database/mongo/sorted/union.js index 523d37ee16..e528bc2fe0 100644 --- a/src/database/mongo/sorted/union.js +++ b/src/database/mongo/sorted/union.js @@ -35,7 +35,7 @@ module.exports = function (module) { var aggregate = {}; if (params.aggregate) { - aggregate['$' + params.aggregate.toLowerCase()] = '$score'; + aggregate[`$${params.aggregate.toLowerCase()}`] = '$score'; } else { aggregate.$sum = '$score'; } diff --git a/src/database/postgres.js b/src/database/postgres.js index f144b59c8c..9187f73bb7 100644 --- a/src/database/postgres.js +++ b/src/database/postgres.js @@ -55,7 +55,7 @@ postgresModule.init = async function () { try { await checkUpgrade(client); } catch (err) { - winston.error('NodeBB could not connect to your PostgreSQL database. PostgreSQL returned the following error: ' + err.message); + winston.error(`NodeBB could not connect to your PostgreSQL database. PostgreSQL returned the following error: ${err.message}`); throw err; } finally { client.release(); @@ -339,7 +339,7 @@ postgresModule.createIndices = function (callback) { async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_object__expireAt" ON "legacy_object"("expireAt" ASC)`), ], function (err) { if (err) { - winston.error('Error creating index ' + err.message); + winston.error(`Error creating index ${err.message}`); return callback(err); } winston.info('[database] Checking database indices done!'); diff --git a/src/database/postgres/helpers.js b/src/database/postgres/helpers.js index 3a6e583915..5a24aa5da3 100644 --- a/src/database/postgres/helpers.js +++ b/src/database/postgres/helpers.js @@ -48,7 +48,7 @@ SELECT "type" }); if (res.rows[0].type !== type) { - throw new Error('database: cannot insert ' + JSON.stringify(key) + ' as ' + type + ' because it already exists as ' + res.rows[0].type); + throw new Error(`database: cannot insert ${JSON.stringify(key)} as ${type} because it already exists as ${res.rows[0].type}`); } }; @@ -84,8 +84,8 @@ SELECT "_key", "type" var invalid = res.rows.filter(r => r.type !== type); if (invalid.length) { - const parts = invalid.map(r => JSON.stringify(r._key) + ' is ' + r.type); - throw new Error('database: cannot insert multiple objects as ' + type + ' because they already exist: ' + parts.join(', ')); + const parts = invalid.map(r => `${JSON.stringify(r._key)} is ${r.type}`); + throw new Error(`database: cannot insert multiple objects as ${type} because they already exist: ${parts.join(', ')}`); } var missing = keys.filter(function (k) { @@ -93,7 +93,7 @@ SELECT "_key", "type" }); if (missing.length) { - throw new Error('database: failed to insert keys for objects: ' + JSON.stringify(missing)); + throw new Error(`database: failed to insert keys for objects: ${JSON.stringify(missing)}`); } }; diff --git a/src/database/postgres/main.js b/src/database/postgres/main.js index e122eafc07..c5fbb67847 100644 --- a/src/database/postgres/main.js +++ b/src/database/postgres/main.js @@ -45,10 +45,10 @@ module.exports = function (module) { module.scan = async function (params) { let match = params.match; if (match.startsWith('*')) { - match = '%' + match.substring(1); + match = `%${match.substring(1)}`; } if (match.endsWith('*')) { - match = match.substring(0, match.length - 1) + '%'; + match = `${match.substring(0, match.length - 1)}%`; } const res = await module.pool.query({ diff --git a/src/database/postgres/sorted.js b/src/database/postgres/sorted.js index 5733a2bb2f..14d68a7374 100644 --- a/src/database/postgres/sorted.js +++ b/src/database/postgres/sorted.js @@ -59,7 +59,7 @@ module.exports = function (module) { } const res = await module.pool.query({ - name: 'getSortedSetRangeWithScores' + (sort > 0 ? 'Asc' : 'Desc'), + name: `getSortedSetRangeWithScores${sort > 0 ? 'Asc' : 'Desc'}`, text: ` SELECT z."value", z."score" @@ -68,7 +68,7 @@ SELECT z."value", ON o."_key" = z."_key" AND o."type" = z."type" WHERE o."_key" = ANY($1::TEXT[]) - ORDER BY z."score" ` + (sort > 0 ? 'ASC' : 'DESC') + ` + ORDER BY z."score" ${sort > 0 ? 'ASC' : 'DESC'} LIMIT $3::INTEGER OFFSET $2::INTEGER`, values: [key, start, limit], @@ -124,7 +124,7 @@ OFFSET $2::INTEGER`, } const res = await module.pool.query({ - name: 'getSortedSetRangeByScoreWithScores' + (sort > 0 ? 'Asc' : 'Desc'), + name: `getSortedSetRangeByScoreWithScores${sort > 0 ? 'Asc' : 'Desc'}`, text: ` SELECT z."value", z."score" @@ -135,7 +135,7 @@ SELECT z."value", WHERE o."_key" = ANY($1::TEXT[]) AND (z."score" >= $4::NUMERIC OR $4::NUMERIC IS NULL) AND (z."score" <= $5::NUMERIC OR $5::NUMERIC IS NULL) - ORDER BY z."score" ` + (sort > 0 ? 'ASC' : 'DESC') + ` + ORDER BY z."score" ${sort > 0 ? 'ASC' : 'DESC'} LIMIT $3::INTEGER OFFSET $2::INTEGER`, values: [key, start, count, min, max], @@ -248,13 +248,13 @@ SELECT o."_key" k, async function getSortedSetRank(sort, keys, values) { values = values.map(helpers.valueToString); const res = await module.pool.query({ - name: 'getSortedSetRank' + sort, + name: `getSortedSetRank${sort}`, text: ` SELECT (SELECT r FROM (SELECT z."value" v, RANK() OVER (PARTITION BY o."_key" - ORDER BY z."score" ` + sort + `, - z."value" ` + sort + `) - 1 r + ORDER BY z."score" ${sort}, + z."value" ${sort}) - 1 r FROM "legacy_object_live" o INNER JOIN "legacy_zset" z ON o."_key" = z."_key" @@ -518,14 +518,14 @@ RETURNING "score" s`, var q = buildLexQuery(key, min, max); const res = await module.pool.query({ - name: 'sortedSetLexCount' + q.suffix, + name: `sortedSetLexCount${q.suffix}`, text: ` SELECT COUNT(*) c FROM "legacy_object_live" o INNER JOIN "legacy_zset" z ON o."_key" = z."_key" AND o."type" = z."type" - WHERE ` + q.where, + WHERE ${q.where}`, values: q.values, }); @@ -540,17 +540,17 @@ SELECT COUNT(*) c q.values.push(start); q.values.push(count <= 0 ? null : count); const res = await module.pool.query({ - name: 'sortedSetLex' + (sort > 0 ? 'Asc' : 'Desc') + q.suffix, + name: `sortedSetLex${sort > 0 ? 'Asc' : 'Desc'}${q.suffix}`, text: ` SELECT z."value" v FROM "legacy_object_live" o INNER JOIN "legacy_zset" z ON o."_key" = z."_key" AND o."type" = z."type" - WHERE ` + q.where + ` - ORDER BY z."value" ` + (sort > 0 ? 'ASC' : 'DESC') + ` - LIMIT $` + q.values.length + `::INTEGER -OFFSET $` + (q.values.length - 1) + `::INTEGER`, + WHERE ${q.where} + ORDER BY z."value" ${sort > 0 ? 'ASC' : 'DESC'} + LIMIT $${q.values.length}::INTEGER +OFFSET $${q.values.length - 1}::INTEGER`, values: q.values, }); @@ -560,13 +560,13 @@ OFFSET $` + (q.values.length - 1) + `::INTEGER`, module.sortedSetRemoveRangeByLex = async function (key, min, max) { var q = buildLexQuery(key, min, max); await module.pool.query({ - name: 'sortedSetRemoveRangeByLex' + q.suffix, + name: `sortedSetRemoveRangeByLex${q.suffix}`, text: ` DELETE FROM "legacy_zset" z USING "legacy_object_live" o WHERE o."_key" = z."_key" AND o."type" = z."type" - AND ` + q.where, + AND ${q.where}`, values: q.values, }); }; @@ -582,15 +582,15 @@ DELETE FROM "legacy_zset" z if (min.match(/^\(/)) { q.values.push(min.substr(1)); q.suffix += 'GT'; - q.where += ` AND z."value" > $` + q.values.length + `::TEXT COLLATE "C"`; + q.where += ` AND z."value" > $${q.values.length}::TEXT COLLATE "C"`; } else if (min.match(/^\[/)) { q.values.push(min.substr(1)); q.suffix += 'GE'; - q.where += ` AND z."value" >= $` + q.values.length + `::TEXT COLLATE "C"`; + q.where += ` AND z."value" >= $${q.values.length}::TEXT COLLATE "C"`; } else { q.values.push(min); q.suffix += 'GE'; - q.where += ` AND z."value" >= $` + q.values.length + `::TEXT COLLATE "C"`; + q.where += ` AND z."value" >= $${q.values.length}::TEXT COLLATE "C"`; } } @@ -598,15 +598,15 @@ DELETE FROM "legacy_zset" z if (max.match(/^\(/)) { q.values.push(max.substr(1)); q.suffix += 'LT'; - q.where += ` AND z."value" < $` + q.values.length + `::TEXT COLLATE "C"`; + q.where += ` AND z."value" < $${q.values.length}::TEXT COLLATE "C"`; } else if (max.match(/^\[/)) { q.values.push(max.substr(1)); q.suffix += 'LE'; - q.where += ` AND z."value" <= $` + q.values.length + `::TEXT COLLATE "C"`; + q.where += ` AND z."value" <= $${q.values.length}::TEXT COLLATE "C"`; } else { q.values.push(max); q.suffix += 'LE'; - q.where += ` AND z."value" <= $` + q.values.length + `::TEXT COLLATE "C"`; + q.where += ` AND z."value" <= $${q.values.length}::TEXT COLLATE "C"`; } } @@ -616,11 +616,11 @@ DELETE FROM "legacy_zset" z module.getSortedSetScan = async function (params) { let match = params.match; if (match.startsWith('*')) { - match = '%' + match.substring(1); + match = `%${match.substring(1)}`; } if (match.endsWith('*')) { - match = match.substring(0, match.length - 1) + '%'; + match = `${match.substring(0, match.length - 1)}%`; } const res = await module.pool.query({ diff --git a/src/database/postgres/sorted/add.js b/src/database/postgres/sorted/add.js index 32dc2f6325..24e2bad459 100644 --- a/src/database/postgres/sorted/add.js +++ b/src/database/postgres/sorted/add.js @@ -13,7 +13,7 @@ module.exports = function (module) { return await sortedSetAddBulk(key, score, value); } if (!utils.isNumber(score)) { - throw new Error('[[error:invalid-score, ' + score + ']]'); + throw new Error(`[[error:invalid-score, ${score}]]`); } value = helpers.valueToString(value); score = parseFloat(score); @@ -41,7 +41,7 @@ module.exports = function (module) { } for (let i = 0; i < scores.length; i += 1) { if (!utils.isNumber(scores[i])) { - throw new Error('[[error:invalid-score, ' + scores[i] + ']]'); + throw new Error(`[[error:invalid-score, ${scores[i]}]]`); } } values = values.map(helpers.valueToString); @@ -71,7 +71,7 @@ DO UPDATE SET "score" = EXCLUDED."score"`, const isArrayOfScores = Array.isArray(scores); if ((!isArrayOfScores && !utils.isNumber(scores)) || (isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false))) { - throw new Error('[[error:invalid-score, ' + scores + ']]'); + throw new Error(`[[error:invalid-score, ${scores}]]`); } if (isArrayOfScores && scores.length !== keys.length) { @@ -110,7 +110,7 @@ INSERT INTO "legacy_zset" ("_key", "value", "score") const scores = []; data.forEach(function (item) { if (!utils.isNumber(item[1])) { - throw new Error('[[error:invalid-score, ' + item[1] + ']]'); + throw new Error(`[[error:invalid-score, ${item[1]}]]`); } keys.push(item[0]); scores.push(item[1]); diff --git a/src/database/postgres/sorted/intersect.js b/src/database/postgres/sorted/intersect.js index b577058872..04eeed49e6 100644 --- a/src/database/postgres/sorted/intersect.js +++ b/src/database/postgres/sorted/intersect.js @@ -56,10 +56,10 @@ SELECT COUNT(*) c } const res = await module.pool.query({ - name: 'getSortedSetIntersect' + aggregate + (params.sort > 0 ? 'Asc' : 'Desc') + 'WithScores', + name: `getSortedSetIntersect${aggregate}${params.sort > 0 ? 'Asc' : 'Desc'}WithScores`, text: ` WITH A AS (SELECT z."value", - ` + aggregate + `(z."score" * k."weight") "score", + ${aggregate}(z."score" * k."weight") "score", COUNT(*) c FROM UNNEST($1::TEXT[], $2::NUMERIC[]) k("_key", "weight") INNER JOIN "legacy_object_live" o @@ -72,7 +72,7 @@ SELECT A."value", A."score" FROM A WHERE c = array_length($1::TEXT[], 1) - ORDER BY A."score" ` + (params.sort > 0 ? 'ASC' : 'DESC') + ` + ORDER BY A."score" ${params.sort > 0 ? 'ASC' : 'DESC'} LIMIT $4::INTEGER OFFSET $3::INTEGER`, values: [sets, weights, start, limit], diff --git a/src/database/postgres/sorted/union.js b/src/database/postgres/sorted/union.js index aec22ae1ef..7f330e70c2 100644 --- a/src/database/postgres/sorted/union.js +++ b/src/database/postgres/sorted/union.js @@ -50,10 +50,10 @@ SELECT COUNT(DISTINCT z."value") c } const res = await module.pool.query({ - name: 'getSortedSetUnion' + aggregate + (params.sort > 0 ? 'Asc' : 'Desc') + 'WithScores', + name: `getSortedSetUnion${aggregate}${params.sort > 0 ? 'Asc' : 'Desc'}WithScores`, text: ` WITH A AS (SELECT z."value", - ` + aggregate + `(z."score" * k."weight") "score" + ${aggregate}(z."score" * k."weight") "score" FROM UNNEST($1::TEXT[], $2::NUMERIC[]) k("_key", "weight") INNER JOIN "legacy_object_live" o ON o."_key" = k."_key" @@ -64,7 +64,7 @@ WITH A AS (SELECT z."value", SELECT A."value", A."score" FROM A - ORDER BY A."score" ` + (params.sort > 0 ? 'ASC' : 'DESC') + ` + ORDER BY A."score" ${params.sort > 0 ? 'ASC' : 'DESC'} LIMIT $4::INTEGER OFFSET $3::INTEGER`, values: [sets, weights, start, limit], diff --git a/src/database/redis.js b/src/database/redis.js index ff71ee5afc..ae15dae8c1 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -83,7 +83,7 @@ redisModule.info = async function (cxn) { } }); - const keyInfo = redisData['db' + nconf.get('redis:database')]; + const keyInfo = redisData[`db${nconf.get('redis:database')}`]; if (keyInfo) { const split = keyInfo.split(','); redisData.keys = (split[0] || '').replace('keys=', ''); @@ -108,7 +108,7 @@ redisModule.socketAdapter = async function () { const pub = await connection.connect(nconf.get('redis')); const sub = await connection.connect(nconf.get('redis')); return redisAdapter({ - key: 'db:' + nconf.get('redis:database') + ':adapter_key', + key: `db:${nconf.get('redis:database')}:adapter_key`, pubClient: pub, subClient: sub, }); diff --git a/src/database/redis/pubsub.js b/src/database/redis/pubsub.js index 73d7c11b33..e7b57e195f 100644 --- a/src/database/redis/pubsub.js +++ b/src/database/redis/pubsub.js @@ -9,7 +9,7 @@ const connection = require('./connection'); let channelName; const PubSub = function () { const self = this; - channelName = 'db:' + nconf.get('redis:database') + ':pubsub_channel'; + channelName = `db:${nconf.get('redis:database')}:pubsub_channel`; connection.connect().then(function (client) { self.subClient = client; diff --git a/src/database/redis/sorted.js b/src/database/redis/sorted.js index 5540c7e5b7..3e293eafff 100644 --- a/src/database/redis/sorted.js +++ b/src/database/redis/sorted.js @@ -268,10 +268,10 @@ module.exports = function (module) { } if (min !== minmin && !min.match(/^[[(]/)) { - min = '[' + min; + min = `[${min}`; } if (max !== maxmax && !max.match(/^[[(]/)) { - max = '[' + max; + max = `[${max}`; } const args = [key, min, max]; if (count) { diff --git a/src/database/redis/sorted/add.js b/src/database/redis/sorted/add.js index f8d5c4bd8c..c7ab9a809f 100644 --- a/src/database/redis/sorted/add.js +++ b/src/database/redis/sorted/add.js @@ -12,7 +12,7 @@ module.exports = function (module) { return await sortedSetAddMulti(key, score, value); } if (!utils.isNumber(score)) { - throw new Error('[[error:invalid-score, ' + score + ']]'); + throw new Error(`[[error:invalid-score, ${score}]]`); } await module.client.async.zadd(key, score, String(value)); }; @@ -27,7 +27,7 @@ module.exports = function (module) { } for (let i = 0; i < scores.length; i += 1) { if (!utils.isNumber(scores[i])) { - throw new Error('[[error:invalid-score, ' + scores[i] + ']]'); + throw new Error(`[[error:invalid-score, ${scores[i]}]]`); } } var args = [key]; @@ -44,7 +44,7 @@ module.exports = function (module) { const isArrayOfScores = Array.isArray(scores); if ((!isArrayOfScores && !utils.isNumber(scores)) || (isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false))) { - throw new Error('[[error:invalid-score, ' + scores + ']]'); + throw new Error(`[[error:invalid-score, ${scores}]]`); } if (isArrayOfScores && scores.length !== keys.length) { @@ -67,7 +67,7 @@ module.exports = function (module) { var batch = module.client.batch(); data.forEach(function (item) { if (!utils.isNumber(item[1])) { - throw new Error('[[error:invalid-score, ' + item[1] + ']]'); + throw new Error(`[[error:invalid-score, ${item[1]}]]`); } batch.zadd(item[0], item[1], item[2]); }); diff --git a/src/database/redis/sorted/intersect.js b/src/database/redis/sorted/intersect.js index 02a0d21f75..17a2041e69 100644 --- a/src/database/redis/sorted/intersect.js +++ b/src/database/redis/sorted/intersect.js @@ -7,7 +7,7 @@ module.exports = function (module) { if (!Array.isArray(keys) || !keys.length) { return 0; } - var tempSetName = 'temp_' + Date.now(); + var tempSetName = `temp_${Date.now()}`; var interParams = [tempSetName, keys.length].concat(keys); @@ -35,7 +35,7 @@ module.exports = function (module) { var stop = params.hasOwnProperty('stop') ? params.stop : -1; var weights = params.weights || []; - var tempSetName = 'temp_' + Date.now(); + var tempSetName = `temp_${Date.now()}`; var interParams = [tempSetName, sets.length].concat(sets); if (weights.length) { diff --git a/src/database/redis/sorted/union.js b/src/database/redis/sorted/union.js index aa34b38df6..bb08312901 100644 --- a/src/database/redis/sorted/union.js +++ b/src/database/redis/sorted/union.js @@ -4,7 +4,7 @@ module.exports = function (module) { const helpers = require('../helpers'); module.sortedSetUnionCard = async function (keys) { - var tempSetName = 'temp_' + Date.now(); + var tempSetName = `temp_${Date.now()}`; if (!keys.length) { return 0; } @@ -31,7 +31,7 @@ module.exports = function (module) { return []; } - var tempSetName = 'temp_' + Date.now(); + var tempSetName = `temp_${Date.now()}`; var rangeParams = [tempSetName, params.start, params.stop]; if (params.withScores) { diff --git a/src/emailer.js b/src/emailer.js index 70332a9a55..84ace4403d 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -89,7 +89,7 @@ const buildCustomTemplates = async (config) => { Benchpress.flush(); winston.verbose('[emailer] Built custom email templates'); } catch (err) { - winston.error('[emailer] Failed to build custom email templates\n' + err.stack); + winston.error(`[emailer] Failed to build custom email templates\n${err.stack}`); } }; @@ -105,9 +105,9 @@ Emailer.getTemplates = async (config) => { return { path: path, fullpath: email, - text: config['email:custom:' + path] || original, + text: config[`email:custom:${path}`] || original, original: original, - isCustom: !!config['email:custom:' + path], + isCustom: !!config[`email:custom:${path}`], }; })); return templates; @@ -270,8 +270,8 @@ Emailer.sendToEmail = async (template, email, language, params) => { const unsubUrl = [nconf.get('url'), 'email', 'unsubscribe', payload].join('/'); params.headers = { - 'List-Id': '<' + [template, params.uid, getHostname()].join('.') + '>', - 'List-Unsubscribe': '<' + unsubUrl + '>', + 'List-Id': `<${[template, params.uid, getHostname()].join('.')}>`, + 'List-Unsubscribe': `<${unsubUrl}>`, 'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click', ...params.headers, }; @@ -297,9 +297,9 @@ Emailer.sendToEmail = async (template, email, language, params) => { const data = await Plugins.hooks.fire('filter:email.modify', { _raw: params, to: email, - from: meta.config['email:from'] || 'no-reply@' + getHostname(), + from: meta.config['email:from'] || `no-reply@${getHostname()}`, from_name: meta.config['email:from_name'] || 'NodeBB', - subject: '[' + meta.config.title + '] ' + _.unescape(subject), + subject: `[${meta.config.title}] ${_.unescape(subject)}`, html: html, plaintext: htmlToText(html, { tags: { img: { format: 'skip' } }, @@ -333,15 +333,15 @@ Emailer.sendViaFallback = async (data) => { delete data.plaintext; // NodeMailer uses a combined "from" - data.from = data.from_name + '<' + data.from + '>'; + data.from = `${data.from_name}<${data.from}>`; delete data.from_name; - winston.verbose('[emailer] Sending email to uid ' + data.uid + ' (' + data.to + ')'); + winston.verbose(`[emailer] Sending email to uid ${data.uid} (${data.to})`); await Emailer.fallbackTransport.sendMail(data); }; Emailer.renderAndTranslate = async (template, params, lang) => { - const html = await app.renderAsync('emails/' + template, params); + const html = await app.renderAsync(`emails/${template}`, params); return await translator.translate(html, lang); }; diff --git a/src/events.js b/src/events.js index d835bd1d84..6d4f1aed57 100644 --- a/src/events.js +++ b/src/events.js @@ -77,9 +77,9 @@ events.log = async function (data) { await Promise.all([ db.sortedSetsAdd([ 'events:time', - 'events:time:' + data.type, + `events:time:${data.type}`, ], data.timestamp, eid), - db.setObject('event:' + eid, data), + db.setObject(`event:${eid}`, data), ]); plugins.hooks.fire('action:events.log', { data: data }); }; @@ -93,8 +93,8 @@ events.getEvents = async function (filter, start, stop, from, to) { to = Date.now(); } - const eids = await db.getSortedSetRevRangeByScore('events:time' + (filter ? ':' + filter : ''), start, stop - start + 1, to, from); - let eventsData = await db.getObjects(eids.map(eid => 'event:' + eid)); + const eids = await db.getSortedSetRevRangeByScore(`events:time${filter ? `:${filter}` : ''}`, start, stop - start + 1, to, from); + let eventsData = await db.getObjects(eids.map(eid => `event:${eid}`)); eventsData = eventsData.filter(Boolean); await addUserData(eventsData, 'uid', 'user'); await addUserData(eventsData, 'targetUid', 'targetUser'); @@ -143,9 +143,9 @@ async function addUserData(eventsData, field, objectName) { } events.deleteEvents = async function (eids) { - const keys = eids.map(eid => 'event:' + eid); + const keys = eids.map(eid => `event:${eid}`); const eventData = await db.getObjectsFields(keys, ['type']); - const sets = _.uniq(['events:time'].concat(eventData.map(e => 'events:time:' + e.type))); + const sets = _.uniq(['events:time'].concat(eventData.map(e => `events:time:${e.type}`))); await Promise.all([ db.deleteAll(keys), db.sortedSetRemove(sets, eids), diff --git a/src/file.js b/src/file.js index 6876ad75b5..8a17947524 100644 --- a/src/file.js +++ b/src/file.js @@ -25,11 +25,11 @@ file.saveFileToLocal = async function (filename, folder, tempPath) { throw new Error('[[error:invalid-path]]'); } - winston.verbose('Saving file ' + filename + ' to : ' + uploadPath); + winston.verbose(`Saving file ${filename} to : ${uploadPath}`); await mkdirp(path.dirname(uploadPath)); await fs.promises.copyFile(tempPath, uploadPath); return { - url: '/assets/uploads/' + (folder ? folder + '/' : '') + filename, + url: `/assets/uploads/${folder ? `${folder}/` : ''}${filename}`, path: uploadPath, }; }; @@ -63,7 +63,7 @@ file.allowedExtensions = function () { allowedExtensions = allowedExtensions.filter(Boolean).map(function (extension) { extension = extension.trim(); if (!extension.startsWith('.')) { - extension = '.' + extension; + extension = `.${extension}`; } return extension.toLowerCase(); }); @@ -135,7 +135,7 @@ file.linkDirs = async function linkDirs(sourceDir, destDir, relative) { file.typeToExtension = function (type) { let extension = ''; if (type) { - extension = '.' + mime.getExtension(type); + extension = `.${mime.getExtension(type)}`; } return extension; }; diff --git a/src/flags.js b/src/flags.js index 1799b379d8..56a671b747 100644 --- a/src/flags.js +++ b/src/flags.js @@ -69,7 +69,7 @@ Flags.init = async function () { quick: function (sets, orSets, key, uid) { switch (key) { case 'mine': - sets.push('flags:byAssignee:' + uid); + sets.push(`flags:byAssignee:${uid}`); break; case 'unresolved': @@ -87,14 +87,14 @@ Flags.init = async function () { const data = await plugins.hooks.fire('filter:flags.getFilters', hookData); Flags._filters = data.filters; } catch (err) { - winston.error('[flags/init] Could not retrieve filters\n' + err.stack); + winston.error(`[flags/init] Could not retrieve filters\n${err.stack}`); Flags._filters = {}; } }; Flags.get = async function (flagId) { const [base, history, notes, reports] = await Promise.all([ - db.getObject('flag:' + flagId), + db.getObject(`flag:${flagId}`), Flags.getHistory(flagId), Flags.getNotes(flagId), Flags.getReports(flagId), @@ -108,7 +108,7 @@ Flags.get = async function (flagId) { assignee: null, ...base, datetimeISO: utils.toISOString(base.datetime), - target_readable: base.type.charAt(0).toUpperCase() + base.type.slice(1) + ' ' + base.targetId, + target_readable: `${base.type.charAt(0).toUpperCase() + base.type.slice(1)} ${base.targetId}`, target: await Flags.getTarget(base.type, base.targetId, 0), history: history, notes: notes, @@ -140,7 +140,7 @@ Flags.getFlagIdsWithFilters = async function ({ filters, uid }) { if (Flags._filters.hasOwnProperty(type)) { Flags._filters[type](sets, orSets, filters[type], uid); } else { - winston.warn('[flags/list] No flag filter type found: ' + type); + winston.warn(`[flags/list] No flag filter type found: ${type}`); } } } @@ -188,7 +188,7 @@ Flags.list = async function (data) { const reportCounts = await db.sortedSetsCard(flagIds.map(flagId => `flag:${flagId}:reports`)); const flags = await Promise.all(flagIds.map(async (flagId, idx) => { - let flagObj = await db.getObject('flag:' + flagId); + let flagObj = await db.getObject(`flag:${flagId}`); flagObj = { state: 'open', assignee: null, @@ -198,7 +198,7 @@ Flags.list = async function (data) { flagObj.labelClass = Flags._constants.state_class[flagObj.state]; return Object.assign(flagObj, { - target_readable: flagObj.type.charAt(0).toUpperCase() + flagObj.type.slice(1) + ' ' + flagObj.targetId, + target_readable: `${flagObj.type.charAt(0).toUpperCase() + flagObj.type.slice(1)} ${flagObj.targetId}`, datetimeISO: utils.toISOString(flagObj.datetime), }); })); @@ -305,13 +305,13 @@ Flags.validate = async function (payload) { }; Flags.getNotes = async function (flagId) { - let notes = await db.getSortedSetRevRangeWithScores('flag:' + flagId + ':notes', 0, -1); + let notes = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:notes`, 0, -1); notes = await modifyNotes(notes); return notes; }; Flags.getNote = async function (flagId, datetime) { - let notes = await db.getSortedSetRangeByScoreWithScores('flag:' + flagId + ':notes', 0, 1, datetime, datetime); + let notes = await db.getSortedSetRangeByScoreWithScores(`flag:${flagId}:notes`, 0, 1, datetime, datetime); if (!notes.length) { throw new Error('[[error:invalid-data]]'); } @@ -359,12 +359,12 @@ async function modifyNotes(notes) { } Flags.deleteNote = async function (flagId, datetime) { - const note = await db.getSortedSetRangeByScore('flag:' + flagId + ':notes', 0, 1, datetime, datetime); + const note = await db.getSortedSetRangeByScore(`flag:${flagId}:notes`, 0, 1, datetime, datetime); if (!note.length) { throw new Error('[[error:invalid-data]]'); } - await db.sortedSetRemove('flag:' + flagId + ':notes', note[0]); + await db.sortedSetRemove(`flag:${flagId}:notes`, note[0]); }; Flags.create = async function (type, id, uid, reason, timestamp) { @@ -405,7 +405,7 @@ Flags.create = async function (type, id, uid, reason, timestamp) { const batched = []; batched.push( - db.setObject('flag:' + flagId, { + db.setObject(`flag:${flagId}`, { flagId: flagId, type: type, targetId: id, @@ -414,22 +414,22 @@ Flags.create = async function (type, id, uid, reason, timestamp) { }), Flags.addReport(flagId, type, id, uid, reason, timestamp), db.sortedSetAdd('flags:datetime', timestamp, flagId), // by time, the default - db.sortedSetAdd('flags:byType:' + type, timestamp, flagId), // by flag type + db.sortedSetAdd(`flags:byType:${type}`, timestamp, flagId), // by flag type db.sortedSetIncrBy('flags:byTarget', 1, [type, id].join(':')), // by flag target (score is count) analytics.increment('flags') // some fancy analytics ); if (targetUid) { - batched.push(db.sortedSetAdd('flags:byTargetUid:' + targetUid, timestamp, flagId)); // by target uid + batched.push(db.sortedSetAdd(`flags:byTargetUid:${targetUid}`, timestamp, flagId)); // by target uid } if (targetCid) { - batched.push(db.sortedSetAdd('flags:byCid:' + targetCid, timestamp, flagId)); // by target cid + batched.push(db.sortedSetAdd(`flags:byCid:${targetCid}`, timestamp, flagId)); // by target cid } if (type === 'post') { batched.push( - db.sortedSetAdd('flags:byPid:' + id, timestamp, flagId), // by target pid + db.sortedSetAdd(`flags:byPid:${id}`, timestamp, flagId), // by target pid posts.setPostField(id, 'flagId', flagId) ); @@ -554,7 +554,7 @@ Flags.getTargetCid = async function (type, id) { }; Flags.update = async function (flagId, uid, changeset) { - const current = await db.getObjectFields('flag:' + flagId, ['uid', 'state', 'assignee', 'type', 'targetId']); + const current = await db.getObjectFields(`flag:${flagId}`, ['uid', 'state', 'assignee', 'type', 'targetId']); if (!current.type) { return; } @@ -565,10 +565,10 @@ Flags.update = async function (flagId, uid, changeset) { } const notifObj = await notifications.create({ type: 'my-flags', - bodyShort: '[[notifications:flag_assigned_to_you, ' + flagId + ']]', + bodyShort: `[[notifications:flag_assigned_to_you, ${flagId}]]`, bodyLong: '', - path: '/flags/' + flagId, - nid: 'flags:assign:' + flagId + ':uid:' + assigneeId, + path: `/flags/${flagId}`, + nid: `flags:assign:${flagId}:uid:${assigneeId}`, from: uid, }); await notifications.push(notifObj, [assigneeId]); @@ -596,10 +596,10 @@ Flags.update = async function (flagId, uid, changeset) { if (!Flags._constants.states.includes(changeset[prop])) { delete changeset[prop]; } else { - tasks.push(db.sortedSetAdd('flags:byState:' + changeset[prop], now, flagId)); - tasks.push(db.sortedSetRemove('flags:byState:' + current[prop], flagId)); + tasks.push(db.sortedSetAdd(`flags:byState:${changeset[prop]}`, now, flagId)); + tasks.push(db.sortedSetRemove(`flags:byState:${current[prop]}`, flagId)); if (changeset[prop] === 'resolved' || changeset[prop] === 'rejected') { - tasks.push(notifications.rescind('flag:' + current.type + ':' + current.targetId)); + tasks.push(notifications.rescind(`flag:${current.type}:${current.targetId}`)); } } } else if (prop === 'assignee') { @@ -607,7 +607,7 @@ Flags.update = async function (flagId, uid, changeset) { if (!await isAssignable(parseInt(changeset[prop], 10))) { delete changeset[prop]; } else { - tasks.push(db.sortedSetAdd('flags:byAssignee:' + changeset[prop], now, flagId)); + tasks.push(db.sortedSetAdd(`flags:byAssignee:${changeset[prop]}`, now, flagId)); tasks.push(notifyAssignee(changeset[prop])); } } @@ -618,7 +618,7 @@ Flags.update = async function (flagId, uid, changeset) { return; } - tasks.push(db.setObject('flag:' + flagId, changeset)); + tasks.push(db.setObject(`flag:${flagId}`, changeset)); tasks.push(Flags.appendHistory(flagId, uid, changeset)); await Promise.all(tasks); @@ -634,7 +634,7 @@ Flags.resolveFlag = async function (type, id, uid) { Flags.resolveUserPostFlags = async function (uid, callerUid) { if (meta.config['flags:autoResolveOnBan']) { - await batch.processSortedSet('uid:' + uid + ':posts', async function (pids) { + await batch.processSortedSet(`uid:${uid}:posts`, async function (pids) { let postData = await posts.getPostsFields(pids, ['pid', 'flagId']); postData = postData.filter(p => p && p.flagId); for (const postObj of postData) { @@ -651,8 +651,8 @@ Flags.resolveUserPostFlags = async function (uid, callerUid) { Flags.getHistory = async function (flagId) { const uids = []; - let history = await db.getSortedSetRevRangeWithScores('flag:' + flagId + ':history', 0, -1); - const targetUid = await db.getObjectField('flag:' + flagId, 'targetUid'); + let history = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:history`, 0, -1); + const targetUid = await db.getObjectField(`flag:${flagId}`, 'targetUid'); history = history.map(function (entry) { entry.value = JSON.parse(entry.value); @@ -662,7 +662,7 @@ Flags.getHistory = async function (flagId) { // Deserialise changeset const changeset = entry.value[1]; if (changeset.hasOwnProperty('state')) { - changeset.state = changeset.state === undefined ? '' : '[[flags:state-' + changeset.state + ']]'; + changeset.state = changeset.state === undefined ? '' : `[[flags:state-${changeset.state}]]`; } return { @@ -690,7 +690,7 @@ Flags.appendHistory = async function (flagId, uid, changeset) { const datetime = changeset.datetime || Date.now(); delete changeset.datetime; const payload = JSON.stringify([uid, changeset, datetime]); - await db.sortedSetAdd('flag:' + flagId + ':history', datetime, payload); + await db.sortedSetAdd(`flag:${flagId}:history`, datetime, payload); }; Flags.appendNote = async function (flagId, uid, note, datetime) { @@ -700,7 +700,7 @@ Flags.appendNote = async function (flagId, uid, note, datetime) { datetime = datetime || Date.now(); const payload = JSON.stringify([uid, note]); - await db.sortedSetAdd('flag:' + flagId + ':notes', datetime, payload); + await db.sortedSetAdd(`flag:${flagId}:notes`, datetime, payload); await Flags.appendHistory(flagId, uid, { notes: null, datetime: datetime, @@ -725,25 +725,25 @@ Flags.notify = async function (flagObj, uid) { notifObj = await notifications.create({ type: 'new-post-flag', - bodyShort: '[[notifications:user_flagged_post_in, ' + flagObj.reports[flagObj.reports.length - 1].reporter.username + ', ' + titleEscaped + ']]', + bodyShort: `[[notifications:user_flagged_post_in, ${flagObj.reports[flagObj.reports.length - 1].reporter.username}, ${titleEscaped}]]`, bodyLong: flagObj.description, pid: flagObj.targetId, - path: '/flags/' + flagObj.flagId, - nid: 'flag:post:' + flagObj.targetId, + path: `/flags/${flagObj.flagId}`, + nid: `flag:post:${flagObj.targetId}`, from: uid, - mergeId: 'notifications:user_flagged_post_in|' + flagObj.targetId, + mergeId: `notifications:user_flagged_post_in|${flagObj.targetId}`, topicTitle: title, }); uids = uids.concat(modUids[0]); } else if (flagObj.type === 'user') { notifObj = await notifications.create({ type: 'new-user-flag', - bodyShort: '[[notifications:user_flagged_user, ' + flagObj.reports[flagObj.reports.length - 1].reporter.username + ', ' + flagObj.target.username + ']]', + bodyShort: `[[notifications:user_flagged_user, ${flagObj.reports[flagObj.reports.length - 1].reporter.username}, ${flagObj.target.username}]]`, bodyLong: flagObj.description, - path: '/flags/' + flagObj.flagId, - nid: 'flag:user:' + flagObj.targetId, + path: `/flags/${flagObj.flagId}`, + nid: `flag:user:${flagObj.targetId}`, from: uid, - mergeId: 'notifications:user_flagged_user|' + flagObj.targetId, + mergeId: `notifications:user_flagged_user|${flagObj.targetId}`, }); } else { throw new Error('[[error:invalid-data]]'); @@ -757,7 +757,7 @@ Flags.notify = async function (flagObj, uid) { }; async function mergeBanHistory(history, targetUid, uids) { - let recentBans = await db.getSortedSetRevRange('uid:' + targetUid + ':bans:timestamp', 0, 19); + let recentBans = await db.getSortedSetRevRange(`uid:${targetUid}:bans:timestamp`, 0, 19); recentBans = await db.getObjects(recentBans); return history.concat(recentBans.reduce((memo, cur) => { @@ -785,8 +785,8 @@ async function mergeBanHistory(history, targetUid, uids) { } async function mergeUsernameEmailChanges(history, targetUid, uids) { - const usernameChanges = await user.getHistory('user:' + targetUid + ':usernames'); - const emailChanges = await user.getHistory('user:' + targetUid + ':emails'); + const usernameChanges = await user.getHistory(`user:${targetUid}:usernames`); + const emailChanges = await user.getHistory(`user:${targetUid}:emails`); return history.concat(usernameChanges.reduce((memo, changeObj) => { uids.push(targetUid); diff --git a/src/groups/cache.js b/src/groups/cache.js index 642b9466f6..0acea646d6 100644 --- a/src/groups/cache.js +++ b/src/groups/cache.js @@ -13,7 +13,7 @@ module.exports = function (Groups) { if (!Array.isArray(groupNames)) { groupNames = [groupNames]; } - const keys = groupNames.map(name => uid + ':' + name); + const keys = groupNames.map(name => `${uid}:${name}`); Groups.cache.del(keys); }; }; diff --git a/src/groups/cover.js b/src/groups/cover.js index b571043c11..6d40691f4f 100644 --- a/src/groups/cover.js +++ b/src/groups/cover.js @@ -31,7 +31,7 @@ module.exports = function (Groups) { tempPath = await image.writeImageDataToTempFile(data.imageData); } - const filename = 'groupCover-' + data.groupName + path.extname(tempPath); + const filename = `groupCover-${data.groupName}${path.extname(tempPath)}`; const uploadData = await image.uploadImage(filename, 'files', { path: tempPath, uid: uid, @@ -44,7 +44,7 @@ module.exports = function (Groups) { path: tempPath, width: 358, }); - const thumbUploadData = await image.uploadImage('groupCoverThumb-' + data.groupName + path.extname(tempPath), 'files', { + const thumbUploadData = await image.uploadImage(`groupCoverThumb-${data.groupName}${path.extname(tempPath)}`, 'files', { path: tempPath, uid: uid, name: 'groupCover', @@ -62,6 +62,6 @@ module.exports = function (Groups) { }; Groups.removeCover = async function (data) { - await db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position']); + await db.deleteObjectFields(`group:${data.groupName}`, ['cover:url', 'cover:thumb:url', 'cover:position']); }; }; diff --git a/src/groups/create.js b/src/groups/create.js index 9bd56ebc1b..74ef56a41f 100644 --- a/src/groups/create.js +++ b/src/groups/create.js @@ -43,18 +43,18 @@ module.exports = function (Groups) { await plugins.hooks.fire('filter:group.create', { group: groupData, data: data }); await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name); - await db.setObject('group:' + groupData.name, groupData); + await db.setObject(`group:${groupData.name}`, groupData); if (data.hasOwnProperty('ownerUid')) { - await db.setAdd('group:' + groupData.name + ':owners', data.ownerUid); - await db.sortedSetAdd('group:' + groupData.name + ':members', timestamp, data.ownerUid); + await db.setAdd(`group:${groupData.name}:owners`, data.ownerUid); + await db.sortedSetAdd(`group:${groupData.name}:members`, timestamp, data.ownerUid); } if (!isHidden && !isSystem) { await db.sortedSetAddBulk([ ['groups:visible:createtime', timestamp, groupData.name], ['groups:visible:memberCount', groupData.memberCount, groupData.name], - ['groups:visible:name', 0, groupData.name.toLowerCase() + ':' + groupData.name], + ['groups:visible:name', 0, `${groupData.name.toLowerCase()}:${groupData.name}`], ]); } diff --git a/src/groups/data.js b/src/groups/data.js index ea77eea7e1..d4eaa8fafc 100644 --- a/src/groups/data.js +++ b/src/groups/data.js @@ -26,7 +26,7 @@ module.exports = function (Groups) { return memo; }, []); - const keys = groupNames.map(groupName => 'group:' + groupName); + const keys = groupNames.map(groupName => `group:${groupName}`); const groupData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); if (ephemeralIdx.length) { ephemeralIdx.forEach(function (idx) { @@ -60,7 +60,7 @@ module.exports = function (Groups) { }; Groups.setGroupField = async function (groupName, field, value) { - await db.setObjectField('group:' + groupName, field, value); + await db.setObjectField(`group:${groupName}`, field, value); plugins.hooks.fire('action:group.set', { field: field, value: value, type: 'set' }); }; }; diff --git a/src/groups/delete.js b/src/groups/delete.js index 24a5cc8694..b49f63a45a 100644 --- a/src/groups/delete.js +++ b/src/groups/delete.js @@ -18,15 +18,15 @@ module.exports = function (Groups) { } const keys = []; groupNames.forEach(function (groupName) { - keys.push('group:' + groupName, - 'group:' + groupName + ':members', - 'group:' + groupName + ':pending', - 'group:' + groupName + ':invited', - 'group:' + groupName + ':owners', - 'group:' + groupName + ':member:pids' + keys.push(`group:${groupName}`, + `group:${groupName}:members`, + `group:${groupName}:pending`, + `group:${groupName}:invited`, + `group:${groupName}:owners`, + `group:${groupName}:member:pids` ); }); - const sets = groupNames.map(groupName => groupName.toLowerCase() + ':' + groupName); + const sets = groupNames.map(groupName => `${groupName.toLowerCase()}:${groupName}`); const fields = groupNames.map(groupName => slugify(groupName)); await Promise.all([ @@ -47,7 +47,7 @@ module.exports = function (Groups) { async function removeGroupsFromPrivilegeGroups(groupNames) { await batch.processSortedSet('groups:createtime', async function (otherGroups) { const privilegeGroups = otherGroups.filter(group => Groups.isPrivilegeGroup(group)); - const keys = privilegeGroups.map(group => 'group:' + group + ':members'); + const keys = privilegeGroups.map(group => `group:${group}:members`); await db.sortedSetRemove(keys, groupNames); }, { batch: 500, diff --git a/src/groups/index.js b/src/groups/index.js index 36d8f8ff65..d9ed8fb93c 100644 --- a/src/groups/index.js +++ b/src/groups/index.js @@ -123,8 +123,8 @@ Groups.get = async function (groupName, options) { const [groupData, members, pending, invited, isMember, isPending, isInvited, isOwner] = await Promise.all([ Groups.getGroupData(groupName), Groups.getOwnersAndMembers(groupName, options.uid, 0, stop), - Groups.getUsersFromSet('group:' + groupName + ':pending', ['username', 'userslug', 'picture']), - Groups.getUsersFromSet('group:' + groupName + ':invited', ['username', 'userslug', 'picture']), + Groups.getUsersFromSet(`group:${groupName}:pending`, ['username', 'userslug', 'picture']), + Groups.getUsersFromSet(`group:${groupName}:invited`, ['username', 'userslug', 'picture']), Groups.isMember(options.uid, groupName), Groups.isPending(options.uid, groupName), Groups.isInvited(options.uid, groupName), @@ -149,11 +149,11 @@ Groups.get = async function (groupName, options) { }; Groups.getOwners = async function (groupName) { - return await db.getSetMembers('group:' + groupName + ':owners'); + return await db.getSetMembers(`group:${groupName}:owners`); }; Groups.getOwnersAndMembers = async function (groupName, uid, start, stop) { - const ownerUids = await db.getSetMembers('group:' + groupName + ':owners'); + const ownerUids = await db.getSetMembers(`group:${groupName}:owners`); const countToReturn = stop - start + 1; const ownerUidsOnPage = ownerUids.slice(start, stop !== -1 ? stop + 1 : undefined); const owners = await user.getUsers(ownerUidsOnPage, uid); @@ -170,7 +170,7 @@ Groups.getOwnersAndMembers = async function (groupName, uid, start, stop) { memberStart = Math.max(0, memberStart); memberStop = Math.max(0, memberStop); async function addMembers(start, stop) { - let batch = await user.getUsersFromSet('group:' + groupName + ':members', uid, start, stop); + let batch = await user.getUsersFromSet(`group:${groupName}:members`, uid, start, stop); if (!batch.length) { done = true; } @@ -220,7 +220,7 @@ Groups.isHidden = async function (groupName) { }; async function isFieldOn(groupName, field) { - const value = await db.getObjectField('group:' + groupName, field); + const value = await db.getObjectField(`group:${groupName}`, field); return parseInt(value, 10) === 1; } diff --git a/src/groups/invite.js b/src/groups/invite.js index ad17a36ecf..b08d6c0bcf 100644 --- a/src/groups/invite.js +++ b/src/groups/invite.js @@ -15,10 +15,10 @@ module.exports = function (Groups) { const [notification, owners] = await Promise.all([ notifications.create({ type: 'group-request-membership', - bodyShort: '[[groups:request.notification_title, ' + username + ']]', - bodyLong: '[[groups:request.notification_text, ' + username + ', ' + groupName + ']]', - nid: 'group:' + groupName + ':uid:' + uid + ':request', - path: '/groups/' + slugify(groupName), + bodyShort: `[[groups:request.notification_title, ${username}]]`, + bodyLong: `[[groups:request.notification_text, ${username}, ${groupName}]]`, + nid: `group:${groupName}:uid:${uid}:request`, + path: `/groups/${slugify(groupName)}`, from: uid, }), Groups.getOwners(groupName), @@ -28,14 +28,14 @@ module.exports = function (Groups) { }; Groups.acceptMembership = async function (groupName, uid) { - await db.setsRemove(['group:' + groupName + ':pending', 'group:' + groupName + ':invited'], uid); + await db.setsRemove([`group:${groupName}:pending`, `group:${groupName}:invited`], uid); await Groups.join(groupName, uid); const notification = await notifications.create({ type: 'group-invite', - bodyShort: '[[groups:membership.accept.notification_title, ' + groupName + ']]', - nid: 'group:' + groupName + ':uid:' + uid + ':invite-accepted', - path: '/groups/' + slugify(groupName), + bodyShort: `[[groups:membership.accept.notification_title, ${groupName}]]`, + nid: `group:${groupName}:uid:${uid}:invite-accepted`, + path: `/groups/${slugify(groupName)}`, }); await notifications.push(notification, [uid]); }; @@ -45,7 +45,7 @@ module.exports = function (Groups) { groupNames = [groupNames]; } const sets = []; - groupNames.forEach(groupName => sets.push('group:' + groupName + ':pending', 'group:' + groupName + ':invited')); + groupNames.forEach(groupName => sets.push(`group:${groupName}:pending`, `group:${groupName}:invited`)); await db.setsRemove(sets, uid); }; @@ -55,10 +55,10 @@ module.exports = function (Groups) { const notificationData = await Promise.all(uids.map(uid => notifications.create({ type: 'group-invite', - bodyShort: '[[groups:invited.notification_title, ' + groupName + ']]', + bodyShort: `[[groups:invited.notification_title, ${groupName}]]`, bodyLong: '', - nid: 'group:' + groupName + ':uid:' + uid + ':invite', - path: '/groups/' + slugify(groupName), + nid: `group:${groupName}:uid:${uid}:invite`, + path: `/groups/${slugify(groupName)}`, }))); await Promise.all(uids.map((uid, index) => notifications.push(notificationData[index], uid))); @@ -80,7 +80,7 @@ module.exports = function (Groups) { uids = uids.filter((uid, i) => !isMember[i] && ((type === 'invite' && !isInvited[i]) || (type === 'request' && !isPending[i]))); - const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending'; + const set = type === 'invite' ? `group:${groupName}:invited` : `group:${groupName}:pending`; await db.setAdd(set, uids); const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership'; plugins.hooks.fire(hookName, { @@ -91,11 +91,11 @@ module.exports = function (Groups) { } Groups.isInvited = async function (uids, groupName) { - return await checkInvitePending(uids, 'group:' + groupName + ':invited'); + return await checkInvitePending(uids, `group:${groupName}:invited`); }; Groups.isPending = async function (uids, groupName) { - return await checkInvitePending(uids, 'group:' + groupName + ':pending'); + return await checkInvitePending(uids, `group:${groupName}:pending`); }; async function checkInvitePending(uids, set) { @@ -111,6 +111,6 @@ module.exports = function (Groups) { if (!groupName) { return []; } - return await db.getSetMembers('group:' + groupName + ':pending'); + return await db.getSetMembers(`group:${groupName}:pending`); }; }; diff --git a/src/groups/join.js b/src/groups/join.js index 9107ce6146..383c4782c3 100644 --- a/src/groups/join.js +++ b/src/groups/join.js @@ -39,17 +39,17 @@ module.exports = function (Groups) { await createNonExistingGroups(groupsToCreate); const promises = [ - db.sortedSetsAdd(groupsToJoin.map(groupName => 'group:' + groupName + ':members'), Date.now(), uid), - db.incrObjectField(groupsToJoin.map(groupName => 'group:' + groupName), 'memberCount'), + db.sortedSetsAdd(groupsToJoin.map(groupName => `group:${groupName}:members`), Date.now(), uid), + db.incrObjectField(groupsToJoin.map(groupName => `group:${groupName}`), 'memberCount'), ]; if (isAdmin) { - promises.push(db.setsAdd(groupsToJoin.map(groupName => 'group:' + groupName + ':owners'), uid)); + promises.push(db.setsAdd(groupsToJoin.map(groupName => `group:${groupName}:owners`), uid)); } await Promise.all(promises); Groups.clearCache(uid, groupsToJoin); - cache.del(groupsToJoin.map(name => 'group:' + name + ':members')); + cache.del(groupsToJoin.map(name => `group:${name}:members`)); const groupData = await Groups.getGroupsFields(groupsToJoin, ['name', 'hidden', 'memberCount']); const visibleGroups = groupData.filter(groupData => groupData && !groupData.hidden); @@ -82,7 +82,7 @@ module.exports = function (Groups) { }); } catch (err) { if (err && err.message !== '[[error:group-already-exists]]') { - winston.error('[groups.join] Could not create new hidden group (' + groupName + ')\n' + err.stack); + winston.error(`[groups.join] Could not create new hidden group (${groupName})\n${err.stack}`); throw err; } } @@ -98,7 +98,7 @@ module.exports = function (Groups) { return; } - const currentTitle = await db.getObjectField('user:' + uid, 'groupTitle'); + const currentTitle = await db.getObjectField(`user:${uid}`, 'groupTitle'); if (currentTitle || currentTitle === '') { return; } diff --git a/src/groups/leave.js b/src/groups/leave.js index 32d27bbeca..8e529b8868 100644 --- a/src/groups/leave.js +++ b/src/groups/leave.js @@ -22,13 +22,13 @@ module.exports = function (Groups) { } await Promise.all([ - db.sortedSetRemove(groupsToLeave.map(groupName => 'group:' + groupName + ':members'), uid), - db.setRemove(groupsToLeave.map(groupName => 'group:' + groupName + ':owners'), uid), - db.decrObjectField(groupsToLeave.map(groupName => 'group:' + groupName), 'memberCount'), + db.sortedSetRemove(groupsToLeave.map(groupName => `group:${groupName}:members`), uid), + db.setRemove(groupsToLeave.map(groupName => `group:${groupName}:owners`), uid), + db.decrObjectField(groupsToLeave.map(groupName => `group:${groupName}`), 'memberCount'), ]); Groups.clearCache(uid, groupsToLeave); - cache.del(groupsToLeave.map(name => 'group:' + name + ':members')); + cache.del(groupsToLeave.map(name => `group:${name}:members`)); const groupData = await Groups.getGroupsFields(groupsToLeave, ['name', 'hidden', 'memberCount']); if (!groupData) { @@ -71,9 +71,9 @@ module.exports = function (Groups) { const newTitleArray = userData.groupTitleArray.filter(groupTitle => !groupNames.includes(groupTitle)); if (newTitleArray.length) { - await db.setObjectField('user:' + uid, 'groupTitle', JSON.stringify(newTitleArray)); + await db.setObjectField(`user:${uid}`, 'groupTitle', JSON.stringify(newTitleArray)); } else { - await db.deleteObjectField('user:' + uid, 'groupTitle'); + await db.deleteObjectField(`user:${uid}`, 'groupTitle'); } } @@ -88,7 +88,7 @@ module.exports = function (Groups) { Groups.kick = async function (uid, groupName, isOwner) { if (isOwner) { // If the owners set only contains one member, error out! - const numOwners = await db.setCount('group:' + groupName + ':owners'); + const numOwners = await db.setCount(`group:${groupName}:owners`); if (numOwners <= 1) { throw new Error('[[error:group-needs-owner]]'); } diff --git a/src/groups/membership.js b/src/groups/membership.js index 8d62e6a117..1ee2259521 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -8,7 +8,7 @@ const cache = require('../cache'); module.exports = function (Groups) { Groups.getMembers = async function (groupName, start, stop) { - return await db.getSortedSetRevRange('group:' + groupName + ':members', start, stop); + return await db.getSortedSetRevRange(`group:${groupName}:members`, start, stop); }; Groups.getMemberUsers = async function (groupNames, start, stop) { @@ -20,7 +20,7 @@ module.exports = function (Groups) { }; Groups.getMembersOfGroups = async function (groupNames) { - return await db.getSortedSetsMembers(groupNames.map(name => 'group:' + name + ':members')); + return await db.getSortedSetsMembers(groupNames.map(name => `group:${name}:members`)); }; Groups.isMember = async function (uid, groupName) { @@ -28,12 +28,12 @@ module.exports = function (Groups) { return false; } - const cacheKey = uid + ':' + groupName; + const cacheKey = `${uid}:${groupName}`; let isMember = Groups.cache.get(cacheKey); if (isMember !== undefined) { return isMember; } - isMember = await db.isSortedSetMember('group:' + groupName + ':members', uid); + isMember = await db.isSortedSetMember(`group:${groupName}:members`, uid); Groups.cache.set(cacheKey, isMember); return isMember; }; @@ -51,15 +51,15 @@ module.exports = function (Groups) { const nonCachedUids = uids.filter(uid => filterNonCached(cachedData, uid, groupName)); if (!nonCachedUids.length) { - return uids.map(uid => cachedData[uid + ':' + groupName]); + return uids.map(uid => cachedData[`${uid}:${groupName}`]); } - const isMembers = await db.isSortedSetMembers('group:' + groupName + ':members', nonCachedUids); + const isMembers = await db.isSortedSetMembers(`group:${groupName}:members`, nonCachedUids); nonCachedUids.forEach(function (uid, index) { - cachedData[uid + ':' + groupName] = isMembers[index]; - Groups.cache.set(uid + ':' + groupName, isMembers[index]); + cachedData[`${uid}:${groupName}`] = isMembers[index]; + Groups.cache.set(`${uid}:${groupName}`, isMembers[index]); }); - return uids.map(uid => cachedData[uid + ':' + groupName]); + return uids.map(uid => cachedData[`${uid}:${groupName}`]); }; Groups.isMemberOfGroups = async function (uid, groups) { @@ -70,23 +70,23 @@ module.exports = function (Groups) { const nonCachedGroups = groups.filter(groupName => filterNonCached(cachedData, uid, groupName)); if (!nonCachedGroups.length) { - return groups.map(groupName => cachedData[uid + ':' + groupName]); + return groups.map(groupName => cachedData[`${uid}:${groupName}`]); } - const nonCachedGroupsMemberSets = nonCachedGroups.map(groupName => 'group:' + groupName + ':members'); + const nonCachedGroupsMemberSets = nonCachedGroups.map(groupName => `group:${groupName}:members`); const isMembers = await db.isMemberOfSortedSets(nonCachedGroupsMemberSets, uid); nonCachedGroups.forEach(function (groupName, index) { - cachedData[uid + ':' + groupName] = isMembers[index]; - Groups.cache.set(uid + ':' + groupName, isMembers[index]); + cachedData[`${uid}:${groupName}`] = isMembers[index]; + Groups.cache.set(`${uid}:${groupName}`, isMembers[index]); }); - return groups.map(groupName => cachedData[uid + ':' + groupName]); + return groups.map(groupName => cachedData[`${uid}:${groupName}`]); }; function filterNonCached(cachedData, uid, groupName) { - const isMember = Groups.cache.get(uid + ':' + groupName); + const isMember = Groups.cache.get(`${uid}:${groupName}`); const isInCache = isMember !== undefined; if (isInCache) { - cachedData[uid + ':' + groupName] = isMember; + cachedData[`${uid}:${groupName}`] = isMember; } return !isInCache; } @@ -100,7 +100,7 @@ module.exports = function (Groups) { }; Groups.getMemberCount = async function (groupName) { - const count = await db.getObjectField('group:' + groupName, 'memberCount'); + const count = await db.getObjectField(`group:${groupName}`, 'memberCount'); return parseInt(count, 10); }; @@ -155,7 +155,7 @@ module.exports = function (Groups) { const cachedData = {}; const nonCachedKeys = keys.filter(function (groupName) { - const groupMembers = cache.get('group:' + groupName + ':members'); + const groupMembers = cache.get(`group:${groupName}:members`); const isInCache = groupMembers !== undefined; if (isInCache) { cachedData[groupName] = groupMembers; @@ -166,11 +166,11 @@ module.exports = function (Groups) { if (!nonCachedKeys.length) { return isArray ? keys.map(groupName => cachedData[groupName]) : cachedData[keys[0]]; } - const groupMembers = await db.getSortedSetsMembers(nonCachedKeys.map(name => 'group:' + name + ':members')); + const groupMembers = await db.getSortedSetsMembers(nonCachedKeys.map(name => `group:${name}:members`)); nonCachedKeys.forEach(function (groupName, index) { cachedData[groupName] = groupMembers[index]; - cache.set('group:' + groupName + ':members', groupMembers[index]); + cache.set(`group:${groupName}:members`, groupMembers[index]); }); return isArray ? keys.map(groupName => cachedData[groupName]) : cachedData[keys[0]]; } diff --git a/src/groups/ownership.js b/src/groups/ownership.js index 9f0ce9a08f..ade58e65c9 100644 --- a/src/groups/ownership.js +++ b/src/groups/ownership.js @@ -10,7 +10,7 @@ module.exports = function (Groups) { if (!(parseInt(uid, 10) > 0)) { return false; } - return await db.isSetMember('group:' + groupName + ':owners', uid); + return await db.isSetMember(`group:${groupName}:owners`, uid); }; Groups.ownership.isOwners = async function (uids, groupName) { @@ -18,22 +18,22 @@ module.exports = function (Groups) { return []; } - return await db.isSetMembers('group:' + groupName + ':owners', uids); + return await db.isSetMembers(`group:${groupName}:owners`, uids); }; Groups.ownership.grant = async function (toUid, groupName) { - await db.setAdd('group:' + groupName + ':owners', toUid); + await db.setAdd(`group:${groupName}:owners`, toUid); plugins.hooks.fire('action:group.grantOwnership', { uid: toUid, groupName: groupName }); }; Groups.ownership.rescind = async function (toUid, groupName) { // If the owners set only contains one member (and toUid is that member), error out! - const numOwners = await db.setCount('group:' + groupName + ':owners'); + const numOwners = await db.setCount(`group:${groupName}:owners`); const isOwner = await db.isSortedSetMember(`group:${groupName}:owners`); if (numOwners <= 1 && isOwner) { throw new Error('[[error:group-needs-owner]]'); } - await db.setRemove('group:' + groupName + ':owners', toUid); + await db.setRemove(`group:${groupName}:owners`, toUid); plugins.hooks.fire('action:group.rescindOwnership', { uid: toUid, groupName: groupName }); }; }; diff --git a/src/groups/posts.js b/src/groups/posts.js index f07b20deaa..ed97f9635a 100644 --- a/src/groups/posts.js +++ b/src/groups/posts.js @@ -20,23 +20,23 @@ module.exports = function (Groups) { (groupName, idx) => !groupData[idx].memberPostCidsArray.length || groupData[idx].memberPostCidsArray.includes(postData.cid) ); - const keys = groupNames.map(groupName => 'group:' + groupName + ':member:pids'); + const keys = groupNames.map(groupName => `group:${groupName}:member:pids`); await db.sortedSetsAdd(keys, postData.timestamp, postData.pid); await Promise.all(groupNames.map(name => truncateMemberPosts(name))); }; async function truncateMemberPosts(groupName) { - let lastPid = await db.getSortedSetRevRange('group:' + groupName + ':member:pids', 10, 10); + let lastPid = await db.getSortedSetRevRange(`group:${groupName}:member:pids`, 10, 10); lastPid = lastPid[0]; if (!parseInt(lastPid, 10)) { return; } - const score = await db.sortedSetScore('group:' + groupName + ':member:pids', lastPid); - await db.sortedSetsRemoveRangeByScore(['group:' + groupName + ':member:pids'], '-inf', score); + const score = await db.sortedSetScore(`group:${groupName}:member:pids`, lastPid); + await db.sortedSetsRemoveRangeByScore([`group:${groupName}:member:pids`], '-inf', score); } Groups.getLatestMemberPosts = async function (groupName, max, uid) { - let pids = await db.getSortedSetRevRange('group:' + groupName + ':member:pids', 0, max - 1); + let pids = await db.getSortedSetRevRange(`group:${groupName}:member:pids`, 0, max - 1); pids = await privileges.posts.filter('topics:read', pids, uid); return await posts.getPostSummaryByPids(pids, uid, { stripTags: false }); }; diff --git a/src/groups/update.js b/src/groups/update.js index 88c30c8515..fc5cf08ca0 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -14,7 +14,7 @@ const cache = require('../cache'); module.exports = function (Groups) { Groups.update = async function (groupName, values) { - const exists = await db.exists('group:' + groupName); + const exists = await db.exists(`group:${groupName}`); if (!exists) { throw new Error('[[error:no-group]]'); } @@ -81,7 +81,7 @@ module.exports = function (Groups) { payload.memberPostCids = cidsArray.filter(cid => validCids.includes(cid)).join(',') || ''; } - await db.setObject('group:' + groupName, payload); + await db.setObject(`group:${groupName}`, payload); await Groups.renameGroup(groupName, values.name); plugins.hooks.fire('action:group.update', { @@ -95,15 +95,15 @@ module.exports = function (Groups) { await db.sortedSetRemoveBulk([ ['groups:visible:createtime', groupName], ['groups:visible:memberCount', groupName], - ['groups:visible:name', groupName.toLowerCase() + ':' + groupName], + ['groups:visible:name', `${groupName.toLowerCase()}:${groupName}`], ]); return; } - const groupData = await db.getObjectFields('group:' + groupName, ['createtime', 'memberCount']); + const groupData = await db.getObjectFields(`group:${groupName}`, ['createtime', 'memberCount']); await db.sortedSetAddBulk([ ['groups:visible:createtime', groupData.createtime, groupName], ['groups:visible:memberCount', groupData.memberCount, groupName], - ['groups:visible:name', 0, groupName.toLowerCase() + ':' + groupName], + ['groups:visible:name', 0, `${groupName.toLowerCase()}:${groupName}`], ]); } @@ -118,7 +118,7 @@ module.exports = function (Groups) { async function showHide(groupName, hidden) { hidden = hidden === 'hidden'; await Promise.all([ - db.setObjectField('group:' + groupName, 'hidden', hidden ? 1 : 0), + db.setObjectField(`group:${groupName}`, 'hidden', hidden ? 1 : 0), updateVisibility(groupName, hidden), ]); } @@ -129,18 +129,18 @@ module.exports = function (Groups) { if (!currentlyPrivate || currentlyPrivate === isPrivate) { return; } - const pendingUids = await db.getSetMembers('group:' + groupName + ':pending'); + const pendingUids = await db.getSetMembers(`group:${groupName}:pending`); if (!pendingUids.length) { return; } - winston.verbose('[groups.update] Group is now public, automatically adding ' + pendingUids.length + ' new members, who were pending prior.'); + winston.verbose(`[groups.update] Group is now public, automatically adding ${pendingUids.length} new members, who were pending prior.`); for (const uid of pendingUids) { /* eslint-disable no-await-in-loop */ await Groups.join(groupName, uid); } - await db.delete('group:' + groupName + ':pending'); + await db.delete(`group:${groupName}:pending`); } async function checkNameChange(currentName, newName) { @@ -175,7 +175,7 @@ module.exports = function (Groups) { if (oldName === newName || !newName || String(newName).length === 0) { return; } - const group = await db.getObject('group:' + oldName); + const group = await db.getObject(`group:${oldName}`); if (!group) { return; } @@ -189,24 +189,24 @@ module.exports = function (Groups) { await updateNavigationItems(oldName, newName); await updateWidgets(oldName, newName); await updateConfig(oldName, newName); - await db.setObject('group:' + oldName, { name: newName, slug: slugify(newName) }); + await db.setObject(`group:${oldName}`, { name: newName, slug: slugify(newName) }); await db.deleteObjectField('groupslug:groupname', group.slug); await db.setObjectField('groupslug:groupname', slugify(newName), newName); const allGroups = await db.getSortedSetRange('groups:createtime', 0, -1); - const keys = allGroups.map(group => 'group:' + group + ':members'); + const keys = allGroups.map(group => `group:${group}:members`); await renameGroupsMember(keys, oldName, newName); cache.del(keys); - await db.rename('group:' + oldName, 'group:' + newName); - await db.rename('group:' + oldName + ':members', 'group:' + newName + ':members'); - await db.rename('group:' + oldName + ':owners', 'group:' + newName + ':owners'); - await db.rename('group:' + oldName + ':pending', 'group:' + newName + ':pending'); - await db.rename('group:' + oldName + ':invited', 'group:' + newName + ':invited'); - await db.rename('group:' + oldName + ':member:pids', 'group:' + newName + ':member:pids'); + await db.rename(`group:${oldName}`, `group:${newName}`); + await db.rename(`group:${oldName}:members`, `group:${newName}:members`); + await db.rename(`group:${oldName}:owners`, `group:${newName}:owners`); + await db.rename(`group:${oldName}:pending`, `group:${newName}:pending`); + await db.rename(`group:${oldName}:invited`, `group:${newName}:invited`); + await db.rename(`group:${oldName}:member:pids`, `group:${newName}:member:pids`); await renameGroupsMember(['groups:createtime', 'groups:visible:createtime', 'groups:visible:memberCount'], oldName, newName); - await renameGroupsMember(['groups:visible:name'], oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName); + await renameGroupsMember(['groups:visible:name'], `${oldName.toLowerCase()}:${oldName}`, `${newName.toLowerCase()}:${newName}`); plugins.hooks.fire('action:group.rename', { old: oldName, @@ -216,7 +216,7 @@ module.exports = function (Groups) { }; async function updateMemberGroupTitles(oldName, newName) { - await batch.processSortedSet('group:' + oldName + ':members', async function (uids) { + await batch.processSortedSet(`group:${oldName}:members`, async function (uids) { let usersData = await user.getUsersData(uids); usersData = usersData.filter(userData => userData && userData.groupTitleArray.includes(oldName)); diff --git a/src/image.js b/src/image.js index bafae61f83..998bd8dd92 100644 --- a/src/image.js +++ b/src/image.js @@ -67,9 +67,9 @@ image.normalise = async function (path) { }); } else { const sharp = requireSharp(); - await sharp(path, { failOnError: true }).png().toFile(path + '.png'); + await sharp(path, { failOnError: true }).png().toFile(`${path}.png`); } - return path + '.png'; + return `${path}.png`; }; image.size = async function (path) { diff --git a/src/install.js b/src/install.js index bf719a6936..969d32c4c4 100644 --- a/src/install.js +++ b/src/install.js @@ -171,7 +171,7 @@ async function completeConfigSetup(config) { // Sanity-check/fix url/port if (!/^http(?:s)?:\/\//.test(config.url)) { - config.url = 'http://' + config.url; + config.url = `http://${config.url}`; } var urlObj = url.parse(config.url); if (urlObj.port) { @@ -215,7 +215,7 @@ async function enableDefaultTheme() { } const defaultTheme = nconf.get('defaultTheme') || 'nodebb-theme-persona'; - console.log('Enabling default theme: ' + defaultTheme); + console.log(`Enabling default theme: ${defaultTheme}`); await meta.themes.set({ type: 'local', id: defaultTheme, @@ -277,7 +277,7 @@ async function createAdmin() { try { User.isPasswordValid(results.password); } catch (err) { - winston.warn('Password error, please try again. ' + err.message); + winston.warn(`Password error, please try again. ${err.message}`); return await retryPassword(results); } @@ -366,7 +366,7 @@ async function createCategories() { const db = require('./database'); const cids = await db.getSortedSetRange('categories:cid', 0, -1); if (Array.isArray(cids) && cids.length) { - console.log('Categories OK. Found ' + cids.length + ' categories.'); + console.log(`Categories OK. Found ${cids.length} categories.`); return; } @@ -496,7 +496,7 @@ install.setup = async function () { return data; } catch (err) { if (err) { - winston.warn('NodeBB Setup Aborted.\n ' + err.stack); + winston.warn(`NodeBB Setup Aborted.\n ${err.stack}`); process.exit(1); } } diff --git a/src/languages.js b/src/languages.js index 5067f6b4a9..ab471aea01 100644 --- a/src/languages.js +++ b/src/languages.js @@ -12,7 +12,7 @@ const files = fs.readdirSync(path.join(paths.nodeModules, '/timeago/locales')); Languages.timeagoCodes = files.filter(f => f.startsWith('jquery.timeago')).map(f => f.split('.')[2]); Languages.get = async function (language, namespace) { - const data = await fs.promises.readFile(path.join(languagesPath, language, namespace + '.json'), 'utf8'); + const data = await fs.promises.readFile(path.join(languagesPath, language, `${namespace}.json`), 'utf8'); return JSON.parse(data) || {}; }; diff --git a/src/logger.js b/src/logger.js index e7eddb305f..6a1d549cb7 100644 --- a/src/logger.js +++ b/src/logger.js @@ -143,7 +143,7 @@ Logger.prepare_io_string = function (_type, _uid, _args) { * The format is: io: */ try { - return 'io: ' + _uid + ' ' + _type + ' ' + util.inspect(Array.prototype.slice.call(_args), { depth: 3 }) + '\n'; + return `io: ${_uid} ${_type} ${util.inspect(Array.prototype.slice.call(_args), { depth: 3 })}\n`; } catch (err) { winston.info('Logger.prepare_io_string: Failed', err); return 'error'; diff --git a/src/messaging/create.js b/src/messaging/create.js index 9c5c453eb7..bd12a4c227 100644 --- a/src/messaging/create.js +++ b/src/messaging/create.js @@ -29,7 +29,7 @@ module.exports = function (Messaging) { throw new Error('[[error:invalid-chat-message]]'); } if (length > maximumChatMessageLength) { - throw new Error('[[error:chat-message-too-long, ' + maximumChatMessageLength + ']]'); + throw new Error(`[[error:chat-message-too-long, ${maximumChatMessageLength}]]`); } }; @@ -50,9 +50,9 @@ module.exports = function (Messaging) { } message = await plugins.hooks.fire('filter:messaging.save', message); - await db.setObject('message:' + mid, message); + await db.setObject(`message:${mid}`, message); const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp); - let uids = await db.getSortedSetRange('chat:room:' + data.roomId + ':uids', 0, -1); + let uids = await db.getSortedSetRange(`chat:room:${data.roomId}:uids`, 0, -1); uids = await user.blocks.filterUids(data.uid, uids); await Promise.all([ @@ -88,7 +88,7 @@ module.exports = function (Messaging) { return; } - const keys = uids.map(uid => 'uid:' + uid + ':chat:rooms'); + const keys = uids.map(uid => `uid:${uid}:chat:rooms`); await db.sortedSetsAdd(keys, timestamp, roomId); }; @@ -96,7 +96,7 @@ module.exports = function (Messaging) { if (!uids.length) { return; } - const keys = uids.map(uid => 'uid:' + uid + ':chat:room:' + roomId + ':mids'); + const keys = uids.map(uid => `uid:${uid}:chat:room:${roomId}:mids`); await db.sortedSetsAdd(keys, timestamp, mid); }; }; diff --git a/src/messaging/data.js b/src/messaging/data.js index 2098986ad5..b6efc27518 100644 --- a/src/messaging/data.js +++ b/src/messaging/data.js @@ -17,7 +17,7 @@ module.exports = function (Messaging) { return []; } - const keys = mids.map(mid => 'message:' + mid); + const keys = mids.map(mid => `message:${mid}`); const messages = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); return await Promise.all(messages.map(async (message, idx) => modifyMessage(message, fields, parseInt(mids[idx], 10)))); @@ -34,11 +34,11 @@ module.exports = function (Messaging) { }; Messaging.setMessageField = async (mid, field, content) => { - await db.setObjectField('message:' + mid, field, content); + await db.setObjectField(`message:${mid}`, field, content); }; Messaging.setMessageFields = async (mid, data) => { - await db.setObject('message:' + mid, data); + await db.setObject(`message:${mid}`, data); }; Messaging.getMessagesData = async (mids, uid, roomId, isNew) => { @@ -104,7 +104,7 @@ module.exports = function (Messaging) { }); } else if (messages.length === 1) { // For single messages, we don't know the context, so look up the previous message and compare - var key = 'uid:' + uid + ':chat:room:' + roomId + ':mids'; + var key = `uid:${uid}:chat:room:${roomId}:mids`; const index = await db.sortedSetRank(key, messages[0].messageId); if (index > 0) { const mid = await db.getSortedSetRange(key, index - 1, index - 1); diff --git a/src/messaging/delete.js b/src/messaging/delete.js index a48550db26..e23e20175d 100644 --- a/src/messaging/delete.js +++ b/src/messaging/delete.js @@ -10,7 +10,7 @@ module.exports = function (Messaging) { const field = state ? 'deleted' : 'restored'; const { deleted, roomId } = await Messaging.getMessageFields(mid, ['deleted', 'roomId']); if (deleted === state) { - throw new Error('[[error:chat-' + field + '-already]]'); + throw new Error(`[[error:chat-${field}-already]]`); } await Messaging.setMessageField(mid, 'deleted', state); @@ -23,9 +23,9 @@ module.exports = function (Messaging) { uids.forEach(function (_uid) { if (parseInt(_uid, 10) !== parseInt(uid, 10)) { if (state === 1) { - sockets.in('uid_' + _uid).emit('event:chats.delete', mid); + sockets.in(`uid_${_uid}`).emit('event:chats.delete', mid); } else if (state === 0) { - sockets.in('uid_' + _uid).emit('event:chats.restore', messages[0]); + sockets.in(`uid_${_uid}`).emit('event:chats.restore', messages[0]); } } }); diff --git a/src/messaging/edit.js b/src/messaging/edit.js index 2ad14d2126..a5c43b769b 100644 --- a/src/messaging/edit.js +++ b/src/messaging/edit.js @@ -33,7 +33,7 @@ module.exports = function (Messaging) { ]); uids.forEach(function (uid) { - sockets.in('uid_' + uid).emit('event:chats.edit', { + sockets.in(`uid_${uid}`).emit('event:chats.edit', { messages: messages, }); }); @@ -72,14 +72,14 @@ module.exports = function (Messaging) { const chatConfigDuration = meta.config[durationConfig]; if (chatConfigDuration && Date.now() - messageData.timestamp > chatConfigDuration * 1000) { - throw new Error('[[error:chat-' + type + '-duration-expired, ' + meta.config[durationConfig] + ']]'); + throw new Error(`[[error:chat-${type}-duration-expired, ${meta.config[durationConfig]}]]`); } if (messageData.fromuid === parseInt(uid, 10) && !messageData.system) { return; } - throw new Error('[[error:cant-' + type + '-chat-message]]'); + throw new Error(`[[error:cant-${type}-chat-message]]`); }; Messaging.canEdit = async (messageId, uid) => await canEditDelete(messageId, uid, 'edit'); diff --git a/src/messaging/index.js b/src/messaging/index.js index fc02f7b217..8b0d0b57c1 100644 --- a/src/messaging/index.js +++ b/src/messaging/index.js @@ -32,7 +32,7 @@ Messaging.getMessages = async (params) => { return; } - const mids = await db.getSortedSetRevRange('uid:' + params.uid + ':chat:room:' + params.roomId + ':mids', start, stop); + const mids = await db.getSortedSetRevRange(`uid:${params.uid}:chat:room:${params.roomId}:mids`, start, stop); if (!mids.length) { return []; } @@ -80,7 +80,7 @@ Messaging.parse = async (message, fromuid, uid, roomId, isNew) => { }; Messaging.isNewSet = async (uid, roomId, timestamp) => { - const setKey = 'uid:' + uid + ':chat:room:' + roomId + ':mids'; + const setKey = `uid:${uid}:chat:room:${roomId}:mids`; const messages = await db.getSortedSetRevRangeWithScores(setKey, 0, 0); if (messages && messages.length) { return parseInt(timestamp, 10) > parseInt(messages[0].score, 10) + Messaging.newMessageCutoff; @@ -94,12 +94,12 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => { return null; } - const roomIds = await db.getSortedSetRevRange('uid:' + uid + ':chat:rooms', start, stop); + const roomIds = await db.getSortedSetRevRange(`uid:${uid}:chat:rooms`, start, stop); const results = await utils.promiseParallel({ roomData: Messaging.getRoomsData(roomIds), - unread: db.isSortedSetMembers('uid:' + uid + ':chat:rooms:unread', roomIds), + unread: db.isSortedSetMembers(`uid:${uid}:chat:rooms:unread`, roomIds), users: Promise.all(roomIds.map(async (roomId) => { - let uids = await db.getSortedSetRevRange('chat:room:' + roomId + ':uids', 0, 9); + let uids = await db.getSortedSetRevRange(`chat:room:${roomId}:uids`, 0, 9); uids = uids.filter(_uid => _uid && parseInt(_uid, 10) !== parseInt(uid, 10)); return await user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline']); })), @@ -172,7 +172,7 @@ Messaging.getLatestUndeletedMessage = async (uid, roomId) => { while (!done) { /* eslint-disable no-await-in-loop */ - mids = await db.getSortedSetRevRange('uid:' + uid + ':chat:room:' + roomId + ':mids', index, index); + mids = await db.getSortedSetRevRange(`uid:${uid}:chat:room:${roomId}:mids`, index, index); if (mids.length) { const states = await Messaging.getMessageFields(mids[0], ['deleted', 'system']); done = !states.deleted && !states.system; @@ -251,8 +251,8 @@ Messaging.hasPrivateChat = async (uid, withUid) => { } const results = await utils.promiseParallel({ - myRooms: db.getSortedSetRevRange('uid:' + uid + ':chat:rooms', 0, -1), - theirRooms: db.getSortedSetRevRange('uid:' + withUid + ':chat:rooms', 0, -1), + myRooms: db.getSortedSetRevRange(`uid:${uid}:chat:rooms`, 0, -1), + theirRooms: db.getSortedSetRevRange(`uid:${withUid}:chat:rooms`, 0, -1), }); const roomIds = results.myRooms.filter(function (roomId) { return roomId && results.theirRooms.includes(roomId); diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js index 63ccbc193e..2e6c6467c4 100644 --- a/src/messaging/notifications.js +++ b/src/messaging/notifications.js @@ -28,21 +28,21 @@ module.exports = function (Messaging) { uids.forEach(function (uid) { data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0; Messaging.pushUnreadCount(uid); - sockets.in('uid_' + uid).emit('event:chats.receive', data); + sockets.in(`uid_${uid}`).emit('event:chats.receive', data); }); if (messageObj.system) { return; } // Delayed notifications - let queueObj = Messaging.notifyQueue[fromUid + ':' + roomId]; + let queueObj = Messaging.notifyQueue[`${fromUid}:${roomId}`]; if (queueObj) { - queueObj.message.content += '\n' + messageObj.content; + queueObj.message.content += `\n${messageObj.content}`; clearTimeout(queueObj.timeout); } else { queueObj = { message: messageObj, }; - Messaging.notifyQueue[fromUid + ':' + roomId] = queueObj; + Messaging.notifyQueue[`${fromUid}:${roomId}`] = queueObj; } queueObj.timeout = setTimeout(function () { @@ -60,15 +60,15 @@ module.exports = function (Messaging) { const isGroupChat = await Messaging.isGroupChat(roomId); const notification = await notifications.create({ type: isGroupChat ? 'new-group-chat' : 'new-chat', - subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', - bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + subject: `[[email:notif.chat.subject, ${messageObj.fromUser.username}]]`, + bodyShort: `[[notifications:new_message_from, ${messageObj.fromUser.username}]]`, bodyLong: messageObj.content, - nid: 'chat_' + fromuid + '_' + roomId, + nid: `chat_${fromuid}_${roomId}`, from: fromuid, - path: '/chats/' + messageObj.roomId, + path: `/chats/${messageObj.roomId}`, }); - delete Messaging.notifyQueue[fromuid + ':' + roomId]; + delete Messaging.notifyQueue[`${fromuid}:${roomId}`]; notifications.push(notification, uids); } }; diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 2d511199ca..ed322ff4a4 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -10,7 +10,7 @@ var meta = require('../meta'); module.exports = function (Messaging) { Messaging.getRoomData = async (roomId) => { - const data = await db.getObject('chat:room:' + roomId); + const data = await db.getObject(`chat:room:${roomId}`); if (!data) { throw new Error('[[error:no-chat-room]]'); } @@ -20,7 +20,7 @@ module.exports = function (Messaging) { }; Messaging.getRoomsData = async (roomIds) => { - const roomData = await db.getObjects(roomIds.map(roomId => 'chat:room:' + roomId)); + const roomData = await db.getObjects(roomIds.map(roomId => `chat:room:${roomId}`)); modifyRoomData(roomData); return roomData; }; @@ -46,8 +46,8 @@ module.exports = function (Messaging) { }; await Promise.all([ - db.setObject('chat:room:' + roomId, room), - db.sortedSetAdd('chat:room:' + roomId + ':uids', now, uid), + db.setObject(`chat:room:${roomId}`, room), + db.sortedSetAdd(`chat:room:${roomId}:uids`, now, uid), ]); await Promise.all([ Messaging.addUsersToRoom(uid, toUids, roomId), @@ -60,17 +60,17 @@ module.exports = function (Messaging) { }; Messaging.isUserInRoom = async (uid, roomId) => { - const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid); + const inRoom = await db.isSortedSetMember(`chat:room:${roomId}:uids`, uid); const data = await plugins.hooks.fire('filter:messaging.isUserInRoom', { uid: uid, roomId: roomId, inRoom: inRoom }); return data.inRoom; }; - Messaging.roomExists = async roomId => db.exists('chat:room:' + roomId + ':uids'); + Messaging.roomExists = async roomId => db.exists(`chat:room:${roomId}:uids`); - Messaging.getUserCountInRoom = async roomId => db.sortedSetCard('chat:room:' + roomId + ':uids'); + Messaging.getUserCountInRoom = async roomId => db.sortedSetCard(`chat:room:${roomId}:uids`); Messaging.isRoomOwner = async (uid, roomId) => { - const owner = await db.getObjectField('chat:room:' + roomId, 'owner'); + const owner = await db.getObjectField(`chat:room:${roomId}`, 'owner'); return parseInt(uid, 10) === parseInt(owner, 10); }; @@ -82,7 +82,7 @@ module.exports = function (Messaging) { throw new Error('[[error:cant-add-users-to-chat-room]]'); } - await db.sortedSetAdd('chat:room:' + roomId + ':uids', timestamps, uids); + await db.sortedSetAdd(`chat:room:${roomId}:uids`, timestamps, uids); await updateGroupChatField([roomId]); await Promise.all(uids.map(uid => Messaging.addSystemMessage('user-join', uid, roomId))); }; @@ -108,12 +108,12 @@ module.exports = function (Messaging) { }; async function updateGroupChatField(roomIds) { - const userCounts = await db.sortedSetsCard(roomIds.map(roomId => 'chat:room:' + roomId + ':uids')); + const userCounts = await db.sortedSetsCard(roomIds.map(roomId => `chat:room:${roomId}:uids`)); const groupChats = roomIds.filter((roomId, index) => userCounts[index] > 2); const privateChats = roomIds.filter((roomId, index) => userCounts[index] <= 2); await Promise.all([ - db.setObjectField(groupChats.map(id => 'chat:room:' + id, 'groupChat', 1)), - db.setObjectField(privateChats.map(id => 'chat:room:' + id, 'groupChat', 0)), + db.setObjectField(groupChats.map(id => `chat:room:${id}`, 'groupChat', 1)), + db.setObjectField(privateChats.map(id => `chat:room:${id}`, 'groupChat', 0)), ]); } @@ -122,11 +122,11 @@ module.exports = function (Messaging) { uids = uids.filter((uid, index) => isInRoom[index]); const keys = uids - .map(uid => 'uid:' + uid + ':chat:rooms') - .concat(uids.map(uid => 'uid:' + uid + ':chat:rooms:unread')); + .map(uid => `uid:${uid}:chat:rooms`) + .concat(uids.map(uid => `uid:${uid}:chat:rooms:unread`)); await Promise.all([ - db.sortedSetRemove('chat:room:' + roomId + ':uids', uids), + db.sortedSetRemove(`chat:room:${roomId}:uids`, uids), db.sortedSetsRemove(keys, roomId), ]); @@ -139,12 +139,12 @@ module.exports = function (Messaging) { const isInRoom = await Promise.all(roomIds.map(roomId => Messaging.isUserInRoom(uid, roomId))); roomIds = roomIds.filter((roomId, index) => isInRoom[index]); - const roomKeys = roomIds.map(roomId => 'chat:room:' + roomId + ':uids'); + const roomKeys = roomIds.map(roomId => `chat:room:${roomId}:uids`); await Promise.all([ db.sortedSetsRemove(roomKeys, uid), db.sortedSetRemove([ - 'uid:' + uid + ':chat:rooms', - 'uid:' + uid + ':chat:rooms:unread', + `uid:${uid}:chat:rooms`, + `uid:${uid}:chat:rooms:unread`, ], roomIds), ]); @@ -156,18 +156,18 @@ module.exports = function (Messaging) { }; async function updateOwner(roomId) { - const uids = await db.getSortedSetRange('chat:room:' + roomId + ':uids', 0, 0); + const uids = await db.getSortedSetRange(`chat:room:${roomId}:uids`, 0, 0); const newOwner = uids[0] || 0; - await db.setObjectField('chat:room:' + roomId, 'owner', newOwner); + await db.setObjectField(`chat:room:${roomId}`, 'owner', newOwner); } - Messaging.getUidsInRoom = async (roomId, start, stop) => db.getSortedSetRevRange('chat:room:' + roomId + ':uids', start, stop); + Messaging.getUidsInRoom = async (roomId, start, stop) => db.getSortedSetRevRange(`chat:room:${roomId}:uids`, start, stop); Messaging.getUsersInRoom = async (roomId, start, stop) => { const uids = await Messaging.getUidsInRoom(roomId, start, stop); const [users, ownerId] = await Promise.all([ user.getUsersFields(uids, ['uid', 'username', 'picture', 'status']), - db.getObjectField('chat:room:' + roomId, 'owner'), + db.getObjectField(`chat:room:${roomId}`, 'owner'), ]); return users.map(function (user) { @@ -195,8 +195,8 @@ module.exports = function (Messaging) { throw new Error('[[error:no-privileges]]'); } - await db.setObjectField('chat:room:' + payload.roomId, 'roomName', payload.newName); - await Messaging.addSystemMessage('room-rename, ' + payload.newName.replace(',', ','), payload.uid, payload.roomId); + await db.setObjectField(`chat:room:${payload.roomId}`, 'roomName', payload.newName); + await Messaging.addSystemMessage(`room-rename, ${payload.newName.replace(',', ',')}`, payload.uid, payload.roomId); plugins.hooks.fire('action:chat.renameRoom', { roomId: payload.roomId, @@ -205,7 +205,7 @@ module.exports = function (Messaging) { }; Messaging.canReply = async (roomId, uid) => { - const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid); + const inRoom = await db.isSortedSetMember(`chat:room:${roomId}:uids`, uid); const data = await plugins.hooks.fire('filter:messaging.canReply', { uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom }); return data.canReply; }; diff --git a/src/messaging/unread.js b/src/messaging/unread.js index c49fe7a729..f1a3a5c1ff 100644 --- a/src/messaging/unread.js +++ b/src/messaging/unread.js @@ -9,7 +9,7 @@ module.exports = function (Messaging) { return 0; } - return await db.sortedSetCard('uid:' + uid + ':chat:rooms:unread'); + return await db.sortedSetCard(`uid:${uid}:chat:rooms:unread`); }; Messaging.pushUnreadCount = async (uid) => { @@ -17,15 +17,15 @@ module.exports = function (Messaging) { return; } const unreadCount = await Messaging.getUnreadCount(uid); - sockets.in('uid_' + uid).emit('event:unread.updateChatCount', unreadCount); + sockets.in(`uid_${uid}`).emit('event:unread.updateChatCount', unreadCount); }; Messaging.markRead = async (uid, roomId) => { - await db.sortedSetRemove('uid:' + uid + ':chat:rooms:unread', roomId); + await db.sortedSetRemove(`uid:${uid}:chat:rooms:unread`, roomId); }; Messaging.markAllRead = async (uid) => { - await db.delete('uid:' + uid + ':chat:rooms:unread'); + await db.delete(`uid:${uid}:chat:rooms:unread`); }; Messaging.markUnread = async (uids, roomId) => { @@ -33,7 +33,7 @@ module.exports = function (Messaging) { if (!exists) { throw new Error('[[error:chat-room-does-not-exist]]'); } - const keys = uids.map(uid => 'uid:' + uid + ':chat:rooms:unread'); + const keys = uids.map(uid => `uid:${uid}:chat:rooms:unread`); return await db.sortedSetsAdd(keys, Date.now(), roomId); }; }; diff --git a/src/meta/aliases.js b/src/meta/aliases.js index d35df972f1..a8be48da3c 100644 --- a/src/meta/aliases.js +++ b/src/meta/aliases.js @@ -31,13 +31,13 @@ function buildTargets() { return [name, arr.join(', ')]; }).map(function (tuple) { - return ' ' + _.padEnd('"' + tuple[0] + '"', length + 2).magenta + ' | ' + tuple[1]; + return ` ${_.padEnd(`"${tuple[0]}"`, length + 2).magenta} | ${tuple[1]}`; }).join('\n'); console.log( - '\n\n Build targets:\n' + - ('\n ' + _.padEnd('Target', length + 2) + ' | Aliases').green + - '\n ------------------------------------------------------\n'.blue + - output + '\n' + `\n\n Build targets:\n${ + (`\n ${_.padEnd('Target', length + 2)} | Aliases`).green + }${'\n ------------------------------------------------------\n'.blue + }${output}\n` ); } diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js index 7e2bd4d280..8fca8830d4 100644 --- a/src/meta/blacklist.js +++ b/src/meta/blacklist.js @@ -17,9 +17,9 @@ Blacklist.load = async function () { let rules = await Blacklist.get(); rules = Blacklist.validate(rules); - winston.verbose('[meta/blacklist] Loading ' + rules.valid.length + ' blacklist rule(s)' + (rules.duplicateCount > 0 ? ', ignored ' + rules.duplicateCount + ' duplicate(s)' : '')); + winston.verbose(`[meta/blacklist] Loading ${rules.valid.length} blacklist rule(s)${rules.duplicateCount > 0 ? `, ignored ${rules.duplicateCount} duplicate(s)` : ''}`); if (rules.invalid.length) { - winston.warn('[meta/blacklist] ' + rules.invalid.length + ' invalid blacklist rule(s) were ignored.'); + winston.warn(`[meta/blacklist] ${rules.invalid.length} invalid blacklist rule(s) were ignored.`); } Blacklist._rules = { @@ -57,7 +57,7 @@ Blacklist.test = async function (clientIp) { try { addr = ipaddr.parse(clientIp); } catch (err) { - winston.error('[meta/blacklist] Error parsing client IP : ' + clientIp); + winston.error(`[meta/blacklist] Error parsing client IP : ${clientIp}`); throw err; } @@ -168,6 +168,6 @@ Blacklist.addRule = async function (rule) { throw new Error('[[error:invalid-rule]]'); } let rules = await Blacklist.get(); - rules = rules + '\n' + valid[0]; + rules = `${rules}\n${valid[0]}`; await Blacklist.save(rules); }; diff --git a/src/meta/build.js b/src/meta/build.js index 3bcb9911b6..2f0346afc2 100644 --- a/src/meta/build.js +++ b/src/meta/build.js @@ -70,7 +70,7 @@ async function beforeBuild(targets) { await plugins.prepareForBuild(targets); await mkdirp(path.join(__dirname, '../../build/public')); } catch (err) { - winston.error('[build] Encountered error preparing for build\n' + err.stack); + winston.error(`[build] Encountered error preparing for build\n${err.stack}`); throw err; } } @@ -85,27 +85,27 @@ async function buildTargets(targets, parallel) { if (parallel) { await Promise.all( targets.map( - target => step(target, parallel, _.padStart(target, length) + ' ') + target => step(target, parallel, `${_.padStart(target, length)} `) ) ); } else { for (const target of targets) { // eslint-disable-next-line no-await-in-loop - await step(target, parallel, _.padStart(target, length) + ' '); + await step(target, parallel, `${_.padStart(target, length)} `); } } } async function step(target, parallel, targetStr) { const startTime = Date.now(); - winston.info('[build] ' + targetStr + ' build started'); + winston.info(`[build] ${targetStr} build started`); try { await targetHandlers[target](parallel); const time = (Date.now() - startTime) / 1000; - winston.info('[build] ' + targetStr + ' build completed in ' + time + 'sec'); + winston.info(`[build] ${targetStr} build completed in ${time}sec`); } catch (err) { - winston.error('[build] ' + targetStr + ' build failed'); + winston.error(`[build] ${targetStr} build failed`); throw err; } } @@ -127,7 +127,7 @@ exports.build = async function (targets, options) { winston.verbose('[build] Querying CPU core count for build strategy'); const cpus = os.cpus(); series = cpus.length < 4; - winston.verbose('[build] System returned ' + cpus.length + ' cores, opting for ' + (series ? 'series' : 'parallel') + ' build strategy'); + winston.verbose(`[build] System returned ${cpus.length} cores, opting for ${series ? 'series' : 'parallel'} build strategy`); } targets = targets @@ -135,7 +135,7 @@ exports.build = async function (targets, options) { .map(function (target) { target = target.toLowerCase().replace(/-/g, ''); if (!aliasMap[target]) { - winston.warn('[build] Unknown target: ' + target); + winston.warn(`[build] Unknown target: ${target}`); if (target.includes(',')) { winston.warn('[build] Are you specifying multiple targets? Separate them with spaces:'); winston.warn('[build] e.g. `./nodebb build adminjs tpl`'); @@ -156,7 +156,7 @@ exports.build = async function (targets, options) { target ))); - winston.verbose('[build] building the following targets: ' + targets.join(', ')); + winston.verbose(`[build] building the following targets: ${targets.join(', ')}`); if (!targets) { winston.info('[build] No valid targets supplied. Aborting.'); @@ -180,9 +180,9 @@ exports.build = async function (targets, options) { await buildTargets(targets, !series); const totalTime = (Date.now() - startTime) / 1000; await cacheBuster.write(); - winston.info('[build] Asset compilation successful. Completed in ' + totalTime + 'sec.'); + winston.info(`[build] Asset compilation successful. Completed in ${totalTime}sec.`); } catch (err) { - winston.error('[build] Encountered error during build step\n' + (err.stack ? err.stack : err)); + winston.error(`[build] Encountered error during build step\n${err.stack ? err.stack : err}`); throw err; } }; diff --git a/src/meta/cacheBuster.js b/src/meta/cacheBuster.js index 4046eca302..55f35764a9 100644 --- a/src/meta/cacheBuster.js +++ b/src/meta/cacheBuster.js @@ -26,7 +26,7 @@ exports.read = async function read() { try { const buster = await fs.promises.readFile(filePath, 'utf8'); if (!buster || buster.length !== 11) { - winston.warn('[cache-buster] cache buster string invalid: expected /[a-z0-9]{11}/, got `' + buster + '`'); + winston.warn(`[cache-buster] cache buster string invalid: expected /[a-z0-9]{11}/, got \`${buster}\``); return generate(); } diff --git a/src/meta/configs.js b/src/meta/configs.js index ba00a1d712..e32d4b6ee8 100644 --- a/src/meta/configs.js +++ b/src/meta/configs.js @@ -91,7 +91,7 @@ Configs.serialize = serialize; Configs.init = async function () { const config = await Configs.list(); const buster = await cacheBuster.read(); - config['cache-buster'] = 'v=' + (buster || Date.now()); + config['cache-buster'] = `v=${buster || Date.now()}`; Meta.config = config; }; diff --git a/src/meta/css.js b/src/meta/css.js index be251538e7..d270856f6e 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -24,7 +24,7 @@ CSS.supportedSkins = [ const buildImports = { client: function (source) { - return '@import "./theme";\n' + source + '\n' + [ + return `@import "./theme";\n${source}\n${[ '@import "font-awesome";', '@import "../../public/less/jquery-ui.less";', '@import (inline) "../node_modules/@adactive/bootstrap-tagsinput/src/bootstrap-tagsinput.css";', @@ -36,10 +36,10 @@ const buildImports = { '@import "../../public/less/modals.less";', ].map(function (str) { return str.replace(/\//g, path.sep); - }).join('\n'); + }).join('\n')}`; }, admin: function (source) { - return source + '\n' + [ + return `${source}\n${[ '@import "font-awesome";', '@import "../public/less/admin/admin";', '@import "../public/less/generics.less";', @@ -48,7 +48,7 @@ const buildImports = { '@import (inline) "../public/vendor/mdl/material.css";', ].map(function (str) { return str.replace(/\//g, path.sep); - }).join('\n'); + }).join('\n')}`; }, }; @@ -57,7 +57,7 @@ async function filterMissingFiles(filepaths) { filepaths.map(async (filepath) => { const exists = await file.exists(path.join(__dirname, '../../node_modules', filepath)); if (!exists) { - winston.warn('[meta/css] File not found! ' + filepath); + winston.warn(`[meta/css] File not found! ${filepath}`); } return exists; }) @@ -71,7 +71,7 @@ async function getImports(files, prefix, extension) { files.forEach(function (styleFile) { if (styleFile.endsWith(extension)) { - source += prefix + path.sep + styleFile + '";'; + source += `${prefix + path.sep + styleFile}";`; } else { pluginDirectories.push(styleFile); } @@ -79,7 +79,7 @@ async function getImports(files, prefix, extension) { await Promise.all(pluginDirectories.map(async function (directory) { const styleFiles = await file.walk(directory); styleFiles.forEach(function (styleFile) { - source += prefix + path.sep + styleFile + '";'; + source += `${prefix + path.sep + styleFile}";`; }); })); return source; @@ -110,8 +110,8 @@ async function getBundleMetadata(target) { themeData.bootswatchSkin = skin || themeData.bootswatchSkin; if (themeData && themeData.bootswatchSkin) { - skinImport.push('\n@import "./@nodebb/bootswatch/' + themeData.bootswatchSkin + '/variables.less";'); - skinImport.push('\n@import "./@nodebb/bootswatch/' + themeData.bootswatchSkin + '/bootswatch.less";'); + skinImport.push(`\n@import "./@nodebb/bootswatch/${themeData.bootswatchSkin}/variables.less";`); + skinImport.push(`\n@import "./@nodebb/bootswatch/${themeData.bootswatchSkin}/bootswatch.less";`); } skinImport = skinImport.join(''); } @@ -127,7 +127,7 @@ async function getBundleMetadata(target) { return await getImports(filteredFiles, prefix, extension); } - let imports = skinImport + '\n' + cssImports + '\n' + lessImports + '\n' + acpLessImports; + let imports = `${skinImport}\n${cssImports}\n${lessImports}\n${acpLessImports}`; imports = buildImports[target](imports); return { paths: paths, imports: imports }; @@ -142,7 +142,7 @@ CSS.buildBundle = async function (target, fork) { const minify = process.env.NODE_ENV !== 'development'; const bundle = await minifier.css.bundle(data.imports, data.paths, minify, fork); - const filename = target + '.css'; + const filename = `${target}.css`; await fs.promises.writeFile(path.join(__dirname, '../../build/public', filename), bundle.code); return bundle.code; }; diff --git a/src/meta/debugFork.js b/src/meta/debugFork.js index 3ec746da10..e3ccc68e0d 100644 --- a/src/meta/debugFork.js +++ b/src/meta/debugFork.js @@ -21,7 +21,7 @@ function debugFork(modulePath, args, options) { if (global.v8debug || debugging) { lastAddress += 1; - execArgv = [debugArg[0] + '=' + lastAddress, '--nolazy']; + execArgv = [`${debugArg[0]}=${lastAddress}`, '--nolazy']; } if (!Array.isArray(args)) { diff --git a/src/meta/dependencies.js b/src/meta/dependencies.js index ee78f54a8a..a5dde21fee 100644 --- a/src/meta/dependencies.js +++ b/src/meta/dependencies.js @@ -38,7 +38,7 @@ Dependencies.checkModule = async function (moduleName) { return satisfies; } catch (err) { if (err.code === 'ENOENT' && pluginNamePattern.test(moduleName)) { - winston.warn('[meta/dependencies] Bundled plugin ' + moduleName + ' not found, skipping dependency check.'); + winston.warn(`[meta/dependencies] Bundled plugin ${moduleName} not found, skipping dependency check.`); return true; } throw err; @@ -49,7 +49,7 @@ Dependencies.parseModuleData = function (moduleName, pkgData) { try { pkgData = JSON.parse(pkgData); } catch (e) { - winston.warn('[' + 'missing'.red + '] ' + moduleName.bold + ' is a required dependency but could not be found\n'); + winston.warn(`[${'missing'.red}] ${moduleName.bold} is a required dependency but could not be found\n`); depsMissing = true; return null; } @@ -64,7 +64,7 @@ Dependencies.doesSatisfy = function (moduleData, packageJSONVersion) { const githubRepo = moduleData._resolved && moduleData._resolved.includes('//github.com'); const satisfies = versionOk || githubRepo; if (!satisfies) { - winston.warn('[' + 'outdated'.yellow + '] ' + moduleData.name.bold + ' installed v' + moduleData.version + ', package.json requires ' + packageJSONVersion + '\n'); + winston.warn(`[${'outdated'.yellow}] ${moduleData.name.bold} installed v${moduleData.version}, package.json requires ${packageJSONVersion}\n`); depsOutdated = true; } return satisfies; diff --git a/src/meta/js.js b/src/meta/js.js index 67753e4455..33f1bf059f 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -275,7 +275,7 @@ async function requirejsOptimize(target) { // eslint-disable-next-line no-await-in-loop await optimizeAsync({ ...sharedCfg, ...moduleCfg }); } - const filePath = path.join(__dirname, '../../build/public/rjs-bundle-' + target + '.js'); + const filePath = path.join(__dirname, `../../build/public/rjs-bundle-${target}.js`); await fs.promises.writeFile(filePath, scriptText); } @@ -297,7 +297,7 @@ async function getBundleScriptList(target) { if (target === 'admin') { target = 'acp'; } - let pluginScripts = plugins[target + 'Scripts'].filter(function (path) { + let pluginScripts = plugins[`${target}Scripts`].filter(function (path) { if (path.endsWith('.js')) { return true; } @@ -339,7 +339,7 @@ JS.buildBundle = async function (target, fork) { const files = await getBundleScriptList(target); files.push({ - srcPath: path.join(__dirname, '../../build/public/rjs-bundle-' + target + '.js'), + srcPath: path.join(__dirname, `../../build/public/rjs-bundle-${target}.js`), }); const minify = process.env.NODE_ENV !== 'development'; diff --git a/src/meta/languages.js b/src/meta/languages.js index 6e06411302..a1ab2e22bb 100644 --- a/src/meta/languages.js +++ b/src/meta/languages.js @@ -61,7 +61,7 @@ async function getTranslationMetadata() { async function writeLanguageFile(language, namespace, translations) { const dev = process.env.NODE_ENV === 'development'; - const filePath = path.join(buildLanguagesPath, language, namespace + '.json'); + const filePath = path.join(buildLanguagesPath, language, `${namespace}.json`); await mkdirp(path.dirname(filePath)); await fs.promises.writeFile(filePath, JSON.stringify(translations, null, dev ? 2 : 0)); @@ -91,7 +91,7 @@ async function buildTranslations(ref) { async function buildNamespaceLanguage(lang, namespace, plugins) { const translations = {}; // core first - await assignFileToTranslations(translations, path.join(coreLanguagesPath, lang, namespace + '.json')); + await assignFileToTranslations(translations, path.join(coreLanguagesPath, lang, `${namespace}.json`)); await Promise.all(plugins.map(pluginData => addPlugin(translations, pluginData, lang, namespace))); @@ -118,7 +118,7 @@ async function addPlugin(translations, pluginData, lang, namespace) { for (const language of langs) { /* eslint-disable no-await-in-loop */ - await assignFileToTranslations(translations, path.join(pluginLanguages, language, namespace + '.json')); + await assignFileToTranslations(translations, path.join(pluginLanguages, language, `${namespace}.json`)); } } diff --git a/src/meta/minifier.js b/src/meta/minifier.js index 7b85a6f23d..10a383be3a 100644 --- a/src/meta/minifier.js +++ b/src/meta/minifier.js @@ -27,7 +27,7 @@ Object.defineProperty(Minifier, 'maxThreads', { set: function (val) { maxThreads = val; if (!process.env.minifier_child) { - winston.verbose('[minifier] utilizing a maximum of ' + maxThreads + ' additional threads'); + winston.verbose(`[minifier] utilizing a maximum of ${maxThreads} additional threads`); } }, configurable: true, @@ -232,19 +232,19 @@ function minifyAndSave(data, callback) { var minified = uglify.minify(scripts, { sourceMap: { filename: data.filename, - url: String(data.filename).split(/[/\\]/).pop() + '.map', + url: `${String(data.filename).split(/[/\\]/).pop()}.map`, includeSources: true, }, compress: false, }); if (minified.error) { - return callback({ stack: 'Error minifying ' + minified.error.filename + '\n' + minified.error.stack }); + return callback({ stack: `Error minifying ${minified.error.filename}\n${minified.error.stack}` }); } async.parallel([ async.apply(fs.writeFile, data.destPath, minified.code), - async.apply(fs.writeFile, data.destPath + '.map', minified.map), + async.apply(fs.writeFile, `${data.destPath}.map`, minified.map), ], callback); } diff --git a/src/meta/settings.js b/src/meta/settings.js index 681633f767..e001f4cad4 100644 --- a/src/meta/settings.js +++ b/src/meta/settings.js @@ -9,20 +9,20 @@ const cache = require('../cache'); const Settings = module.exports; Settings.get = async function (hash) { - const cached = cache.get('settings:' + hash); + const cached = cache.get(`settings:${hash}`); if (cached) { return cached; } - let data = await db.getObject('settings:' + hash) || {}; - const sortedLists = await db.getSetMembers('settings:' + hash + ':sorted-lists'); + let data = await db.getObject(`settings:${hash}`) || {}; + const sortedLists = await db.getSetMembers(`settings:${hash}:sorted-lists`); await Promise.all(sortedLists.map(async function (list) { - const members = await db.getSortedSetRange('settings:' + hash + ':sorted-list:' + list, 0, -1) || []; + const members = await db.getSortedSetRange(`settings:${hash}:sorted-list:${list}`, 0, -1) || []; const keys = []; data[list] = []; for (const order of members) { - keys.push('settings:' + hash + ':sorted-list:' + list + ':' + order); + keys.push(`settings:${hash}:sorted-list:${list}:${order}`); } const objects = await db.getObjects(keys); @@ -32,7 +32,7 @@ Settings.get = async function (hash) { })); ({ values: data } = await plugins.hooks.fire('filter:settings.get', { plugin: hash, values: data })); - cache.set('settings:' + hash, data); + cache.set(`settings:${hash}`, data); return data; }; @@ -59,14 +59,14 @@ Settings.set = async function (hash, values, quiet) { if (sortedLists.length) { // Remove provided (but empty) sorted lists from the hash set - await db.setRemove('settings:' + hash + ':sorted-lists', sortedLists.filter(list => !sortedListData[list].length)); - await db.setAdd('settings:' + hash + ':sorted-lists', sortedLists); + await db.setRemove(`settings:${hash}:sorted-lists`, sortedLists.filter(list => !sortedListData[list].length)); + await db.setAdd(`settings:${hash}:sorted-lists`, sortedLists); await Promise.all(sortedLists.map(async function (list) { - const numItems = await db.sortedSetCard('settings:' + hash + ':sorted-list:' + list); - const deleteKeys = ['settings:' + hash + ':sorted-list:' + list]; + const numItems = await db.sortedSetCard(`settings:${hash}:sorted-list:${list}`); + const deleteKeys = [`settings:${hash}:sorted-list:${list}`]; for (let x = 0; x < numItems; x++) { - deleteKeys.push('settings:' + hash + ':sorted-list:' + list + ':' + x); + deleteKeys.push(`settings:${hash}:sorted-list:${list}:${x}`); } await db.deleteAll(deleteKeys); })); @@ -75,8 +75,8 @@ Settings.set = async function (hash, values, quiet) { sortedLists.forEach(function (list) { const arr = sortedListData[list]; arr.forEach(function (data, order) { - ops.push(db.sortedSetAdd('settings:' + hash + ':sorted-list:' + list, order, order)); - ops.push(db.setObject('settings:' + hash + ':sorted-list:' + list + ':' + order, data)); + ops.push(db.sortedSetAdd(`settings:${hash}:sorted-list:${list}`, order, order)); + ops.push(db.setObject(`settings:${hash}:sorted-list:${list}:${order}`, data)); }); }); @@ -84,17 +84,17 @@ Settings.set = async function (hash, values, quiet) { } if (Object.keys(values).length) { - await db.setObject('settings:' + hash, values); + await db.setObject(`settings:${hash}`, values); } - cache.del('settings:' + hash); + cache.del(`settings:${hash}`); plugins.hooks.fire('action:settings.set', { plugin: hash, settings: { ...values, ...sortedListData }, // Add back sorted list data to values hash }); - pubsub.publish('action:settings.set.' + hash, values); + pubsub.publish(`action:settings.set.${hash}`, values); Meta.reloadRequired = !quiet; }; diff --git a/src/meta/tags.js b/src/meta/tags.js index 4282575e45..2636bc5f9e 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -33,7 +33,7 @@ Tags.parse = async (req, data, meta, link) => { content: Meta.config.title || 'NodeBB', }, { name: 'msapplication-badge', - content: 'frequency=30; polling-uri=' + url + '/sitemap.xml', + content: `frequency=30; polling-uri=${url}/sitemap.xml`, noEscape: true, }, { name: 'theme-color', @@ -59,10 +59,10 @@ Tags.parse = async (req, data, meta, link) => { var defaultLinks = [{ rel: 'icon', type: 'image/x-icon', - href: relative_path + '/favicon.ico' + (Meta.config['cache-buster'] ? '?' + Meta.config['cache-buster'] : ''), + href: `${relative_path}/favicon.ico${Meta.config['cache-buster'] ? `?${Meta.config['cache-buster']}` : ''}`, }, { rel: 'manifest', - href: relative_path + '/manifest.webmanifest', + href: `${relative_path}/manifest.webmanifest`, }]; if (plugins.hooks.hasListeners('filter:search.query')) { @@ -70,7 +70,7 @@ Tags.parse = async (req, data, meta, link) => { rel: 'search', type: 'application/opensearchdescription+xml', title: utils.escapeHTML(String(Meta.config.title || Meta.config.browserTitle || 'NodeBB')), - href: relative_path + '/osd.xml', + href: `${relative_path}/osd.xml`, }); } @@ -78,64 +78,64 @@ Tags.parse = async (req, data, meta, link) => { if (Meta.config['brand:touchIcon']) { defaultLinks.push({ rel: 'apple-touch-icon', - href: relative_path + upload_url + '/system/touchicon-orig.png', + href: `${relative_path + upload_url}/system/touchicon-orig.png`, }, { rel: 'icon', sizes: '36x36', - href: relative_path + upload_url + '/system/touchicon-36.png', + href: `${relative_path + upload_url}/system/touchicon-36.png`, }, { rel: 'icon', sizes: '48x48', - href: relative_path + upload_url + '/system/touchicon-48.png', + href: `${relative_path + upload_url}/system/touchicon-48.png`, }, { rel: 'icon', sizes: '72x72', - href: relative_path + upload_url + '/system/touchicon-72.png', + href: `${relative_path + upload_url}/system/touchicon-72.png`, }, { rel: 'icon', sizes: '96x96', - href: relative_path + upload_url + '/system/touchicon-96.png', + href: `${relative_path + upload_url}/system/touchicon-96.png`, }, { rel: 'icon', sizes: '144x144', - href: relative_path + upload_url + '/system/touchicon-144.png', + href: `${relative_path + upload_url}/system/touchicon-144.png`, }, { rel: 'icon', sizes: '192x192', - href: relative_path + upload_url + '/system/touchicon-192.png', + href: `${relative_path + upload_url}/system/touchicon-192.png`, }); } else { defaultLinks.push({ rel: 'apple-touch-icon', - href: relative_path + '/assets/images/touch/512.png', + href: `${relative_path}/assets/images/touch/512.png`, }, { rel: 'icon', sizes: '36x36', - href: relative_path + '/assets/images/touch/192.png', + href: `${relative_path}/assets/images/touch/192.png`, }, { rel: 'icon', sizes: '48x48', - href: relative_path + '/assets/images/touch/144.png', + href: `${relative_path}/assets/images/touch/144.png`, }, { rel: 'icon', sizes: '72x72', - href: relative_path + '/assets/images/touch/96.png', + href: `${relative_path}/assets/images/touch/96.png`, }, { rel: 'icon', sizes: '96x96', - href: relative_path + '/assets/images/touch/72.png', + href: `${relative_path}/assets/images/touch/72.png`, }, { rel: 'icon', sizes: '144x144', - href: relative_path + '/assets/images/touch/48.png', + href: `${relative_path}/assets/images/touch/48.png`, }, { rel: 'icon', sizes: '192x192', - href: relative_path + '/assets/images/touch/36.png', + href: `${relative_path}/assets/images/touch/36.png`, }, { rel: 'icon', sizes: '512x512', - href: relative_path + '/assets/images/touch/512.png', + href: `${relative_path}/assets/images/touch/512.png`, }); } @@ -216,24 +216,24 @@ function addSiteOGImage(meta) { noEscape: true, }); - if (Meta.config[key + ':width'] && Meta.config[key + ':height']) { + if (Meta.config[`${key}:width`] && Meta.config[`${key}:height`]) { meta.push({ property: 'og:image:width', - content: String(Meta.config[key + ':width']), + content: String(Meta.config[`${key}:width`]), }, { property: 'og:image:height', - content: String(Meta.config[key + ':height']), + content: String(Meta.config[`${key}:height`]), }); } } else { // Push fallback logo meta.push({ property: 'og:image', - content: url + '/assets/images/logo@3x.png', + content: `${url}/assets/images/logo@3x.png`, noEscape: true, }, { property: 'og:image:url', - content: url + '/assets/images/logo@3x.png', + content: `${url}/assets/images/logo@3x.png`, noEscape: true, }, { property: 'og:image:width', diff --git a/src/meta/templates.js b/src/meta/templates.js index 526fa6f26a..44ba0f9bab 100644 --- a/src/meta/templates.js +++ b/src/meta/templates.js @@ -38,7 +38,7 @@ async function processImports(paths, templatePath, source) { return await processImports(paths, templatePath, source); } - winston.warn('[meta/templates] Partial not loaded: ' + matches[1]); + winston.warn(`[meta/templates] Partial not loaded: ${matches[1]}`); source = source.replace(regex, ''); return await processImports(paths, templatePath, source); diff --git a/src/meta/themes.js b/src/meta/themes.js index 1120591609..d20cd77af4 100644 --- a/src/meta/themes.js +++ b/src/meta/themes.js @@ -39,9 +39,9 @@ Themes.get = async () => { // Minor adjustments for API output configObj.type = 'local'; if (configObj.screenshot) { - configObj.screenshot_url = nconf.get('relative_path') + '/css/previews/' + encodeURIComponent(configObj.id); + configObj.screenshot_url = `${nconf.get('relative_path')}/css/previews/${encodeURIComponent(configObj.id)}`; } else { - configObj.screenshot_url = nconf.get('relative_path') + '/assets/images/themes/default.png'; + configObj.screenshot_url = `${nconf.get('relative_path')}/assets/images/themes/default.png`; } return configObj; @@ -50,7 +50,7 @@ Themes.get = async () => { return false; } - winston.error('[themes] Unable to parse theme.json ' + theme); + winston.error(`[themes] Unable to parse theme.json ${theme}`); return false; } })); @@ -142,7 +142,7 @@ Themes.setupPaths = async () => { var themeId = data.currentThemeId || 'nodebb-theme-persona'; if (process.env.NODE_ENV === 'development') { - winston.info('[themes] Using theme ' + themeId); + winston.info(`[themes] Using theme ${themeId}`); } var themeObj = data.themesData.find(function (themeObj) { diff --git a/src/middleware/admin.js b/src/middleware/admin.js index eae646035a..28100dbbb3 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -68,7 +68,7 @@ middleware.renderHeader = async (req, res, data) => { scripts: results.scripts, 'cache-buster': meta.config['cache-buster'] || '', env: !!process.env.NODE_ENV, - title: (acpPath || 'Dashboard') + ' | NodeBB Admin Control Panel', + title: `${acpPath || 'Dashboard'} | NodeBB Admin Control Panel`, bodyClass: data.bodyClass, version: version, latestVersion: results.latestVersion, @@ -100,7 +100,7 @@ async function getLatestVersion() { const result = await versions.getLatestVersion(); return result; } catch (err) { - winston.error('[acp] Failed to fetch latest version' + err.stack); + winston.error(`[acp] Failed to fetch latest version${err.stack}`); } return null; } @@ -151,7 +151,7 @@ middleware.checkPrivileges = helpers.try(async (req, res, next) => { let returnTo = req.path; if (nconf.get('relative_path')) { - returnTo = req.path.replace(new RegExp('^' + nconf.get('relative_path')), ''); + returnTo = req.path.replace(new RegExp(`^${nconf.get('relative_path')}`), ''); } returnTo = returnTo.replace(/^\/api/, ''); @@ -166,6 +166,6 @@ middleware.checkPrivileges = helpers.try(async (req, res, next) => { if (res.locals.isAPI) { res.status(401).json({}); } else { - res.redirect(nconf.get('relative_path') + '/login?local=1'); + res.redirect(`${nconf.get('relative_path')}/login?local=1`); } }); diff --git a/src/middleware/header.js b/src/middleware/header.js index 0de5b79470..7157c831d9 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -75,7 +75,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) { isModerator: user.isModeratorOfAnyCategory(req.uid), privileges: privileges.global.get(req.uid), user: user.getUserData(req.uid), - isEmailConfirmSent: (!meta.config.requireEmailConfirmation || req.uid <= 0) ? false : await db.get('uid:' + req.uid + ':confirm:email:sent'), + isEmailConfirmSent: (!meta.config.requireEmailConfirmation || req.uid <= 0) ? false : await db.get(`uid:${req.uid}:confirm:email:sent`), languageDirection: translator.translate('[[language:dir]]', res.locals.config.userLang), timeagoCode: languages.userTimeagoCode(res.locals.config.userLang), browserTitle: translator.translate(controllers.helpers.buildTitle(translator.unescape(data.title))), diff --git a/src/middleware/headers.js b/src/middleware/headers.js index 93f90a1ef0..f68c371d2d 100644 --- a/src/middleware/headers.js +++ b/src/middleware/headers.js @@ -17,7 +17,7 @@ module.exports = function (middleware) { }; if (meta.config['csp-frame-ancestors']) { - headers['Content-Security-Policy'] = 'frame-ancestors ' + meta.config['csp-frame-ancestors']; + headers['Content-Security-Policy'] = `frame-ancestors ${meta.config['csp-frame-ancestors']}`; if (meta.config['csp-frame-ancestors'] === '\'none\'') { headers['X-Frame-Options'] = 'DENY'; } @@ -44,7 +44,7 @@ module.exports = function (middleware) { try { origin = new RegExp(origin.trim()); } catch (err) { - winston.error('[middleware.addHeaders] Invalid RegExp For access-control-allow-origin ' + origin); + winston.error(`[middleware.addHeaders] Invalid RegExp For access-control-allow-origin ${origin}`); origin = null; } return origin; @@ -102,7 +102,7 @@ module.exports = function (middleware) { const codes = await languages.listCodes(); return _.uniq([defaultLang, ...codes]); } catch (err) { - winston.error('[middleware/autoLocale] Could not retrieve languages codes list! ' + err.stack); + winston.error(`[middleware/autoLocale] Could not retrieve languages codes list! ${err.stack}`); return [defaultLang]; } } diff --git a/src/middleware/index.js b/src/middleware/index.js index 5e7e93e734..7571d3fca2 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -52,7 +52,7 @@ middleware.applyCSRF = function (req, res, next) { }; middleware.applyCSRFasync = util.promisify(middleware.applyCSRF); -middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(relative_path + '/login'); +middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(`${relative_path}/login`); Object.assign(middleware, { admin: require('./admin'), @@ -159,7 +159,7 @@ middleware.privateUploads = function privateUploads(req, res, next) { return next(); } - if (req.path.startsWith(nconf.get('relative_path') + '/assets/uploads/files')) { + if (req.path.startsWith(`${nconf.get('relative_path')}/assets/uploads/files`)) { var extensions = (meta.config.privateUploadsExtensions || '').split(',').filter(Boolean); var ext = path.extname(req.path); ext = ext ? ext.replace(/^\./, '') : ext; @@ -219,7 +219,7 @@ middleware.trimUploadTimestamps = function trimUploadTimestamps(req, res, next) let basename = path.basename(req.path); if (req.path.startsWith('/uploads/files/') && middleware.regexes.timestampedUpload.test(basename)) { basename = basename.slice(14); - res.header('Content-Disposition', 'inline; filename="' + basename + '"'); + res.header('Content-Disposition', `inline; filename="${basename}"`); } next(); @@ -249,5 +249,5 @@ middleware.checkRequired = function (fields, req, res, next) { return next(); } - controllers.helpers.formatApiResponse(400, res, new Error('Required parameters were missing from this API call: ' + missing.join(', '))); + controllers.helpers.formatApiResponse(400, res, new Error(`Required parameters were missing from this API call: ${missing.join(', ')}`)); }; diff --git a/src/middleware/ratelimit.js b/src/middleware/ratelimit.js index 89f6cccdc4..9697c56513 100644 --- a/src/middleware/ratelimit.js +++ b/src/middleware/ratelimit.js @@ -18,7 +18,7 @@ ratelimit.isFlooding = function (socket) { socket.elapsedTime += now - socket.lastCallTime; if (socket.callsPerSecond > allowedCalls && socket.elapsedTime < timeframe) { - winston.warn('Flooding detected! Calls : ' + socket.callsPerSecond + ', Duration : ' + socket.elapsedTime); + winston.warn(`Flooding detected! Calls : ${socket.callsPerSecond}, Duration : ${socket.elapsedTime}`); return true; } diff --git a/src/middleware/render.js b/src/middleware/render.js index 0462ca3671..36c098f3fc 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -33,7 +33,7 @@ module.exports = function (middleware) { options.url = (req.baseUrl + req.path.replace(/^\/api/, '')); options.bodyClass = buildBodyClass(req, res, options); - const buildResult = await plugins.hooks.fire('filter:' + template + '.build', { req: req, res: res, templateData: options }); + const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options }); const templateToRender = buildResult.templateData.templateToRender || template; const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData }); @@ -42,7 +42,7 @@ module.exports = function (middleware) { tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags), }; options.widgets = await widgets.render(req.uid, { - template: template + '.tpl', + template: `${template}.tpl`, url: options.url, templateData: options, req: req, @@ -65,14 +65,14 @@ module.exports = function (middleware) { footer: renderHeaderFooter('renderFooter', req, res, options), }); - const str = results.header + + const str = `${results.header + (res.locals.postHeader || '') + - results.content + - '' + - (res.locals.preFooter || '') + - results.footer; + results.content + }${ + res.locals.preFooter || '' + }${results.footer}`; if (typeof fn !== 'function') { self.send(str); @@ -129,22 +129,22 @@ module.exports = function (middleware) { p = ''; } p = validator.escape(String(p)); - parts[index] = index ? parts[0] + '-' + p : 'page-' + (p || 'home'); + parts[index] = index ? `${parts[0]}-${p}` : `page-${p || 'home'}`; }); if (templateData.template.topic) { - parts.push('page-topic-category-' + templateData.category.cid); - parts.push('page-topic-category-' + slugify(templateData.category.name)); + parts.push(`page-topic-category-${templateData.category.cid}`); + parts.push(`page-topic-category-${slugify(templateData.category.name)}`); } if (templateData.breadcrumbs) { templateData.breadcrumbs.forEach(function (crumb) { if (crumb.hasOwnProperty('cid')) { - parts.push('parent-category-' + crumb.cid); + parts.push(`parent-category-${crumb.cid}`); } }); } - parts.push('page-status-' + res.statusCode); + parts.push(`page-status-${res.statusCode}`); return parts.join(' '); } }; diff --git a/src/middleware/user.js b/src/middleware/user.js index 3df31934bf..f6e6878bc7 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -173,7 +173,7 @@ module.exports = function (middleware) { return next(); } const userslug = await user.getUserField(req.uid, 'userslug'); - controllers.helpers.redirect(res, '/user/' + userslug); + controllers.helpers.redirect(res, `/user/${userslug}`); }); middleware.redirectUidToUserslug = helpers.try(async function redirectUidToUserslug(req, res, next) { @@ -196,7 +196,7 @@ module.exports = function (middleware) { if (!userslug) { return controllers.helpers.notAllowed(req, res); } - const path = req.path.replace(/^(\/api)?\/me/, '/user/' + userslug); + const path = req.path.replace(/^(\/api)?\/me/, `/user/${userslug}`); controllers.helpers.redirect(res, path); }); @@ -228,7 +228,7 @@ module.exports = function (middleware) { let returnTo = req.path; if (nconf.get('relative_path')) { - returnTo = req.path.replace(new RegExp('^' + nconf.get('relative_path')), ''); + returnTo = req.path.replace(new RegExp(`^${nconf.get('relative_path')}`), ''); } returnTo = returnTo.replace(/^\/api/, ''); @@ -237,7 +237,7 @@ module.exports = function (middleware) { if (res.locals.isAPI) { controllers.helpers.formatApiResponse(401, res); } else { - res.redirect(nconf.get('relative_path') + '/login?local=1'); + res.redirect(`${nconf.get('relative_path')}/login?local=1`); } }); diff --git a/src/notifications.js b/src/notifications.js index 1b12d27e39..f7d5a4c49a 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -61,7 +61,7 @@ Notifications.getMultiple = async function (nids) { return []; } - const keys = nids.map(nid => 'notifications:' + nid); + const keys = nids.map(nid => `notifications:${nid}`); const notifications = await db.getObjects(keys); const userKeys = notifications.map(n => n && n.from); @@ -85,7 +85,7 @@ Notifications.getMultiple = async function (nids) { notification.bodyShort = notification.bodyShort.replace(/([\s\S]*?),[\s\S]*?,([\s\S]*?)/, '$1, [[global:guest]], $2'); } } else if (notification.image === 'brand:logo' || !notification.image) { - notification.image = meta.config['brand:logo'] || nconf.get('relative_path') + '/logo.png'; + notification.image = meta.config['brand:logo'] || `${nconf.get('relative_path')}/logo.png`; } } }); @@ -105,7 +105,7 @@ Notifications.findRelated = async function (mergeIds, set) { // A related notification is one in a zset that has the same mergeId const nids = await db.getSortedSetRevRange(set, 0, -1); - const keys = nids.map(nid => 'notifications:' + nid); + const keys = nids.map(nid => `notifications:${nid}`); const notificationData = await db.getObjectsFields(keys, ['mergeId']); const notificationMergeIds = notificationData.map(notifObj => String(notifObj.mergeId)); const mergeSet = new Set(mergeIds.map(id => String(id))); @@ -117,7 +117,7 @@ Notifications.create = async function (data) { throw new Error('[[error:no-notification-id]]'); } data.importance = data.importance || 5; - const oldNotif = await db.getObject('notifications:' + data.nid); + const oldNotif = await db.getObject(`notifications:${data.nid}`); if (oldNotif && parseInt(oldNotif.pid, 10) === parseInt(data.pid, 10) && parseInt(oldNotif.importance, 10) > parseInt(data.importance, 10)) { return null; } @@ -125,7 +125,7 @@ Notifications.create = async function (data) { data.datetime = now; await Promise.all([ db.sortedSetAdd('notifications', now, data.nid), - db.setObject('notifications:' + data.nid, data), + db.setObject(`notifications:${data.nid}`, data), ]); return data; }; @@ -156,8 +156,8 @@ async function pushToUids(uids, notification) { return; } const oneWeekAgo = Date.now() - 604800000; - const unreadKeys = uids.map(uid => 'uid:' + uid + ':notifications:unread'); - const readKeys = uids.map(uid => 'uid:' + uid + ':notifications:read'); + const unreadKeys = uids.map(uid => `uid:${uid}:notifications:unread`); + const readKeys = uids.map(uid => `uid:${uid}:notifications:read`); await db.sortedSetsAdd(unreadKeys, notification.datetime, notification.nid); await db.sortedSetsRemove(readKeys, notification.nid); await db.sortedSetsRemoveRangeByScore(unreadKeys, '-inf', oneWeekAgo); @@ -165,7 +165,7 @@ async function pushToUids(uids, notification) { const websockets = require('./socket.io'); if (websockets.server) { uids.forEach(function (uid) { - websockets.in('uid_' + uid).emit('event:new_notification', notification); + websockets.in(`uid_${uid}`).emit('event:new_notification', notification); }); } } @@ -190,7 +190,7 @@ async function pushToUids(uids, notification) { body: body, notification: notification, showUnsubscribe: true, - }).catch(err => winston.error('[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[emailer.send] ${err.stack}`)); }); } @@ -199,7 +199,7 @@ async function pushToUids(uids, notification) { const uidsToEmail = []; const usersSettings = await User.getMultipleUserSettings(uids); usersSettings.forEach(function (userSettings) { - const setting = userSettings['notificationType_' + notification.type] || 'notification'; + const setting = userSettings[`notificationType_${notification.type}`] || 'notification'; if (setting === 'notification' || setting === 'notificationemail') { uidsToNotify.push(userSettings.uid); @@ -256,7 +256,7 @@ Notifications.pushGroups = async function (notification, groupNames) { Notifications.rescind = async function (nid) { await Promise.all([ db.sortedSetRemove('notifications', nid), - db.delete('notifications:' + nid), + db.delete(`notifications:${nid}`), ]); }; @@ -271,15 +271,15 @@ Notifications.markUnread = async function (nid, uid) { if (!(parseInt(uid, 10) > 0) || !nid) { return; } - const notification = await db.getObject('notifications:' + nid); + const notification = await db.getObject(`notifications:${nid}`); if (!notification) { throw new Error('[[error:no-notification]]'); } notification.datetime = notification.datetime || Date.now(); await Promise.all([ - db.sortedSetRemove('uid:' + uid + ':notifications:read', nid), - db.sortedSetAdd('uid:' + uid + ':notifications:unread', notification.datetime, nid), + db.sortedSetRemove(`uid:${uid}:notifications:read`, nid), + db.sortedSetAdd(`uid:${uid}:notifications:unread`, notification.datetime, nid), ]); }; @@ -289,13 +289,13 @@ Notifications.markReadMultiple = async function (nids, uid) { return; } - let notificationKeys = nids.map(nid => 'notifications:' + nid); + let notificationKeys = nids.map(nid => `notifications:${nid}`); let mergeIds = await db.getObjectsFields(notificationKeys, ['mergeId']); // Isolate mergeIds and find related notifications mergeIds = _.uniq(mergeIds.map(set => set.mergeId)); - const relatedNids = await Notifications.findRelated(mergeIds, 'uid:' + uid + ':notifications:unread'); - notificationKeys = _.union(nids, relatedNids).map(nid => 'notifications:' + nid); + const relatedNids = await Notifications.findRelated(mergeIds, `uid:${uid}:notifications:unread`); + notificationKeys = _.union(nids, relatedNids).map(nid => `notifications:${nid}`); let notificationData = await db.getObjectsFields(notificationKeys, ['nid', 'datetime']); notificationData = notificationData.filter(n => n && n.nid); @@ -303,13 +303,13 @@ Notifications.markReadMultiple = async function (nids, uid) { nids = notificationData.map(n => n.nid); const datetimes = notificationData.map(n => (n && n.datetime) || Date.now()); await Promise.all([ - db.sortedSetRemove('uid:' + uid + ':notifications:unread', nids), - db.sortedSetAdd('uid:' + uid + ':notifications:read', datetimes, nids), + db.sortedSetRemove(`uid:${uid}:notifications:unread`, nids), + db.sortedSetAdd(`uid:${uid}:notifications:read`, datetimes, nids), ]); }; Notifications.markAllRead = async function (uid) { - const nids = await db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99); + const nids = await db.getSortedSetRevRange(`uid:${uid}:notifications:unread`, 0, 99); await Notifications.markReadMultiple(nids, uid); }; @@ -323,17 +323,17 @@ Notifications.prune = async function () { try { await Promise.all([ db.sortedSetRemove('notifications', nids), - db.deleteAll(nids.map(nid => 'notifications:' + nid)), + db.deleteAll(nids.map(nid => `notifications:${nid}`)), ]); await batch.processSortedSet('users:joindate', async function (uids) { - const unread = uids.map(uid => 'uid:' + uid + ':notifications:unread'); - const read = uids.map(uid => 'uid:' + uid + ':notifications:read'); + const unread = uids.map(uid => `uid:${uid}:notifications:unread`); + const read = uids.map(uid => `uid:${uid}:notifications:read`); await db.sortedSetsRemoveRangeByScore(unread.concat(read), '-inf', cutoffTime); }, { batch: 500, interval: 100 }); } catch (err) { if (err) { - winston.error('Encountered error pruning notifications\n' + err.stack); + winston.error(`Encountered error pruning notifications\n${err.stack}`); } } }; @@ -371,7 +371,7 @@ Notifications.merge = async function (notifications) { if (differentiator === 0 && differentiators.length === 1) { set = isolated; } else { - set = isolated.filter(n => n.mergeId === (mergeId + '|' + differentiator)); + set = isolated.filter(n => n.mergeId === (`${mergeId}|${differentiator}`)); } const modifyIndex = notifications.indexOf(set[0]); @@ -390,19 +390,19 @@ Notifications.merge = async function (notifications) { var title = utils.decodeHTMLEntities(notifications[modifyIndex].topicTitle || ''); var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); - titleEscaped = titleEscaped ? (', ' + titleEscaped) : ''; + titleEscaped = titleEscaped ? (`, ${titleEscaped}`) : ''; if (numUsers === 2) { - notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + titleEscaped + ']]'; + notifications[modifyIndex].bodyShort = `[[${mergeId}_dual, ${usernames.join(', ')}${titleEscaped}]]`; } else if (numUsers > 2) { - notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers - 1) + titleEscaped + ']]'; + notifications[modifyIndex].bodyShort = `[[${mergeId}_multiple, ${usernames[0]}, ${numUsers - 1}${titleEscaped}]]`; } notifications[modifyIndex].path = set[set.length - 1].path; break; case 'new_register': - notifications[modifyIndex].bodyShort = '[[notifications:' + mergeId + '_multiple, ' + set.length + ']]'; + notifications[modifyIndex].bodyShort = `[[notifications:${mergeId}_multiple, ${set.length}]]`; break; } @@ -412,7 +412,7 @@ Notifications.merge = async function (notifications) { return true; } - return !(notifObj.mergeId === (mergeId + (differentiator ? '|' + differentiator : '')) && idx !== modifyIndex); + return !(notifObj.mergeId === (mergeId + (differentiator ? `|${differentiator}` : '')) && idx !== modifyIndex); }); }); diff --git a/src/pagination.js b/src/pagination.js index 438ee58b70..291def4626 100644 --- a/src/pagination.js +++ b/src/pagination.js @@ -69,14 +69,14 @@ pagination.create = function (currentPage, pageCount, queryObj) { if (currentPage < pageCount) { data.rel.push({ rel: 'next', - href: '?' + qs.stringify({ ...queryObj, page: next }), + href: `?${qs.stringify({ ...queryObj, page: next })}`, }); } if (currentPage > 1) { data.rel.push({ rel: 'prev', - href: '?' + qs.stringify({ ...queryObj, page: previous }), + href: `?${qs.stringify({ ...queryObj, page: previous })}`, }); } return data; diff --git a/src/plugins/data.js b/src/plugins/data.js index 4ffd02d3d2..65844c0da3 100644 --- a/src/plugins/data.js +++ b/src/plugins/data.js @@ -45,7 +45,7 @@ Data.loadPluginInfo = async function (pluginPath) { } catch (err) { var pluginDir = path.basename(pluginPath); - winston.error('[plugins/' + pluginDir + '] Error in plugin.json or package.json!' + err.stack); + winston.error(`[plugins/${pluginDir}] Error in plugin.json or package.json!${err.stack}`); throw new Error('[[error:parse-error]]'); } return pluginData; @@ -53,7 +53,7 @@ Data.loadPluginInfo = async function (pluginPath) { function parseLicense(packageData) { try { - const licenseData = require('spdx-license-list/licenses/' + packageData.license); + const licenseData = require(`spdx-license-list/licenses/${packageData.license}`); return { name: licenseData.name, text: licenseData.licenseText, @@ -86,8 +86,8 @@ Data.getStaticDirectories = async function (pluginData) { async function processDir(route) { if (!validMappedPath.test(route)) { - winston.warn('[plugins/' + pluginData.id + '] Invalid mapped path specified: ' + - route + '. Path must adhere to: ' + validMappedPath.toString()); + winston.warn(`[plugins/${pluginData.id}] Invalid mapped path specified: ${ + route}. Path must adhere to: ${validMappedPath.toString()}`); return; } @@ -95,16 +95,16 @@ Data.getStaticDirectories = async function (pluginData) { try { const stats = await fs.promises.stat(dirPath); if (!stats.isDirectory()) { - winston.warn('[plugins/' + pluginData.id + '] Mapped path \'' + - route + ' => ' + dirPath + '\' is not a directory.'); + winston.warn(`[plugins/${pluginData.id}] Mapped path '${ + route} => ${dirPath}' is not a directory.`); return; } - staticDirs[pluginData.id + '/' + route] = dirPath; + staticDirs[`${pluginData.id}/${route}`] = dirPath; } catch (err) { if (err.code === 'ENOENT') { - winston.warn('[plugins/' + pluginData.id + '] Mapped path \'' + - route + ' => ' + dirPath + '\' not found.'); + winston.warn(`[plugins/${pluginData.id}] Mapped path '${ + route} => ${dirPath}' not found.`); return; } throw err; @@ -112,8 +112,8 @@ Data.getStaticDirectories = async function (pluginData) { } await Promise.all(dirs.map(route => processDir(route))); - winston.verbose('[plugins] found ' + Object.keys(staticDirs).length + - ' static directories for ' + pluginData.id); + winston.verbose(`[plugins] found ${Object.keys(staticDirs).length + } static directories for ${pluginData.id}`); return staticDirs; }; @@ -123,7 +123,7 @@ Data.getFiles = async function (pluginData, type) { return; } - winston.verbose('[plugins] Found ' + pluginData[type].length + ' ' + type + ' file(s) for plugin ' + pluginData.id); + winston.verbose(`[plugins] Found ${pluginData[type].length} ${type} file(s) for plugin ${pluginData.id}`); return pluginData[type].map(file => path.join(pluginData.id, file)); }; @@ -141,13 +141,13 @@ async function resolveModulePath(basePath, modulePath) { return currentPath; } if (!isNodeModule.test(modulePath)) { - winston.warn('[plugins] File not found: ' + currentPath + ' (Ignoring)'); + winston.warn(`[plugins] File not found: ${currentPath} (Ignoring)`); return; } const dirPath = path.dirname(basePath); if (dirPath === basePath) { - winston.warn('[plugins] File not found: ' + currentPath + ' (Ignoring)'); + winston.warn(`[plugins] File not found: ${currentPath} (Ignoring)`); return; } @@ -173,7 +173,7 @@ Data.getScripts = async function getScripts(pluginData, target) { } } if (scripts.length) { - winston.verbose('[plugins] Found ' + scripts.length + ' js file(s) for plugin ' + pluginData.id); + winston.verbose(`[plugins] Found ${scripts.length} js file(s) for plugin ${pluginData.id}`); } return scripts; }; @@ -192,7 +192,7 @@ Data.getModules = async function getModules(pluginData) { pluginModules = pluginModules.reduce(function (prev, modulePath) { var key; if (strip) { - key = modulePath.replace(new RegExp('.?(/[^/]+){' + strip + '}/'), ''); + key = modulePath.replace(new RegExp(`.?(/[^/]+){${strip}}/`), ''); } else { key = path.basename(modulePath); } @@ -213,7 +213,7 @@ Data.getModules = async function getModules(pluginData) { await Promise.all(Object.keys(pluginModules).map(key => processModule(key))); const len = Object.keys(modules).length; - winston.verbose('[plugins] Found ' + len + ' AMD-style module(s) for plugin ' + pluginData.id); + winston.verbose(`[plugins] Found ${len} AMD-style module(s) for plugin ${pluginData.id}`); return modules; }; diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index f88a081e8e..074954ed63 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -33,7 +33,7 @@ const hookTypeToMethod = { */ Hooks.register = function (id, data) { if (!data.hook || !data.method) { - winston.warn('[plugins/' + id + '] registerHook called with invalid data.hook/method', data); + winston.warn(`[plugins/${id}] registerHook called with invalid data.hook/method`, data); return; } @@ -75,7 +75,7 @@ Hooks.register = function (id, data) { } else if (typeof data.method === 'function') { Hooks.internals._register(data); } else { - winston.warn('[plugins/' + id + '] Hook method mismatch: ' + data.hook + ' => ' + data.method); + winston.warn(`[plugins/${id}] Hook method mismatch: ${data.hook} => ${data.method}`); } }; @@ -90,11 +90,11 @@ Hooks.fire = async function (hook, params) { const hookList = plugins.loadedHooks[hook]; const hookType = hook.split(':')[0]; if (global.env === 'development' && hook !== 'action:plugins.firehook') { - winston.verbose('[plugins/fireHook] ' + hook); + winston.verbose(`[plugins/fireHook] ${hook}`); } if (!hookTypeToMethod[hookType]) { - winston.warn('[plugins] Unknown hookType: ' + hookType + ', hook : ' + hook); + winston.warn(`[plugins] Unknown hookType: ${hookType}, hook : ${hook}`); return; } const result = await hookTypeToMethod[hookType](hook, hookList, params); @@ -119,7 +119,7 @@ async function fireFilterHook(hook, hookList, params) { return await async.reduce(hookList, params, function (params, hookObj, next) { if (typeof hookObj.method !== 'function') { if (global.env === 'development') { - winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.'); + winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } return next(null, params); } @@ -140,7 +140,7 @@ async function fireActionHook(hook, hookList, params) { for (const hookObj of hookList) { if (typeof hookObj.method !== 'function') { if (global.env === 'development') { - winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.'); + winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } } else { /* eslint-disable no-await-in-loop */ @@ -162,7 +162,7 @@ async function fireStaticHook(hook, hookList, params) { let timedOut = false; const timeoutId = setTimeout(function () { - winston.warn('[plugins] Callback timed out, hook \'' + hook + '\' in plugin \'' + hookObj.id + '\''); + winston.warn(`[plugins] Callback timed out, hook '${hook}' in plugin '${hookObj.id}'`); timedOut = true; next(); }, 5000); @@ -170,7 +170,7 @@ async function fireStaticHook(hook, hookList, params) { const callback = (err) => { clearTimeout(timeoutId); if (err) { - winston.error('[plugins] Error executing \'' + hook + '\' in plugin \'' + hookObj.id + '\''); + winston.error(`[plugins] Error executing '${hook}' in plugin '${hookObj.id}'`); winston.error(err.stack); } if (!timedOut) { @@ -198,7 +198,7 @@ async function fireResponseHook(hook, hookList, params) { await async.eachSeries(hookList, async (hookObj) => { if (typeof hookObj.method !== 'function') { if (global.env === 'development') { - winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.'); + winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } return; } diff --git a/src/plugins/index.js b/src/plugins/index.js index 76ba8bf02b..85277fbdc5 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -162,7 +162,7 @@ Plugins.reloadRoutes = async function (params) { }; Plugins.get = async function (id) { - const url = (nconf.get('registry') || 'https://packages.nodebb.org') + '/api/v1/plugins/' + id; + const url = `${nconf.get('registry') || 'https://packages.nodebb.org'}/api/v1/plugins/${id}`; const body = await request(url, { json: true, }); @@ -177,14 +177,14 @@ Plugins.list = async function (matching) { matching = true; } const version = require(paths.currentPackage).version; - const url = (nconf.get('registry') || 'https://packages.nodebb.org') + '/api/v1/plugins' + (matching !== false ? '?version=' + version : ''); + const url = `${nconf.get('registry') || 'https://packages.nodebb.org'}/api/v1/plugins${matching !== false ? `?version=${version}` : ''}`; try { const body = await request(url, { json: true, }); return await Plugins.normalise(body); } catch (err) { - winston.error('Error loading ' + url, err); + winston.error(`Error loading ${url}`, err); return await Plugins.normalise([]); } }; @@ -330,7 +330,7 @@ async function findNodeBBModules(dirs) { return next(); } - pluginPaths.push(dirname + '/' + subdir); + pluginPaths.push(`${dirname}/${subdir}`); next(); }); }, cb); diff --git a/src/plugins/install.js b/src/plugins/install.js index 89ff915484..57419b07df 100644 --- a/src/plugins/install.js +++ b/src/plugins/install.js @@ -101,21 +101,21 @@ module.exports = function (Plugins) { } await runPackageManagerCommandAsync(type, id, version || 'latest'); const pluginData = await Plugins.get(id); - Plugins.hooks.fire('action:plugin.' + type, { id: id, version: version }); + Plugins.hooks.fire(`action:plugin.${type}`, { id: id, version: version }); return pluginData; } function runPackageManagerCommand(command, pkgName, version, callback) { cproc.execFile(packageManagerExecutable, [ packageManagerCommands[packageManager][command], - pkgName + (command === 'install' ? '@' + version : ''), + pkgName + (command === 'install' ? `@${version}` : ''), '--save', ], function (err, stdout) { if (err) { return callback(err); } - winston.verbose('[plugins/' + command + '] ' + stdout); + winston.verbose(`[plugins/${command}] ${stdout}`); callback(); }); } diff --git a/src/plugins/load.js b/src/plugins/load.js index 8977e40900..90858757a9 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -98,7 +98,7 @@ module.exports = function (Plugins) { } }); - winston.verbose('[plugins] loading the following fields from plugin data: ' + fields.join(', ')); + winston.verbose(`[plugins] loading the following fields from plugin data: ${fields.join(', ')}`); const plugins = await Plugins.data.getActive(); await Promise.all(plugins.map(p => registerPluginAssets(p, fields))); }; @@ -123,7 +123,7 @@ module.exports = function (Plugins) { await registerPluginAssets(pluginData); } catch (err) { winston.error(err.stack); - winston.verbose('[plugins] Could not load plugin : ' + pluginData.id); + winston.verbose(`[plugins] Could not load plugin : ${pluginData.id}`); return; } @@ -134,7 +134,7 @@ module.exports = function (Plugins) { }); } - winston.verbose('[plugins] Loaded plugin: ' + pluginData.id); + winston.verbose(`[plugins] Loaded plugin: ${pluginData.id}`); }; function checkVersion(pluginData) { @@ -163,7 +163,7 @@ module.exports = function (Plugins) { pluginData.hooks.forEach(hook => Plugins.hooks.register(pluginData.id, hook)); } } catch (err) { - winston.warn('[plugins] Unable to load library for: ' + pluginData.id); + winston.warn(`[plugins] Unable to load library for: ${pluginData.id}`); throw err; } } diff --git a/src/plugins/usage.js b/src/plugins/usage.js index 78d95c3e35..64117f3daa 100644 --- a/src/plugins/usage.js +++ b/src/plugins/usage.js @@ -24,7 +24,7 @@ module.exports = function (Plugins) { const hash = crypto.createHash('sha256'); hash.update(nconf.get('url')); - request.post((nconf.get('registry') || 'https://packages.nodebb.org') + '/api/v1/plugin/usage', { + request.post(`${nconf.get('registry') || 'https://packages.nodebb.org'}/api/v1/plugin/usage`, { form: { id: hash.digest('hex'), version: pkg.version, @@ -36,7 +36,7 @@ module.exports = function (Plugins) { return winston.error(err.stack); } if (res.statusCode !== 200) { - winston.error('[plugins.submitUsageData] received ' + res.statusCode + ' ' + body); + winston.error(`[plugins.submitUsageData] received ${res.statusCode} ${body}`); } }); }; diff --git a/src/posts/bookmarks.js b/src/posts/bookmarks.js index 51ab7677bd..cab1498f65 100644 --- a/src/posts/bookmarks.js +++ b/src/posts/bookmarks.js @@ -33,15 +33,15 @@ module.exports = function (Posts) { } if (isBookmarking) { - await db.sortedSetAdd('uid:' + uid + ':bookmarks', Date.now(), pid); + await db.sortedSetAdd(`uid:${uid}:bookmarks`, Date.now(), pid); } else { - await db.sortedSetRemove('uid:' + uid + ':bookmarks', pid); + await db.sortedSetRemove(`uid:${uid}:bookmarks`, pid); } - await db[isBookmarking ? 'setAdd' : 'setRemove']('pid:' + pid + ':users_bookmarked', uid); - postData.bookmarks = await db.setCount('pid:' + pid + ':users_bookmarked'); + await db[isBookmarking ? 'setAdd' : 'setRemove'](`pid:${pid}:users_bookmarked`, uid); + postData.bookmarks = await db.setCount(`pid:${pid}:users_bookmarked`); await Posts.setPostField(pid, 'bookmarks', postData.bookmarks); - plugins.hooks.fire('action:post.' + type, { + plugins.hooks.fire(`action:post.${type}`, { pid: pid, uid: uid, owner: postData.uid, @@ -60,9 +60,9 @@ module.exports = function (Posts) { } if (Array.isArray(pid)) { - const sets = pid.map(pid => 'pid:' + pid + ':users_bookmarked'); + const sets = pid.map(pid => `pid:${pid}:users_bookmarked`); return await db.isMemberOfSets(sets, uid); } - return await db.isSetMember('pid:' + pid + ':users_bookmarked', uid); + return await db.isSetMember(`pid:${pid}:users_bookmarked`, uid); }; }; diff --git a/src/posts/category.js b/src/posts/category.js index 8ca44b4145..c2d525c0e9 100644 --- a/src/posts/category.js +++ b/src/posts/category.js @@ -35,7 +35,7 @@ module.exports = function (Posts) { }; async function filterPidsBySingleCid(pids, cid) { - const isMembers = await db.isSortedSetMembers('cid:' + parseInt(cid, 10) + ':pids', pids); + const isMembers = await db.isSortedSetMembers(`cid:${parseInt(cid, 10)}:pids`, pids); return pids.filter((pid, index) => pid && isMembers[index]); } }; diff --git a/src/posts/create.js b/src/posts/create.js index 91da2c2903..c86a2c2fb9 100644 --- a/src/posts/create.js +++ b/src/posts/create.js @@ -49,7 +49,7 @@ module.exports = function (Posts) { let result = await plugins.hooks.fire('filter:post.create', { post: postData, data: data }); postData = result.post; - await db.setObject('post:' + postData.pid, postData); + await db.setObject(`post:${postData.pid}`, postData); const topicData = await topics.getTopicFields(tid, ['cid', 'pinned']); postData.cid = topicData.cid; @@ -76,8 +76,8 @@ module.exports = function (Posts) { return; } await Promise.all([ - db.sortedSetAdd('pid:' + postData.toPid + ':replies', timestamp, postData.pid), - db.incrObjectField('post:' + postData.toPid, 'replies'), + db.sortedSetAdd(`pid:${postData.toPid}:replies`, timestamp, postData.pid), + db.incrObjectField(`post:${postData.toPid}`, 'replies'), ]); } }; diff --git a/src/posts/data.js b/src/posts/data.js index dcd50b32b5..27ea94549a 100644 --- a/src/posts/data.js +++ b/src/posts/data.js @@ -15,7 +15,7 @@ module.exports = function (Posts) { if (!Array.isArray(pids) || !pids.length) { return []; } - const keys = pids.map(pid => 'post:' + pid); + const keys = pids.map(pid => `post:${pid}`); const postData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); const result = await plugins.hooks.fire('filter:post.getFields', { pids: pids, @@ -50,7 +50,7 @@ module.exports = function (Posts) { }; Posts.setPostFields = async function (pid, data) { - await db.setObject('post:' + pid, data); + await db.setObject(`post:${pid}`, data); plugins.hooks.fire('action:post.setFields', { data: { ...data, pid } }); }; }; diff --git a/src/posts/delete.js b/src/posts/delete.js index ed85a73110..5359e54033 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -22,7 +22,7 @@ module.exports = function (Posts) { async function deleteOrRestore(type, pid, uid) { const isDeleting = type === 'delete'; - await plugins.hooks.fire('filter:post.' + type, { pid: pid, uid: uid }); + await plugins.hooks.fire(`filter:post.${type}`, { pid: pid, uid: uid }); await Posts.setPostFields(pid, { deleted: isDeleting ? 1 : 0, deleterUid: isDeleting ? uid : 0, @@ -34,11 +34,11 @@ module.exports = function (Posts) { topics.updateLastPostTimeFromLastPid(postData.tid), topics.updateTeaser(postData.tid), isDeleting ? - db.sortedSetRemove('cid:' + topicData.cid + ':pids', pid) : - db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid), + db.sortedSetRemove(`cid:${topicData.cid}:pids`, pid) : + db.sortedSetAdd(`cid:${topicData.cid}:pids`, postData.timestamp, pid), ]); await categories.updateRecentTidForCid(postData.cid); - plugins.hooks.fire('action:post.' + type, { post: _.clone(postData), uid: uid }); + plugins.hooks.fire(`action:post.${type}`, { post: _.clone(postData), uid: uid }); if (type === 'delete') { await flags.resolveFlag('post', pid, uid); } @@ -65,73 +65,73 @@ module.exports = function (Posts) { ]); await flags.resolveFlag('post', pid, uid); plugins.hooks.fire('action:post.purge', { post: postData, uid: uid }); - await db.delete('post:' + pid); + await db.delete(`post:${pid}`); }; async function deletePostFromTopicUserNotification(postData, topicData) { await db.sortedSetsRemove([ - 'tid:' + postData.tid + ':posts', - 'tid:' + postData.tid + ':posts:votes', - 'uid:' + postData.uid + ':posts', + `tid:${postData.tid}:posts`, + `tid:${postData.tid}:posts:votes`, + `uid:${postData.uid}:posts`, ], postData.pid); const tasks = [ db.decrObjectField('global', 'postCount'), - db.decrObjectField('category:' + topicData.cid, 'post_count'), - db.sortedSetRemove('cid:' + topicData.cid + ':uid:' + postData.uid + ':pids', postData.pid), - db.sortedSetRemove('cid:' + topicData.cid + ':uid:' + postData.uid + ':pids:votes', postData.pid), + db.decrObjectField(`category:${topicData.cid}`, 'post_count'), + db.sortedSetRemove(`cid:${topicData.cid}:uid:${postData.uid}:pids`, postData.pid), + db.sortedSetRemove(`cid:${topicData.cid}:uid:${postData.uid}:pids:votes`, postData.pid), topics.decreasePostCount(postData.tid), topics.updateTeaser(postData.tid), topics.updateLastPostTimeFromLastPid(postData.tid), - db.sortedSetIncrBy('tid:' + postData.tid + ':posters', -1, postData.uid), + db.sortedSetIncrBy(`tid:${postData.tid}:posters`, -1, postData.uid), user.incrementUserPostCountBy(postData.uid, -1), - notifications.rescind('new_post:tid:' + postData.tid + ':pid:' + postData.pid + ':uid:' + postData.uid), + notifications.rescind(`new_post:tid:${postData.tid}:pid:${postData.pid}:uid:${postData.uid}`), ]; if (!topicData.pinned) { - tasks.push(db.sortedSetIncrBy('cid:' + topicData.cid + ':tids:posts', -1, postData.tid)); + tasks.push(db.sortedSetIncrBy(`cid:${topicData.cid}:tids:posts`, -1, postData.tid)); } await Promise.all(tasks); } async function deletePostFromCategoryRecentPosts(postData) { const cids = await categories.getAllCidsFromSet('categories:cid'); - const sets = cids.map(cid => 'cid:' + cid + ':pids'); + const sets = cids.map(cid => `cid:${cid}:pids`); await db.sortedSetsRemove(sets, postData.pid); await categories.updateRecentTidForCid(postData.cid); } async function deletePostFromUsersBookmarks(pid) { - const uids = await db.getSetMembers('pid:' + pid + ':users_bookmarked'); - const sets = uids.map(uid => 'uid:' + uid + ':bookmarks'); + const uids = await db.getSetMembers(`pid:${pid}:users_bookmarked`); + const sets = uids.map(uid => `uid:${uid}:bookmarks`); await db.sortedSetsRemove(sets, pid); - await db.delete('pid:' + pid + ':users_bookmarked'); + await db.delete(`pid:${pid}:users_bookmarked`); } async function deletePostFromUsersVotes(pid) { const [upvoters, downvoters] = await Promise.all([ - db.getSetMembers('pid:' + pid + ':upvote'), - db.getSetMembers('pid:' + pid + ':downvote'), + db.getSetMembers(`pid:${pid}:upvote`), + db.getSetMembers(`pid:${pid}:downvote`), ]); - const upvoterSets = upvoters.map(uid => 'uid:' + uid + ':upvote'); - const downvoterSets = downvoters.map(uid => 'uid:' + uid + ':downvote'); + const upvoterSets = upvoters.map(uid => `uid:${uid}:upvote`); + const downvoterSets = downvoters.map(uid => `uid:${uid}:downvote`); await Promise.all([ db.sortedSetsRemove(upvoterSets.concat(downvoterSets), pid), - db.deleteAll(['pid:' + pid + ':upvote', 'pid:' + pid + ':downvote']), + db.deleteAll([`pid:${pid}:upvote`, `pid:${pid}:downvote`]), ]); } async function deletePostFromReplies(postData) { - const replyPids = await db.getSortedSetMembers('pid:' + postData.pid + ':replies'); + const replyPids = await db.getSortedSetMembers(`pid:${postData.pid}:replies`); const promises = [ db.deleteObjectFields( - replyPids.map(pid => 'post:' + pid), ['toPid'] + replyPids.map(pid => `post:${pid}`), ['toPid'] ), - db.delete('pid:' + postData.pid + ':replies'), + db.delete(`pid:${postData.pid}:replies`), ]; if (parseInt(postData.toPid, 10)) { - promises.push(db.sortedSetRemove('pid:' + postData.toPid + ':replies', postData.pid)); - promises.push(db.decrObjectField('post:' + postData.toPid, 'replies')); + promises.push(db.sortedSetRemove(`pid:${postData.toPid}:replies`, postData.pid)); + promises.push(db.decrObjectField(`post:${postData.toPid}`, 'replies')); } await Promise.all(promises); } @@ -141,7 +141,7 @@ module.exports = function (Posts) { return; } const groupNames = await groups.getUserGroupMembership('groups:visible:createtime', [postData.uid]); - const keys = groupNames[0].map(groupName => 'group:' + groupName + ':member:pids'); + const keys = groupNames[0].map(groupName => `group:${groupName}:member:pids`); await db.sortedSetsRemove(keys, postData.pid); } }; diff --git a/src/posts/diffs.js b/src/posts/diffs.js index 5dc1de9ba5..68816d0853 100644 --- a/src/posts/diffs.js +++ b/src/posts/diffs.js @@ -17,7 +17,7 @@ module.exports = function (Posts) { return false; } - const numDiffs = await db.listLength('post:' + pid + ':diffs'); + const numDiffs = await db.listLength(`post:${pid}:diffs`); return !!numDiffs; }; @@ -29,12 +29,12 @@ module.exports = function (Posts) { // Pass those made after `since`, and create keys const keys = timestamps.filter(t => (parseInt(t, 10) || 0) > since) - .map(t => 'diff:' + pid + '.' + t); + .map(t => `diff:${pid}.${t}`); return await db.getObjects(keys); }; Diffs.list = async function (pid) { - return await db.getListRange('post:' + pid + ':diffs', 0, -1); + return await db.getListRange(`post:${pid}:diffs`, 0, -1); }; Diffs.save = async function (data) { @@ -42,8 +42,8 @@ module.exports = function (Posts) { const now = Date.now(); const patch = diff.createPatch('', newContent, oldContent); await Promise.all([ - db.listPrepend('post:' + pid + ':diffs', now), - db.setObject('diff:' + pid + '.' + now, { + db.listPrepend(`post:${pid}:diffs`, now), + db.setObject(`diff:${pid}.${now}`, { uid: uid, pid: pid, patch: patch, @@ -108,7 +108,7 @@ module.exports = function (Posts) { const timestampToUpdate = newContentIndex + 1; const newContent = newContentIndex < 0 ? postContent : versionContents[timestamps[newContentIndex]]; const patch = diff.createPatch('', newContent, versionContents[timestamps[i]]); - await db.setObject('diff:' + pid + '.' + timestamps[timestampToUpdate], { patch }); + await db.setObject(`diff:${pid}.${timestamps[timestampToUpdate]}`, { patch }); } return Promise.all([ diff --git a/src/posts/edit.js b/src/posts/edit.js index 4c57c2c38e..69e64a63b8 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -76,7 +76,7 @@ module.exports = function (Posts) { await topics.notifyFollowers(returnPostData, data.uid, { type: 'post-edit', bodyShort: translator.compile('notifications:user_edited_post', editor.username, topic.title), - nid: 'edit_post:' + data.pid + ':uid:' + data.uid, + nid: `edit_post:${data.pid}:uid:${data.uid}`, }); plugins.hooks.fire('action:post.edit', { post: _.clone(returnPostData), data: data, uid: data.uid }); @@ -120,7 +120,7 @@ module.exports = function (Posts) { }; if (title) { newTopicData.title = title; - newTopicData.slug = tid + '/' + (slugify(title) || 'topic'); + newTopicData.slug = `${tid}/${slugify(title) || 'topic'}`; } data.tags = data.tags || []; @@ -138,7 +138,7 @@ module.exports = function (Posts) { topic: newTopicData, data: data, }); - await db.setObject('topic:' + tid, results.topic); + await db.setObject(`topic:${tid}`, results.topic); await topics.updateTopicTags(tid, data.tags); const tags = await topics.getTopicTagsObjects(tid); diff --git a/src/posts/index.js b/src/posts/index.js index a145976acd..aed0d85c90 100644 --- a/src/posts/index.js +++ b/src/posts/index.js @@ -30,7 +30,7 @@ require('./uploads')(Posts); Posts.exists = async function (pids) { const isArray = Array.isArray(pids); pids = isArray ? pids : [pids]; - const exists = await db.exists(pids.map(pid => 'post:' + pid)); + const exists = await db.exists(pids.map(pid => `post:${pid}`)); return isArray ? exists : exists[0]; }; @@ -63,7 +63,7 @@ Posts.getPostSummariesFromSet = async function (set, uid, start, stop) { }; Posts.getPidIndex = async function (pid, tid, topicPostSort) { - const set = topicPostSort === 'most_votes' ? 'tid:' + tid + ':posts:votes' : 'tid:' + tid + ':posts'; + const set = topicPostSort === 'most_votes' ? `tid:${tid}:posts:votes` : `tid:${tid}:posts`; const reverse = topicPostSort === 'newest_to_oldest' || topicPostSort === 'most_votes'; const index = await db[reverse ? 'sortedSetRevRank' : 'sortedSetRank'](set, pid); if (!utils.isNumber(index)) { @@ -79,7 +79,7 @@ Posts.getPostIndices = async function (posts, uid) { const settings = await user.getSettings(uid); const byVotes = settings.topicPostSort === 'most_votes'; - let sets = posts.map(p => (byVotes ? 'tid:' + p.tid + ':posts:votes' : 'tid:' + p.tid + ':posts')); + let sets = posts.map(p => (byVotes ? `tid:${p.tid}:posts:votes` : `tid:${p.tid}:posts`)); const reverse = settings.topicPostSort === 'newest_to_oldest' || settings.topicPostSort === 'most_votes'; const uniqueSets = _.uniq(sets); diff --git a/src/posts/parse.js b/src/posts/parse.js index 131b47e221..ef2d9b8f5c 100644 --- a/src/posts/parse.js +++ b/src/posts/parse.js @@ -91,7 +91,7 @@ module.exports = function (Posts) { absolute = nconf.get('base_url') + current[1]; } else { // External link - absolute = '//' + current[1]; + absolute = `//${current[1]}`; } content = content.slice(0, current.index + regex.length) + absolute + content.slice(current.index + regex.length + current[1].length); diff --git a/src/posts/queue.js b/src/posts/queue.js index 58c8e5c140..bd24811ebc 100644 --- a/src/posts/queue.js +++ b/src/posts/queue.js @@ -51,7 +51,7 @@ module.exports = function (Posts) { } async function removeQueueNotification(id) { - await notifications.rescind('post-queue-' + id); + await notifications.rescind(`post-queue-${id}`); const data = await getParsedObject(id); if (!data) { return; @@ -72,7 +72,7 @@ module.exports = function (Posts) { Posts.addToQueue = async function (data) { const type = getType(data); const now = Date.now(); - const id = type + '-' + now; + const id = `${type}-${now}`; await canPost(type, data); let payload = { @@ -85,14 +85,14 @@ module.exports = function (Posts) { payload.data = JSON.stringify(data); await db.sortedSetAdd('post:queue', now, id); - await db.setObject('post:queue:' + id, payload); + await db.setObject(`post:queue:${id}`, payload); await user.setUserField(data.uid, 'lastqueuetime', now); const cid = await getCid(type, data); const uids = await getNotificationUids(cid); const notifObj = await notifications.create({ type: 'post-queue', - nid: 'post-queue-' + id, + nid: `post-queue-${id}`, mergeId: 'post-queue', bodyShort: '[[notifications:post_awaiting_review]]', bodyLong: data.content, @@ -143,7 +143,7 @@ module.exports = function (Posts) { Posts.removeFromQueue = async function (id) { await removeQueueNotification(id); await db.sortedSetRemove('post:queue', id); - await db.delete('post:queue:' + id); + await db.delete(`post:queue:${id}`); }; Posts.submitFromQueue = async function (id) { @@ -160,7 +160,7 @@ module.exports = function (Posts) { }; async function getParsedObject(id) { - const data = await db.getObject('post:queue:' + id); + const data = await db.getObject(`post:queue:${id}`); if (!data) { return null; } @@ -202,7 +202,7 @@ module.exports = function (Posts) { if (editData.cid !== undefined) { data.data.cid = editData.cid; } - await db.setObjectField('post:queue:' + editData.id, 'data', JSON.stringify(data.data)); + await db.setObjectField(`post:queue:${editData.id}`, 'data', JSON.stringify(data.data)); }; Posts.canEditQueue = async function (uid, editData) { diff --git a/src/posts/topics.js b/src/posts/topics.js index 973973686a..7fc5d1ec50 100644 --- a/src/posts/topics.js +++ b/src/posts/topics.js @@ -42,7 +42,7 @@ module.exports = function (Posts) { const postIndex = utils.isNumber(indices[index]) ? parseInt(indices[index], 10) + 1 : null; if (slug && postIndex) { - return '/topic/' + slug + '/' + postIndex; + return `/topic/${slug}/${postIndex}`; } return null; }); diff --git a/src/posts/uploads.js b/src/posts/uploads.js index dbfa325168..397e8b33a1 100644 --- a/src/posts/uploads.js +++ b/src/posts/uploads.js @@ -57,12 +57,12 @@ module.exports = function (Posts) { }; Posts.uploads.list = async function (pid) { - return await db.getSortedSetMembers('post:' + pid + ':uploads'); + return await db.getSortedSetMembers(`post:${pid}:uploads`); }; Posts.uploads.listWithSizes = async function (pid) { const paths = await Posts.uploads.list(pid); - const sizes = await db.getObjects(paths.map(path => 'upload:' + md5(path))) || []; + const sizes = await db.getObjects(paths.map(path => `upload:${md5(path)}`)) || []; return sizes.map((sizeObj, idx) => ({ ...sizeObj, @@ -71,7 +71,7 @@ module.exports = function (Posts) { }; Posts.uploads.isOrphan = async function (filePath) { - const length = await db.sortedSetCard('upload:' + md5(filePath) + ':pids'); + const length = await db.sortedSetCard(`upload:${md5(filePath)}:pids`); return length === 0; }; @@ -81,7 +81,7 @@ module.exports = function (Posts) { filePaths = [filePaths]; } - const keys = filePaths.map(fileObj => 'upload:' + md5(fileObj.name.replace('-resized', '')) + ':pids'); + const keys = filePaths.map(fileObj => `upload:${md5(fileObj.name.replace('-resized', ''))}:pids`); return await Promise.all(keys.map(k => db.getSortedSetRange(k, 0, -1))); }; @@ -96,9 +96,9 @@ module.exports = function (Posts) { const now = Date.now(); const scores = filePaths.map(() => now); - const bulkAdd = filePaths.map(path => ['upload:' + md5(path) + ':pids', now, pid]); + const bulkAdd = filePaths.map(path => [`upload:${md5(path)}:pids`, now, pid]); await Promise.all([ - db.sortedSetAdd('post:' + pid + ':uploads', scores, filePaths), + db.sortedSetAdd(`post:${pid}:uploads`, scores, filePaths), db.sortedSetAddBulk(bulkAdd), Posts.uploads.saveSize(filePaths), ]); @@ -111,9 +111,9 @@ module.exports = function (Posts) { return; } - const bulkRemove = filePaths.map(path => ['upload:' + md5(path) + ':pids', pid]); + const bulkRemove = filePaths.map(path => [`upload:${md5(path)}:pids`, pid]); await Promise.all([ - db.sortedSetRemove('post:' + pid + ':uploads', filePaths), + db.sortedSetRemove(`post:${pid}:uploads`, filePaths), db.sortedSetRemoveBulk(bulkRemove), ]); }; @@ -131,13 +131,13 @@ module.exports = function (Posts) { await Promise.all(filePaths.map(async function (fileName) { try { const size = await image.size(path.join(pathPrefix, fileName)); - winston.verbose('[posts/uploads/' + fileName + '] Saving size'); - await db.setObject('upload:' + md5(fileName), { + winston.verbose(`[posts/uploads/${fileName}] Saving size`); + await db.setObject(`upload:${md5(fileName)}`, { width: size.width, height: size.height, }); } catch (err) { - winston.error('[posts/uploads] Error while saving post upload sizes (' + fileName + '): ' + err.message); + winston.error(`[posts/uploads] Error while saving post upload sizes (${fileName}): ${err.message}`); } })); }; diff --git a/src/posts/user.js b/src/posts/user.js index fef2eadd58..d880c01f89 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -142,21 +142,21 @@ module.exports = function (Posts) { postData.forEach((post, i) => { post.cid = cids[i]; repChange += post.votes; - bulkRemove.push(['uid:' + post.uid + ':posts', post.pid]); - bulkRemove.push(['cid:' + post.cid + ':uid:' + post.uid + ':pids', post.pid]); - bulkRemove.push(['cid:' + post.cid + ':uid:' + post.uid + ':pids:votes', post.pid]); + bulkRemove.push([`uid:${post.uid}:posts`, post.pid]); + bulkRemove.push([`cid:${post.cid}:uid:${post.uid}:pids`, post.pid]); + bulkRemove.push([`cid:${post.cid}:uid:${post.uid}:pids:votes`, post.pid]); - bulkAdd.push(['uid:' + toUid + ':posts', post.timestamp, post.pid]); - bulkAdd.push(['cid:' + post.cid + ':uid:' + toUid + ':pids', post.timestamp, post.pid]); + bulkAdd.push([`uid:${toUid}:posts`, post.timestamp, post.pid]); + bulkAdd.push([`cid:${post.cid}:uid:${toUid}:pids`, post.timestamp, post.pid]); if (post.votes > 0) { - bulkAdd.push(['cid:' + post.cid + ':uid:' + toUid + ':pids:votes', post.votes, post.pid]); + bulkAdd.push([`cid:${post.cid}:uid:${toUid}:pids:votes`, post.votes, post.pid]); } postsByUser[post.uid] = postsByUser[post.uid] || []; postsByUser[post.uid].push(post); }); await Promise.all([ - db.setObjectField(pids.map(pid => 'post:' + pid), 'uid', toUid), + db.setObjectField(pids.map(pid => `post:${pid}`), 'uid', toUid), db.sortedSetRemoveBulk(bulkRemove), db.sortedSetAddBulk(bulkAdd), user.incrementUserPostCountBy(toUid, pids.length), @@ -187,9 +187,9 @@ module.exports = function (Posts) { const postsByTopic = _.groupBy(postData, p => parseInt(p.tid, 10)); await async.eachOf(postsByTopic, async function (posts, tid) { const postsByUser = _.groupBy(posts, p => parseInt(p.uid, 10)); - await db.sortedSetIncrBy('tid:' + tid + ':posters', posts.length, toUid); + await db.sortedSetIncrBy(`tid:${tid}:posters`, posts.length, toUid); await async.eachOf(postsByUser, async function (posts, uid) { - await db.sortedSetIncrBy('tid:' + tid + ':posters', -posts.length, uid); + await db.sortedSetIncrBy(`tid:${tid}:posters`, -posts.length, uid); }); }); } @@ -210,17 +210,17 @@ module.exports = function (Posts) { const bulkRemove = []; const postsByUser = {}; mainPosts.forEach((post) => { - bulkRemove.push(['cid:' + post.cid + ':uid:' + post.uid + ':tids', post.tid]); - bulkRemove.push(['uid:' + post.uid + ':topics', post.tid]); + bulkRemove.push([`cid:${post.cid}:uid:${post.uid}:tids`, post.tid]); + bulkRemove.push([`uid:${post.uid}:topics`, post.tid]); - bulkAdd.push(['cid:' + post.cid + ':uid:' + toUid + ':tids', tidToTopic[post.tid].timestamp, post.tid]); - bulkAdd.push(['uid:' + toUid + ':topics', tidToTopic[post.tid].timestamp, post.tid]); + bulkAdd.push([`cid:${post.cid}:uid:${toUid}:tids`, tidToTopic[post.tid].timestamp, post.tid]); + bulkAdd.push([`uid:${toUid}:topics`, tidToTopic[post.tid].timestamp, post.tid]); postsByUser[post.uid] = postsByUser[post.uid] || []; postsByUser[post.uid].push(post); }); await Promise.all([ - db.setObjectField(mainPosts.map(p => 'topic:' + p.tid), 'uid', toUid), + db.setObjectField(mainPosts.map(p => `topic:${p.tid}`), 'uid', toUid), db.sortedSetRemoveBulk(bulkRemove), db.sortedSetAddBulk(bulkAdd), user.incrementUserFieldBy(toUid, 'topiccount', mainPosts.length), diff --git a/src/posts/votes.js b/src/posts/votes.js index 81f340b314..60bbe6361a 100644 --- a/src/posts/votes.js +++ b/src/posts/votes.js @@ -73,7 +73,7 @@ module.exports = function (Posts) { if (parseInt(uid, 10) <= 0) { return { upvoted: false, downvoted: false }; } - const hasVoted = await db.isMemberOfSets(['pid:' + pid + ':upvote', 'pid:' + pid + ':downvote'], uid); + const hasVoted = await db.isMemberOfSets([`pid:${pid}:upvote`, `pid:${pid}:downvote`], uid); return { upvoted: hasVoted[0], downvoted: hasVoted[1] }; }; @@ -82,8 +82,8 @@ module.exports = function (Posts) { const data = pids.map(() => false); return { upvotes: data, downvotes: data }; } - const upvoteSets = pids.map(pid => 'pid:' + pid + ':upvote'); - const downvoteSets = pids.map(pid => 'pid:' + pid + ':downvote'); + const upvoteSets = pids.map(pid => `pid:${pid}:upvote`); + const downvoteSets = pids.map(pid => `pid:${pid}:downvote`); const data = await db.isMemberOfSets(upvoteSets.concat(downvoteSets), uid); return { upvotes: data.slice(0, pids.length), @@ -92,7 +92,7 @@ module.exports = function (Posts) { }; Posts.getUpvotedUidsByPids = async function (pids) { - return await db.getSetsMembers(pids.map(pid => 'pid:' + pid + ':upvote')); + return await db.getSetsMembers(pids.map(pid => `pid:${pid}:upvote`)); }; function voteInProgress(pid, uid) { @@ -144,7 +144,7 @@ module.exports = function (Posts) { current = 'unvote'; } - plugins.hooks.fire('action:post.' + hook, { + plugins.hooks.fire(`action:post.${hook}`, { pid: pid, uid: uid, owner: owner, @@ -164,7 +164,7 @@ module.exports = function (Posts) { user.getUserField(uid, 'reputation'), Posts.getPostField(pid, 'uid'), db.getSortedSetRevRangeByScore( - 'uid:' + uid + ':downvote', 0, -1, '+inf', Date.now() - oneDay + `uid:${uid}:downvote`, 0, -1, '+inf', Date.now() - oneDay ), ]); @@ -173,14 +173,14 @@ module.exports = function (Posts) { } if (meta.config.downvotesPerDay && downvotedPids.length >= meta.config.downvotesPerDay) { - throw new Error('[[error:too-many-downvotes-today, ' + meta.config.downvotesPerDay + ']]'); + throw new Error(`[[error:too-many-downvotes-today, ${meta.config.downvotesPerDay}]]`); } if (meta.config.downvotesPerUserPerDay) { const postData = await Posts.getPostsFields(downvotedPids, ['uid']); const targetDownvotes = postData.filter(p => p.uid === targetUid).length; if (targetDownvotes >= meta.config.downvotesPerUserPerDay) { - throw new Error('[[error:too-many-downvotes-today-user, ' + meta.config.downvotesPerUserPerDay + ']]'); + throw new Error(`[[error:too-many-downvotes-today-user, ${meta.config.downvotesPerUserPerDay}]]`); } } } @@ -193,15 +193,15 @@ module.exports = function (Posts) { const now = Date.now(); if (type === 'upvote' && !unvote) { - await db.sortedSetAdd('uid:' + uid + ':upvote', now, pid); + await db.sortedSetAdd(`uid:${uid}:upvote`, now, pid); } else { - await db.sortedSetRemove('uid:' + uid + ':upvote', pid); + await db.sortedSetRemove(`uid:${uid}:upvote`, pid); } if (type === 'upvote' || unvote) { - await db.sortedSetRemove('uid:' + uid + ':downvote', pid); + await db.sortedSetRemove(`uid:${uid}:downvote`, pid); } else { - await db.sortedSetAdd('uid:' + uid + ':downvote', now, pid); + await db.sortedSetAdd(`uid:${uid}:downvote`, now, pid); } const postData = await Posts.getPostFields(pid, ['pid', 'uid', 'tid']); @@ -223,15 +223,15 @@ module.exports = function (Posts) { async function adjustPostVotes(postData, uid, type, unvote) { const notType = (type === 'upvote' ? 'downvote' : 'upvote'); if (unvote) { - await db.setRemove('pid:' + postData.pid + ':' + type, uid); + await db.setRemove(`pid:${postData.pid}:${type}`, uid); } else { - await db.setAdd('pid:' + postData.pid + ':' + type, uid); + await db.setAdd(`pid:${postData.pid}:${type}`, uid); } - await db.setRemove('pid:' + postData.pid + ':' + notType, uid); + await db.setRemove(`pid:${postData.pid}:${notType}`, uid); const [upvotes, downvotes] = await Promise.all([ - db.setCount('pid:' + postData.pid + ':upvote'), - db.setCount('pid:' + postData.pid + ':downvote'), + db.setCount(`pid:${postData.pid}:upvote`), + db.setCount(`pid:${postData.pid}:downvote`), ]); postData.upvotes = upvotes; postData.downvotes = downvotes; @@ -259,14 +259,14 @@ module.exports = function (Posts) { if (postData.uid) { if (postData.votes > 0) { - await db.sortedSetAdd('cid:' + topicData.cid + ':uid:' + postData.uid + ':pids:votes', postData.votes, postData.pid); + await db.sortedSetAdd(`cid:${topicData.cid}:uid:${postData.uid}:pids:votes`, postData.votes, postData.pid); } else { - await db.sortedSetRemove('cid:' + topicData.cid + ':uid:' + postData.uid + ':pids:votes', postData.pid); + await db.sortedSetRemove(`cid:${topicData.cid}:uid:${postData.uid}:pids:votes`, postData.pid); } } if (parseInt(topicData.mainPid, 10) !== parseInt(postData.pid, 10)) { - return await db.sortedSetAdd('tid:' + postData.tid + ':posts:votes', postData.votes, postData.pid); + return await db.sortedSetAdd(`tid:${postData.tid}:posts:votes`, postData.votes, postData.pid); } const promises = [ topics.setTopicFields(postData.tid, { @@ -276,7 +276,7 @@ module.exports = function (Posts) { db.sortedSetAdd('topics:votes', postData.votes, postData.tid), ]; if (!topicData.pinned) { - promises.push(db.sortedSetAdd('cid:' + topicData.cid + ':tids:votes', postData.votes, postData.tid)); + promises.push(db.sortedSetAdd(`cid:${topicData.cid}:tids:votes`, postData.votes, postData.tid)); } await Promise.all(promises); } diff --git a/src/prestart.js b/src/prestart.js index ed61e28c16..7d4bc32092 100644 --- a/src/prestart.js +++ b/src/prestart.js @@ -23,8 +23,8 @@ function setupWinston() { formats.push(winston.format.json()); } else { const timestampFormat = winston.format((info) => { - var dateString = new Date().toISOString() + ' [' + nconf.get('port') + '/' + global.process.pid + ']'; - info.level = dateString + ' - ' + info.level; + var dateString = `${new Date().toISOString()} [${nconf.get('port')}/${global.process.pid}]`; + info.level = `${dateString} - ${info.level}`; return info; }); formats.push(timestampFormat()); @@ -90,7 +90,7 @@ function loadConfig(configFile) { // Parse out the relative_url and other goodies from the configured URL const urlObject = url.parse(nconf.get('url')); const relativePath = urlObject.pathname !== '/' ? urlObject.pathname.replace(/\/+$/, '') : ''; - nconf.set('base_url', urlObject.protocol + '//' + urlObject.host); + nconf.set('base_url', `${urlObject.protocol}//${urlObject.host}`); nconf.set('secure', urlObject.protocol === 'https:'); nconf.set('use_port', !!urlObject.port); nconf.set('relative_path', relativePath); @@ -111,7 +111,7 @@ function versionCheck() { if (!compatible) { winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.'); - winston.warn('Recommended ' + range.green + ', '.reset + version.yellow + ' provided\n'.reset); + winston.warn(`Recommended ${range.green}${', '.reset}${version.yellow}${' provided\n'.reset}`); } } diff --git a/src/privileges/admin.js b/src/privileges/admin.js index 004d3e862a..268b338985 100644 --- a/src/privileges/admin.js +++ b/src/privileges/admin.js @@ -34,7 +34,7 @@ module.exports = function (privileges) { 'admin:settings', ]; - privileges.admin.groupPrivilegeList = privileges.admin.userPrivilegeList.map(privilege => 'groups:' + privilege); + privileges.admin.groupPrivilegeList = privileges.admin.userPrivilegeList.map(privilege => `groups:${privilege}`); // Mapping for a page route (via direct match or regexp) to a privilege privileges.admin.routeMap = { diff --git a/src/privileges/categories.js b/src/privileges/categories.js index 923306eb55..8c541e7c1a 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -171,7 +171,7 @@ module.exports = function (privileges) { privileges.categories.userPrivileges = async function (cid, uid) { const tasks = {}; privileges.userPrivilegeList.forEach(function (privilege) { - tasks[privilege] = groups.isMember(uid, 'cid:' + cid + ':privileges:' + privilege); + tasks[privilege] = groups.isMember(uid, `cid:${cid}:privileges:${privilege}`); }); return await utils.promiseParallel(tasks); }; @@ -179,7 +179,7 @@ module.exports = function (privileges) { privileges.categories.groupPrivileges = async function (cid, groupName) { const tasks = {}; privileges.groupPrivilegeList.forEach(function (privilege) { - tasks[privilege] = groups.isMember(groupName, 'cid:' + cid + ':privileges:' + privilege); + tasks[privilege] = groups.isMember(groupName, `cid:${cid}:privileges:${privilege}`); }); return await utils.promiseParallel(tasks); }; diff --git a/src/privileges/global.js b/src/privileges/global.js index ed665e3168..fe39dc11a2 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -48,7 +48,7 @@ module.exports = function (privileges) { 'view:users:info', ]; - privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(privilege => 'groups:' + privilege); + privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(privilege => `groups:${privilege}`); privileges.global.list = async function () { async function getLabels() { @@ -96,7 +96,7 @@ module.exports = function (privileges) { }; privileges.global.canGroup = async function (privilege, groupName) { - return await groups.isMember(groupName, 'cid:0:privileges:groups:' + privilege); + return await groups.isMember(groupName, `cid:0:privileges:groups:${privilege}`); }; privileges.global.give = async function (privileges, groupName) { @@ -118,7 +118,7 @@ module.exports = function (privileges) { privileges.global.userPrivileges = async function (uid) { const tasks = {}; privileges.global.userPrivilegeList.forEach(function (privilege) { - tasks[privilege] = groups.isMember(uid, 'cid:0:privileges:' + privilege); + tasks[privilege] = groups.isMember(uid, `cid:0:privileges:${privilege}`); }); return await utils.promiseParallel(tasks); }; @@ -126,7 +126,7 @@ module.exports = function (privileges) { privileges.global.groupPrivileges = async function (groupName) { const tasks = {}; privileges.global.groupPrivilegeList.forEach(function (privilege) { - tasks[privilege] = groups.isMember(groupName, 'cid:0:privileges:' + privilege); + tasks[privilege] = groups.isMember(groupName, `cid:0:privileges:${privilege}`); }); return await utils.promiseParallel(tasks); }; diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js index ca2b0e0788..4aaf1c72c1 100644 --- a/src/privileges/helpers.js +++ b/src/privileges/helpers.js @@ -18,8 +18,8 @@ const uidToSystemGroup = { helpers.isUsersAllowedTo = async function (privilege, uids, cid) { const [hasUserPrivilege, hasGroupPrivilege] = await Promise.all([ - groups.isMembers(uids, 'cid:' + cid + ':privileges:' + privilege), - groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:' + privilege), + groups.isMembers(uids, `cid:${cid}:privileges:${privilege}`), + groups.isMembersOfGroupList(uids, `cid:${cid}:privileges:groups:${privilege}`), ]); const allowed = uids.map((uid, index) => hasUserPrivilege[index] || hasGroupPrivilege[index]); const result = await plugins.hooks.fire('filter:privileges:isUsersAllowedTo', { allowed: allowed, privilege: privilege, uids: uids, cid: cid }); @@ -45,7 +45,7 @@ async function isAllowedToCids(privilege, uidOrGroupName, cids) { return cids.map(() => false); } - const groupKeys = cids.map(cid => 'cid:' + cid + ':privileges:groups:' + privilege); + const groupKeys = cids.map(cid => `cid:${cid}:privileges:groups:${privilege}`); // Group handling if (isNaN(parseInt(uidOrGroupName, 10)) && (uidOrGroupName || '').length) { @@ -57,12 +57,12 @@ async function isAllowedToCids(privilege, uidOrGroupName, cids) { return await isSystemGroupAllowedToCids(privilege, uidOrGroupName, cids); } - const userKeys = cids.map(cid => 'cid:' + cid + ':privileges:' + privilege); + const userKeys = cids.map(cid => `cid:${cid}:privileges:${privilege}`); return await checkIfAllowedUser(uidOrGroupName, userKeys, groupKeys); } async function isAllowedToPrivileges(privileges, uidOrGroupName, cid) { - const groupKeys = privileges.map(privilege => 'cid:' + cid + ':privileges:groups:' + privilege); + const groupKeys = privileges.map(privilege => `cid:${cid}:privileges:groups:${privilege}`); // Group handling if (isNaN(parseInt(uidOrGroupName, 10)) && (uidOrGroupName || '').length) { return await checkIfAllowedGroup(uidOrGroupName, groupKeys); @@ -73,7 +73,7 @@ async function isAllowedToPrivileges(privileges, uidOrGroupName, cid) { return await isSystemGroupAllowedToPrivileges(privileges, uidOrGroupName, cid); } - const userKeys = privileges.map(privilege => 'cid:' + cid + ':privileges:' + privilege); + const userKeys = privileges.map(privilege => `cid:${cid}:privileges:${privilege}`); return await checkIfAllowedUser(uidOrGroupName, userKeys, groupKeys); } @@ -94,17 +94,17 @@ async function checkIfAllowedGroup(groupName, groupKeys) { } async function isSystemGroupAllowedToCids(privilege, uid, cids) { - const groupKeys = cids.map(cid => 'cid:' + cid + ':privileges:groups:' + privilege); + const groupKeys = cids.map(cid => `cid:${cid}:privileges:groups:${privilege}`); return await groups.isMemberOfGroups(uidToSystemGroup[uid], groupKeys); } async function isSystemGroupAllowedToPrivileges(privileges, uid, cid) { - const groupKeys = privileges.map(privilege => 'cid:' + cid + ':privileges:groups:' + privilege); + const groupKeys = privileges.map(privilege => `cid:${cid}:privileges:groups:${privilege}`); return await groups.isMemberOfGroups(uidToSystemGroup[uid], groupKeys); } helpers.getUserPrivileges = async function (cid, userPrivileges) { - let memberSets = await groups.getMembersOfGroups(userPrivileges.map(privilege => 'cid:' + cid + ':privileges:' + privilege)); + let memberSets = await groups.getMembersOfGroups(userPrivileges.map(privilege => `cid:${cid}:privileges:${privilege}`)); memberSets = memberSets.map(function (set) { return set.map(uid => parseInt(uid, 10)); }); @@ -124,7 +124,7 @@ helpers.getUserPrivileges = async function (cid, userPrivileges) { helpers.getGroupPrivileges = async function (cid, groupPrivileges) { const [memberSets, allGroupNames] = await Promise.all([ - groups.getMembersOfGroups(groupPrivileges.map(privilege => 'cid:' + cid + ':privileges:' + privilege)), + groups.getMembersOfGroups(groupPrivileges.map(privilege => `cid:${cid}:privileges:${privilege}`)), groups.getGroups('groups:createtime', 0, -1), ]); @@ -177,7 +177,7 @@ helpers.giveOrRescind = async function (method, privileges, cids, members) { const groupKeys = []; cids.forEach((cid) => { privileges.forEach((privilege) => { - groupKeys.push('cid:' + cid + ':privileges:' + privilege); + groupKeys.push(`cid:${cid}:privileges:${privilege}`); }); }); /* eslint-disable no-await-in-loop */ diff --git a/src/privileges/index.js b/src/privileges/index.js index ff98c342a9..afaeced3d3 100644 --- a/src/privileges/index.js +++ b/src/privileges/index.js @@ -38,7 +38,7 @@ privileges.userPrivilegeList = [ 'moderate', ]; -privileges.groupPrivilegeList = privileges.userPrivilegeList.map(privilege => 'groups:' + privilege); +privileges.groupPrivilegeList = privileges.userPrivilegeList.map(privilege => `groups:${privilege}`); privileges.privilegeList = privileges.userPrivilegeList.concat(privileges.groupPrivilegeList); diff --git a/src/privileges/posts.js b/src/privileges/posts.js index c7ab882aed..5534d7c822 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -126,10 +126,10 @@ module.exports = function (privileges) { } if (!results.isMod && meta.config.postEditDuration && (Date.now() - results.postData.timestamp > meta.config.postEditDuration * 1000)) { - return { flag: false, message: '[[error:post-edit-duration-expired, ' + meta.config.postEditDuration + ']]' }; + return { flag: false, message: `[[error:post-edit-duration-expired, ${meta.config.postEditDuration}]]` }; } if (!results.isMod && meta.config.newbiePostEditDuration > 0 && meta.config.newbiePostDelayThreshold > results.userData.reputation && Date.now() - results.postData.timestamp > meta.config.newbiePostEditDuration * 1000) { - return { flag: false, message: '[[error:post-edit-duration-expired, ' + meta.config.newbiePostEditDuration + ']]' }; + return { flag: false, message: `[[error:post-edit-duration-expired, ${meta.config.newbiePostEditDuration}]]` }; } const isLocked = await topics.isLocked(results.postData.tid); @@ -168,7 +168,7 @@ module.exports = function (privileges) { var postDeleteDuration = meta.config.postDeleteDuration; if (!results.isMod && postDeleteDuration && (Date.now() - postData.timestamp > postDeleteDuration * 1000)) { - return { flag: false, message: '[[error:post-delete-duration-expired, ' + meta.config.postDeleteDuration + ']]' }; + return { flag: false, message: `[[error:post-delete-duration-expired, ${meta.config.postDeleteDuration}]]` }; } var deleterUid = postData.deleterUid; var flag = results['posts:delete'] && ((results.isOwner && (deleterUid === 0 || deleterUid === postData.uid)) || results.isMod); diff --git a/src/privileges/topics.js b/src/privileges/topics.js index ff5890740c..5731f51e5c 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -131,7 +131,7 @@ module.exports = function (privileges) { const preventTopicDeleteAfterReplies = meta.config.preventTopicDeleteAfterReplies; if (!isModerator && preventTopicDeleteAfterReplies && (topicData.postcount - 1) >= preventTopicDeleteAfterReplies) { const langKey = preventTopicDeleteAfterReplies > 1 ? - '[[error:cant-delete-topic-has-replies, ' + meta.config.preventTopicDeleteAfterReplies + ']]' : + `[[error:cant-delete-topic-has-replies, ${meta.config.preventTopicDeleteAfterReplies}]]` : '[[error:cant-delete-topic-has-reply]]'; throw new Error(langKey); } diff --git a/src/privileges/users.js b/src/privileges/users.js index 4c40f3a3f7..7a1488ebfc 100644 --- a/src/privileges/users.js +++ b/src/privileges/users.js @@ -53,8 +53,8 @@ module.exports = function (privileges) { async function isModeratorsOfCategory(cid, uids) { const [check1, check2, check3] = await Promise.all([ privileges.users.isGlobalModerator(uids), - groups.isMembers(uids, 'cid:' + cid + ':privileges:moderate'), - groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:moderate'), + groups.isMembers(uids, `cid:${cid}:privileges:moderate`), + groups.isMembersOfGroupList(uids, `cid:${cid}:privileges:groups:moderate`), ]); const isModerator = uids.map((uid, idx) => check1[idx] || check2[idx] || check3[idx]); return await filterIsModerator(cid, uids, isModerator); diff --git a/src/rewards/admin.js b/src/rewards/admin.js index a2566768b3..48ba9e6b78 100644 --- a/src/rewards/admin.js +++ b/src/rewards/admin.js @@ -18,8 +18,8 @@ rewards.save = async function (data) { } await rewards.delete(data); await db.setAdd('rewards:list', data.id); - await db.setObject('rewards:id:' + data.id, data); - await db.setObject('rewards:id:' + data.id + ':rewards', rewardsData); + await db.setObject(`rewards:id:${data.id}`, data); + await db.setObject(`rewards:id:${data.id}:rewards`, rewardsData); } await Promise.all(data.map(data => save(data))); @@ -29,8 +29,8 @@ rewards.save = async function (data) { rewards.delete = async function (data) { await Promise.all([ db.setRemove('rewards:list', data.id), - db.delete('rewards:id:' + data.id), - db.delete('rewards:id:' + data.id + ':rewards'), + db.delete(`rewards:id:${data.id}`), + db.delete(`rewards:id:${data.id}:rewards`), ]); }; @@ -56,14 +56,14 @@ async function saveConditions(data) { await db.setAdd('conditions:active', conditions); - await Promise.all(Object.keys(rewardsPerCondition).map(c => db.setAdd('condition:' + c + ':rewards', rewardsPerCondition[c]))); + await Promise.all(Object.keys(rewardsPerCondition).map(c => db.setAdd(`condition:${c}:rewards`, rewardsPerCondition[c]))); } async function getActiveRewards() { async function load(id) { const [main, rewards] = await Promise.all([ - db.getObject('rewards:id:' + id), - db.getObject('rewards:id:' + id + ':rewards'), + db.getObject(`rewards:id:${id}`), + db.getObject(`rewards:id:${id}:rewards`), ]); if (main) { main.disabled = main.disabled === 'true'; diff --git a/src/rewards/index.js b/src/rewards/index.js index 19d25168e3..9468ff8696 100644 --- a/src/rewards/index.js +++ b/src/rewards/index.js @@ -30,11 +30,11 @@ async function isConditionActive(condition) { } async function getIDsByCondition(condition) { - return await db.getSetMembers('condition:' + condition + ':rewards'); + return await db.getSetMembers(`condition:${condition}:rewards`); } async function filterCompletedRewards(uid, rewards) { - const data = await db.getSortedSetRangeByScoreWithScores('uid:' + uid + ':rewards', 0, -1, 1, '+inf'); + const data = await db.getSortedSetRangeByScoreWithScores(`uid:${uid}:rewards`, 0, -1, 1, '+inf'); const userRewards = {}; data.forEach(function (obj) { @@ -52,11 +52,11 @@ async function filterCompletedRewards(uid, rewards) { } async function getRewardDataByIDs(ids) { - return await db.getObjects(ids.map(id => 'rewards:id:' + id)); + return await db.getObjects(ids.map(id => `rewards:id:${id}`)); } async function getRewardsByRewardData(rewards) { - return await db.getObjects(rewards.map(reward => 'rewards:id:' + reward.id + ':rewards')); + return await db.getObjects(rewards.map(reward => `rewards:id:${reward.id}:rewards`)); } async function checkCondition(reward, method) { @@ -64,7 +64,7 @@ async function checkCondition(reward, method) { method = util.promisify(method); } const value = await method(); - const bool = await plugins.hooks.fire('filter:rewards.checkConditional:' + reward.conditional, { left: value, right: reward.value }); + const bool = await plugins.hooks.fire(`filter:rewards.checkConditional:${reward.conditional}`, { left: value, right: reward.value }); return bool; } @@ -72,8 +72,8 @@ async function giveRewards(uid, rewards) { const rewardData = await getRewardsByRewardData(rewards); for (let i = 0; i < rewards.length; i++) { /* eslint-disable no-await-in-loop */ - await plugins.hooks.fire('action:rewards.award:' + rewards[i].rid, { uid: uid, reward: rewardData[i] }); - await db.sortedSetIncrBy('uid:' + uid + ':rewards', 1, rewards[i].id); + await plugins.hooks.fire(`action:rewards.award:${rewards[i].rid}`, { uid: uid, reward: rewardData[i] }); + await db.sortedSetIncrBy(`uid:${uid}:rewards`, 1, rewards[i].id); } } diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 9831d72677..914bf10485 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -93,7 +93,7 @@ Auth.reloadRoutes = async function (params) { try { loginStrategies = await plugins.hooks.fire('filter:auth.init', loginStrategies); } catch (err) { - winston.error('[authentication] ' + err.stack); + winston.error(`[authentication] ${err.stack}`); } loginStrategies = loginStrategies || []; loginStrategies.forEach(function (strategy) { diff --git a/src/routes/debug.js b/src/routes/debug.js index 189dda4e9c..dd730410d6 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -27,9 +27,9 @@ module.exports = function (app) { }); await handle.close(); - html = html.replace('apiUrl', nconf.get('relative_path') + '/assets/openapi/' + type + '.yaml'); + html = html.replace('apiUrl', `${nconf.get('relative_path')}/assets/openapi/${type}.yaml`); res.status(200).type('text/html').send(html); }); - app.use(nconf.get('relative_path') + '/debug', router); + app.use(`${nconf.get('relative_path')}/debug`, router); }; diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 0c12af5334..fc27a35910 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -48,7 +48,7 @@ async function validateTokenIfRequiresLogin(requiresLogin, cid, req, res) { if (uid <= 0 || !token) { return helpers.notAllowed(req, res); } - const userToken = await db.getObjectField('user:' + uid, 'rss_token'); + const userToken = await db.getObjectField(`user:${uid}`, 'rss_token'); if (userToken !== token) { await user.auth.logAttempt(uid, req.ip); return helpers.notAllowed(req, res); @@ -77,15 +77,15 @@ async function generateForTopic(req, res) { } if (await validateTokenIfRequiresLogin(!userPrivileges['topics:read'], topic.cid, req, res)) { - const topicData = await topics.getTopicWithPosts(topic, 'tid:' + tid + ':posts', req.uid || req.query.uid || 0, 0, 24, true); + const topicData = await topics.getTopicWithPosts(topic, `tid:${tid}:posts`, req.uid || req.query.uid || 0, 0, 24, true); topics.modifyPostsByPrivilege(topicData, userPrivileges); const feed = new rss({ title: utils.stripHTMLTags(topicData.title, utils.tags), description: topicData.posts.length ? topicData.posts[0].content : '', - feed_url: nconf.get('url') + '/topic/' + tid + '.rss', - site_url: nconf.get('url') + '/topic/' + topicData.slug, + feed_url: `${nconf.get('url')}/topic/${tid}.rss`, + site_url: `${nconf.get('url')}/topic/${topicData.slug}`, image_url: topicData.posts.length ? topicData.posts[0].picture : '', author: topicData.posts.length ? topicData.posts[0].username : '', ttl: 60, @@ -100,9 +100,9 @@ async function generateForTopic(req, res) { const dateStamp = new Date(parseInt(parseInt(postData.edited, 10) === 0 ? postData.timestamp : postData.edited, 10)).toUTCString(); feed.item({ - title: 'Reply to ' + utils.stripHTMLTags(topicData.title, utils.tags) + ' on ' + dateStamp, + title: `Reply to ${utils.stripHTMLTags(topicData.title, utils.tags)} on ${dateStamp}`, description: postData.content, - url: nconf.get('url') + '/post/' + postData.pid, + url: `${nconf.get('url')}/post/${postData.pid}`, author: postData.user ? postData.user.username : '', date: dateStamp, }); @@ -126,7 +126,7 @@ async function generateForCategory(req, res, next) { privileges.categories.get(cid, req.uid), categories.getCategoryById({ cid: cid, - set: 'cid:' + cid + ':tids', + set: `cid:${cid}:tids`, reverse: true, start: 0, stop: 25, @@ -143,8 +143,8 @@ async function generateForCategory(req, res, next) { uid: req.uid || req.query.uid || 0, title: category.name, description: category.description, - feed_url: '/category/' + cid + '.rss', - site_url: '/category/' + category.cid, + feed_url: `/category/${cid}.rss`, + site_url: `/category/${category.cid}`, }, category.topics); sendFeed(feed, res); @@ -157,7 +157,7 @@ async function generateForTopics(req, res) { } let token = null; if (req.query.token && req.query.uid) { - token = await db.getObjectField('user:' + req.query.uid, 'rss_token'); + token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); } await sendTopicsFeed({ @@ -175,7 +175,7 @@ async function generateForRecent(req, res) { } let token = null; if (req.query.token && req.query.uid) { - token = await db.getObjectField('user:' + req.query.uid, 'rss_token'); + token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); } await sendTopicsFeed({ @@ -195,7 +195,7 @@ async function generateForTop(req, res) { let token = null; if (req.query.token && req.query.uid) { - token = await db.getObjectField('user:' + req.query.uid, 'rss_token'); + token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); } const uid = token && token === req.query.token ? req.query.uid : req.uid; @@ -212,8 +212,8 @@ async function generateForTop(req, res) { uid: uid, title: 'Top Voted Topics', description: 'A list of topics that have received the most votes', - feed_url: '/top/' + (req.params.term || 'daily') + '.rss', - site_url: '/top/' + (req.params.term || 'daily'), + feed_url: `/top/${req.params.term || 'daily'}.rss`, + site_url: `/top/${req.params.term || 'daily'}`, }, result.topics); sendFeed(feed, res); @@ -228,7 +228,7 @@ async function generateForPopular(req, res) { let token = null; if (req.query.token && req.query.uid) { - token = await db.getObjectField('user:' + req.query.uid, 'rss_token'); + token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); } const uid = token && token === req.query.token ? req.query.uid : req.uid; @@ -245,8 +245,8 @@ async function generateForPopular(req, res) { uid: uid, title: 'Popular Topics', description: 'A list of topics that are sorted by post count', - feed_url: '/popular/' + (req.params.term || 'daily') + '.rss', - site_url: '/popular/' + (req.params.term || 'daily'), + feed_url: `/popular/${req.params.term || 'daily'}.rss`, + site_url: `/popular/${req.params.term || 'daily'}`, }, result.topics); sendFeed(feed, res); } @@ -275,7 +275,7 @@ async function generateTopicsFeed(feedOptions, feedTopics) { async function addFeedItem(topicData) { const feedItem = { title: utils.stripHTMLTags(topicData.title, utils.tags), - url: nconf.get('url') + '/topic/' + topicData.slug, + url: `${nconf.get('url')}/topic/${topicData.slug}`, date: new Date(topicData.lastposttime).toUTCString(), }; @@ -340,10 +340,10 @@ async function generateForCategoryRecentPosts(req, res) { if (await validateTokenIfRequiresLogin(!userPrivileges.read, cid, req, res)) { const feed = generateForPostsFeed({ - title: category.name + ' Recent Posts', - description: 'A list of recent posts from ' + category.name, - feed_url: '/category/' + cid + '/recentposts.rss', - site_url: '/category/' + cid + '/recentposts', + title: `${category.name} Recent Posts`, + description: `A list of recent posts from ${category.name}`, + feed_url: `/category/${cid}/recentposts.rss`, + site_url: `/category/${cid}/recentposts`, }, postData); sendFeed(feed, res); @@ -365,7 +365,7 @@ function generateForPostsFeed(feedOptions, posts) { feed.item({ title: postData.topic ? postData.topic.title : '', description: postData.content, - url: nconf.get('url') + '/post/' + postData.pid, + url: `${nconf.get('url')}/post/${postData.pid}`, author: postData.user ? postData.user.username : '', date: new Date(parseInt(postData.timestamp, 10)).toUTCString(), }); @@ -387,11 +387,11 @@ async function generateForUserTopics(req, res, next) { const userData = await user.getUserFields(uid, ['uid', 'username']); await sendTopicsFeed({ uid: req.uid, - title: 'Topics by ' + userData.username, - description: 'A list of topics that are posted by ' + userData.username, - feed_url: '/user/' + userslug + '/topics.rss', - site_url: '/user/' + userslug + '/topics', - }, 'uid:' + userData.uid + ':topics', res); + title: `Topics by ${userData.username}`, + description: `A list of topics that are posted by ${userData.username}`, + feed_url: `/user/${userslug}/topics.rss`, + site_url: `/user/${userslug}/topics`, + }, `uid:${userData.uid}:topics`, res); } async function generateForTag(req, res) { @@ -405,13 +405,13 @@ async function generateForTag(req, res) { const stop = start + topicsPerPage - 1; await sendTopicsFeed({ uid: req.uid, - title: 'Topics tagged with ' + tag, - description: 'A list of topics that have been tagged with ' + tag, - feed_url: '/tags/' + tag + '.rss', - site_url: '/tags/' + tag, + title: `Topics tagged with ${tag}`, + description: `A list of topics that have been tagged with ${tag}`, + feed_url: `/tags/${tag}.rss`, + site_url: `/tags/${tag}`, start: start, stop: stop, - }, 'tag:' + tag + ':topics', res); + }, `tag:${tag}:topics`, res); } function sendFeed(feed, res) { diff --git a/src/routes/helpers.js b/src/routes/helpers.js index cfcb9e941b..7b9ee0c623 100644 --- a/src/routes/helpers.js +++ b/src/routes/helpers.js @@ -12,12 +12,12 @@ helpers.setupPageRoute = function (router, name, middleware, middlewares, contro ].concat(middlewares); router.get(name, middleware.busyCheck, middleware.applyCSRF, middleware.buildHeader, middlewares, helpers.tryRoute(controller)); - router.get('/api' + name, middlewares, helpers.tryRoute(controller)); + router.get(`/api${name}`, middlewares, helpers.tryRoute(controller)); }; helpers.setupAdminPageRoute = function (router, name, middleware, middlewares, controller) { router.get(name, middleware.admin.buildHeader, middlewares, helpers.tryRoute(controller)); - router.get('/api' + name, middlewares, helpers.tryRoute(controller)); + router.get(`/api${name}`, middlewares, helpers.tryRoute(controller)); }; helpers.setupApiRoute = function (router, verb, name, middlewares, controller) { diff --git a/src/routes/index.js b/src/routes/index.js index 514bcee696..3b6e6db0ee 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -100,7 +100,7 @@ module.exports = async function (app, middleware) { router.all('(/+api|/+api/*?)', middleware.prepareAPI); router.all('(/+api/admin|/+api/admin/*?)', middleware.authenticate, middleware.admin.checkPrivileges); - router.all('(/+admin|/+admin/*?)', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.admin.checkPrivileges); + router.all('(/+admin|/+admin/*?)', ensureLoggedIn.ensureLoggedIn(`${nconf.get('relative_path')}/login?local=1`), middleware.applyCSRF, middleware.admin.checkPrivileges); app.use(middleware.stripLeadingSlashes); @@ -160,13 +160,13 @@ function addCoreRoutes(app, router, middleware) { statics.forEach(function (obj) { app.use(relativePath + obj.route, middleware.trimUploadTimestamps, express.static(obj.path, staticOptions)); }); - app.use(relativePath + '/uploads', function (req, res) { - res.redirect(relativePath + '/assets/uploads' + req.path + '?' + meta.config['cache-buster']); + app.use(`${relativePath}/uploads`, function (req, res) { + res.redirect(`${relativePath}/assets/uploads${req.path}?${meta.config['cache-buster']}`); }); // Skins meta.css.supportedSkins.forEach(function (skin) { - app.use(relativePath + '/assets/client-' + skin + '.css', middleware.buildSkinAsset); + app.use(`${relativePath}/assets/client-${skin}.css`, middleware.buildSkinAsset); }); app.use(controllers['404'].handle404); diff --git a/src/routes/meta.js b/src/routes/meta.js index ee4ec037cb..39c95f8dbb 100644 --- a/src/routes/meta.js +++ b/src/routes/meta.js @@ -13,6 +13,6 @@ module.exports = function (app, middleware, controllers) { app.get('/css/previews/:theme', controllers.admin.themes.get); app.get('/osd.xml', controllers.osd.handle); app.get('/service-worker.js', function (req, res) { - res.status(200).type('application/javascript').set('Service-Worker-Allowed', nconf.get('relative_path') + '/').sendFile(path.join(__dirname, '../../public/src/service-worker.js')); + res.status(200).type('application/javascript').set('Service-Worker-Allowed', `${nconf.get('relative_path')}/`).sendFile(path.join(__dirname, '../../public/src/service-worker.js')); }); }; diff --git a/src/search.js b/src/search.js index 8dd0d61cc3..cda83a9c7c 100644 --- a/src/search.js +++ b/src/search.js @@ -183,7 +183,7 @@ async function getCategories(cids, data) { return null; } - return await db.getObjectsFields(cids.map(cid => 'category:' + cid), categoryFields); + return await db.getObjectsFields(cids.map(cid => `category:${cid}`), categoryFields); } async function getTags(tids, data) { diff --git a/src/settings.js b/src/settings.js index 18460ab188..eacefe24cb 100644 --- a/src/settings.js +++ b/src/settings.js @@ -78,7 +78,7 @@ function Settings(hash, version, defCfg, callback, forceUpdate, reset) { this.checkStructure(callback, forceUpdate); }); } - pubsub.on('action:settings.set.' + hash, function (data) { + pubsub.on(`action:settings.set.${hash}`, function (data) { try { self.cfg._ = JSON.parse(data._); } catch (err) {} diff --git a/src/sitemap.js b/src/sitemap.js index cb47e4bc57..43379e682b 100644 --- a/src/sitemap.js +++ b/src/sitemap.js @@ -75,7 +75,7 @@ sitemap.getCategories = async function () { categoriesData.forEach(function (category) { if (category) { categoryUrls.push({ - url: `${nconf.get('relative_path')}/category/` + category.slug, + url: `${nconf.get('relative_path')}/category/${category.slug}`, changefreq: 'weekly', priority: 0.4, }); @@ -112,7 +112,7 @@ sitemap.getTopicPage = async function (page) { topicData.forEach(function (topic) { if (topic) { topicUrls.push({ - url: `${nconf.get('relative_path')}/topic/` + topic.slug, + url: `${nconf.get('relative_path')}/topic/${topic.slug}`, lastmodISO: utils.toISOString(topic.lastposttime), changefreq: 'daily', priority: 0.6, diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 0cd8b3d452..79e46cd9cc 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -47,7 +47,7 @@ SocketAdmin.before = async function (socket, method) { return; } - winston.warn('[socket.io] Call to admin method ( ' + method + ' ) blocked (accessed by uid ' + socket.uid + ')'); + winston.warn(`[socket.io] Call to admin method ( ${method} ) blocked (accessed by uid ${socket.uid})`); throw new Error('[[error:no-privileges]]'); }; @@ -106,7 +106,7 @@ SocketAdmin.deleteAllSessions = function (socket, data, callback) { }; SocketAdmin.reloadAllSessions = function (socket, data, callback) { - websockets.in('uid_' + socket.uid).emit('event:livereload'); + websockets.in(`uid_${socket.uid}`).emit('event:livereload'); callback(); }; diff --git a/src/socket.io/admin/config.js b/src/socket.io/admin/config.js index 6ec194e2a6..69fe3318d3 100644 --- a/src/socket.io/admin/config.js +++ b/src/socket.io/admin/config.js @@ -28,7 +28,7 @@ Config.setMultiple = async function (socket, data) { Object.keys(newData).forEach(function (key) { if (newData[key] !== oldData[key]) { changes[key] = newData[key]; - changes[key + '_old'] = meta.config[key]; + changes[`${key}_old`] = meta.config[key]; } }); await meta.configs.setMultiple(data); diff --git a/src/socket.io/admin/email.js b/src/socket.io/admin/email.js index 584e5785e4..e2a76c89b7 100644 --- a/src/socket.io/admin/email.js +++ b/src/socket.io/admin/email.js @@ -41,7 +41,7 @@ Email.test = async function (socket, data) { type: 'test', bodyShort: '[[email:notif.test.short]]', bodyLong: '[[email:notif.test.long]]', - nid: 'uid:' + socket.uid + ':test', + nid: `uid:${socket.uid}:test`, path: '/', from: socket.uid, }); diff --git a/src/socket.io/admin/plugins.js b/src/socket.io/admin/plugins.js index b73623c49c..de37c1b885 100644 --- a/src/socket.io/admin/plugins.js +++ b/src/socket.io/admin/plugins.js @@ -10,7 +10,7 @@ Plugins.toggleActive = async function (socket, plugin_id) { require('../../posts/cache').reset(); const data = await plugins.toggleActive(plugin_id); await events.log({ - type: 'plugin-' + (data.active ? 'activate' : 'deactivate'), + type: `plugin-${data.active ? 'activate' : 'deactivate'}`, text: plugin_id, uid: socket.uid, }); @@ -22,7 +22,7 @@ Plugins.toggleInstall = async function (socket, data) { await plugins.checkWhitelist(data.id, data.version); const pluginData = await plugins.toggleInstall(data.id, data.version); await events.log({ - type: 'plugin-' + (pluginData.installed ? 'install' : 'uninstall'), + type: `plugin-${pluginData.installed ? 'install' : 'uninstall'}`, text: data.id, version: data.version, uid: socket.uid, diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js index 705d3d9e9d..a3c197c657 100644 --- a/src/socket.io/admin/rooms.js +++ b/src/socket.io/admin/rooms.js @@ -19,7 +19,7 @@ pubsub.on('sync:stats:start', function () { const stats = SocketRooms.getLocalStats(); pubsub.publish('sync:stats:end', { stats: stats, - id: os.hostname() + ':' + nconf.get('port'), + id: `${os.hostname()}:${nconf.get('port')}`, }); }); @@ -35,7 +35,7 @@ pubsub.on('sync:stats:guests', function (eventId) { SocketRooms.getTotalGuestCount = function (callback) { var count = 0; - var eventId = 'sync:stats:guests:end:' + utils.generateUUID(); + var eventId = `sync:stats:guests:end:${utils.generateUUID()}`; pubsub.on(eventId, function (guestCount) { count += guestCount; }); diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index a6628fdbb9..32d130ca4f 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -89,7 +89,7 @@ User.sendValidationEmail = async function (socket, uids) { await async.eachLimit(uids, 50, async function (uid) { await user.email.sendValidationEmail(uid, { force: true }).catch((err) => { - winston.error('[user.create] Validation email failed to send\n[emailer.send] ' + err.stack); + winston.error(`[user.create] Validation email failed to send\n[emailer.send] ${err.stack}`); failed.push(uid); }); }); @@ -109,7 +109,7 @@ User.sendPasswordResetEmail = async function (socket, uids) { await Promise.all(uids.map(async function (uid) { const userData = await user.getUserFields(uid, ['email', 'username']); if (!userData.email) { - throw new Error('[[error:user-doesnt-have-email, ' + userData.username + ']]'); + throw new Error(`[[error:user-doesnt-have-email, ${userData.username}]]`); } await user.reset.send(userData.email); })); @@ -122,9 +122,9 @@ User.forcePasswordReset = async function (socket, uids) { uids = uids.filter(uid => parseInt(uid, 10)); - await db.setObjectField(uids.map(uid => 'user:' + uid), 'passwordExpiry', Date.now()); + await db.setObjectField(uids.map(uid => `user:${uid}`), 'passwordExpiry', Date.now()); await user.auth.revokeAllSessions(uids); - uids.forEach(uid => sockets.in('uid_' + uid).emit('event:logout')); + uids.forEach(uid => sockets.in(`uid_${uid}`).emit('event:logout')); }; User.deleteUsers = async function (socket, uids) { diff --git a/src/socket.io/blacklist.js b/src/socket.io/blacklist.js index e959a522e2..c38220f9ff 100644 --- a/src/socket.io/blacklist.js +++ b/src/socket.io/blacklist.js @@ -26,7 +26,7 @@ async function blacklist(socket, method, rule) { } await meta.blacklist[method](rule); await events.log({ - type: 'ip-blacklist-' + method, + type: `ip-blacklist-${method}`, uid: socket.uid, ip: socket.ip, rule: rule, diff --git a/src/socket.io/categories/search.js b/src/socket.io/categories/search.js index 85defb6748..9dc67c89ad 100644 --- a/src/socket.io/categories/search.js +++ b/src/socket.io/categories/search.js @@ -75,7 +75,7 @@ module.exports = function (SocketCategories) { const categoryData = await categories.getCategoriesFields(cids, ['subCategoriesPerPage']); const cidToData = _.zipObject(cids, categoryData); await Promise.all(cids.map(async (cid) => { - const allChildCids = await categories.getAllCidsFromSet('cid:' + cid + ':children'); + const allChildCids = await categories.getAllCidsFromSet(`cid:${cid}:children`); if (allChildCids.length) { const childCids = await privileges.categories.filterCids('find', allChildCids, uid); resultCids.push(...childCids.slice(0, cidToData[cid].subCategoriesPerPage)); @@ -84,7 +84,7 @@ module.exports = function (SocketCategories) { })); } - const allRootCids = await categories.getAllCidsFromSet('cid:' + parentCid + ':children'); + const allRootCids = await categories.getAllCidsFromSet(`cid:${parentCid}:children`); const rootCids = await privileges.categories.filterCids('find', allRootCids, uid); const pageCids = rootCids.slice(0, meta.config.categoriesPerPage); resultCids = pageCids; diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 08545b9093..181e3fca91 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -55,17 +55,17 @@ async function notifyUids(uid, uids, type, result) { data.uidsTo.forEach(function (toUid) { post.categoryWatchState = categoryWatchStates[toUid]; post.topic.isFollowing = topicFollowState[toUid]; - websockets.in('uid_' + toUid).emit('event:new_post', result); + websockets.in(`uid_${toUid}`).emit('event:new_post', result); if (result.topic && type === 'newTopic') { - websockets.in('uid_' + toUid).emit('event:new_topic', result.topic); + websockets.in(`uid_${toUid}`).emit('event:new_topic', result.topic); } }); } async function getWatchStates(uids, tid, cid) { return await utils.promiseParallel({ - topicFollowed: db.isSetMembers('tid:' + tid + ':followers', uids), - topicIgnored: db.isSetMembers('tid:' + tid + ':ignorers', uids), + topicFollowed: db.isSetMembers(`tid:${tid}:followers`, uids), + topicIgnored: db.isSetMembers(`tid:${tid}:ignorers`, uids), categoryWatchStates: categories.getUidsWatchStates(cid, uids), }); } @@ -101,14 +101,14 @@ SocketHelpers.sendNotificationToPostOwner = async function (pid, fromuid, comman const notifObj = await notifications.create({ type: command, - bodyShort: '[[' + notification + ', ' + username + ', ' + titleEscaped + ']]', + bodyShort: `[[${notification}, ${username}, ${titleEscaped}]]`, bodyLong: postObj.content, pid: pid, tid: postData.tid, - path: '/post/' + pid, - nid: command + ':post:' + pid + ':uid:' + fromuid, + path: `/post/${pid}`, + nid: `${command}:post:${pid}:uid:${fromuid}`, from: fromuid, - mergeId: notification + '|' + pid, + mergeId: `${notification}|${pid}`, topicTitle: topicTitle, }); @@ -136,9 +136,9 @@ SocketHelpers.sendNotificationToTopicOwner = async function (tid, fromuid, comma const titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); const notifObj = await notifications.create({ - bodyShort: '[[' + notification + ', ' + username + ', ' + titleEscaped + ']]', - path: '/topic/' + topicData.slug, - nid: command + ':tid:' + tid + ':uid:' + fromuid, + bodyShort: `[[${notification}, ${username}, ${titleEscaped}]]`, + path: `/topic/${topicData.slug}`, + nid: `${command}:tid:${tid}:uid:${fromuid}`, from: fromuid, }); @@ -186,14 +186,14 @@ SocketHelpers.upvote = async function (data, notification) { }; SocketHelpers.rescindUpvoteNotification = async function (pid, fromuid) { - await notifications.rescind('upvote:post:' + pid + ':uid:' + fromuid); + await notifications.rescind(`upvote:post:${pid}:uid:${fromuid}`); const uid = await posts.getPostField(pid, 'uid'); const count = await user.notifications.getUnreadCount(uid); - websockets.in('uid_' + uid).emit('event:notifications.updateCount', count); + websockets.in(`uid_${uid}`).emit('event:notifications.updateCount', count); }; SocketHelpers.emitToUids = async function (event, data, uids) { - uids.forEach(toUid => websockets.in('uid_' + toUid).emit(event, data)); + uids.forEach(toUid => websockets.in(`uid_${toUid}`).emit(event, data)); }; require('../promisify')(SocketHelpers); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 165f5213ef..1118560d7d 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -21,7 +21,7 @@ Sockets.init = async function (server) { const SocketIO = require('socket.io').Server; const io = new SocketIO({ - path: nconf.get('relative_path') + '/socket.io', + path: `${nconf.get('relative_path')}/socket.io`, }); if (nconf.get('isCluster')) { @@ -57,7 +57,7 @@ Sockets.init = async function (server) { methods: ['GET', 'POST'], allowedHeaders: ['content-type'], }; - winston.info('[socket.io] Restricting access to origin: ' + origins); + winston.info(`[socket.io] Restricting access to origin: ${origins}`); } io.listen(server, opts); @@ -87,13 +87,13 @@ function onDisconnect(socket) { function onConnect(socket) { if (socket.uid) { - socket.join('uid_' + socket.uid); + socket.join(`uid_${socket.uid}`); socket.join('online_users'); } else { socket.join('online_guests'); } - socket.join('sess_' + socket.request.signedCookies[nconf.get('sessionKey')]); + socket.join(`sess_${socket.request.signedCookies[nconf.get('sessionKey')]}`); socket.emit('checkSession', socket.uid); socket.emit('setHostname', os.hostname()); plugins.hooks.fire('action:sockets.connect', { socket: socket }); @@ -123,7 +123,7 @@ async function onMessage(socket, payload) { if (!methodToCall || typeof methodToCall !== 'function') { if (process.env.NODE_ENV === 'development') { - winston.warn('[socket.io] Unrecognized message: ' + eventName); + winston.warn(`[socket.io] Unrecognized message: ${eventName}`); } return callback({ message: '[[error:invalid-event]]' }); } @@ -135,7 +135,7 @@ async function onMessage(socket, payload) { } if (!eventName.startsWith('admin.') && ratelimit.isFlooding(socket)) { - winston.warn('[socket.io] Too many emits! Disconnecting uid : ' + socket.uid + '. Events : ' + socket.previousEvents); + winston.warn(`[socket.io] Too many emits! Disconnecting uid : ${socket.uid}. Events : ${socket.previousEvents}`); return socket.disconnect(); } @@ -156,7 +156,7 @@ async function onMessage(socket, payload) { }); } } catch (err) { - winston.error(eventName + '\n' + (err.stack ? err.stack : err.message)); + winston.error(`${eventName}\n${err.stack ? err.stack : err.message}`); callback({ message: err.message }); } } @@ -168,7 +168,7 @@ function requireModules() { ]; modules.forEach(function (module) { - Namespaces[module] = require('./' + module); + Namespaces[module] = require(`./${module}`); }); } @@ -182,7 +182,7 @@ async function checkMaintenance(socket) { return; } const validator = require('validator'); - throw new Error('[[pages:maintenance.text, ' + validator.escape(String(meta.config.title || 'NodeBB')) + ']]'); + throw new Error(`[[pages:maintenance.text, ${validator.escape(String(meta.config.title || 'NodeBB'))}]]`); } const getSessionAsync = util.promisify((sid, callback) => db.sessionStore.get(sid, (err, sessionObj) => callback(err, sessionObj || null))); @@ -230,7 +230,7 @@ Sockets.in = function (room) { }; Sockets.getUserSocketCount = function (uid) { - return Sockets.getCountInRoom('uid_' + uid); + return Sockets.getCountInRoom(`uid_${uid}`); }; Sockets.getCountInRoom = function (room) { @@ -248,5 +248,5 @@ Sockets.warnDeprecated = (socket, replacement) => { replacement: replacement, }); } - winston.warn('[deprecated]\n ' + (new Error('-').stack.split('\n').slice(2, 5).join('\n')) + '\n use ' + replacement); + winston.warn(`[deprecated]\n ${new Error('-').stack.split('\n').slice(2, 5).join('\n')}\n use ${replacement}`); }; diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index 75ea50c4f4..d9911b8c68 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -32,7 +32,7 @@ SocketMeta.rooms.enter = function (socket, data, callback) { data.enter = data.enter.toString(); } - if (data.enter && data.enter.startsWith('uid_') && data.enter !== 'uid_' + socket.uid) { + if (data.enter && data.enter.startsWith('uid_') && data.enter !== `uid_${socket.uid}`) { return callback(new Error('[[error:not-allowed]]')); } diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index f9057d523a..0e577d3ca1 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -26,7 +26,7 @@ SocketModules.chats.getRaw = async function (socket, data) { const roomId = await Messaging.getMessageField(data.mid, 'roomId'); const [isAdmin, hasMessage, inRoom] = await Promise.all([ user.isAdministrator(socket.uid), - db.isSortedSetMember('uid:' + socket.uid + ':chat:room:' + roomId + ':mids', data.mid), + db.isSortedSetMember(`uid:${socket.uid}:chat:room:${roomId}:mids`, data.mid), Messaging.isUserInRoom(socket.uid, roomId), ]); @@ -38,7 +38,7 @@ SocketModules.chats.getRaw = async function (socket, data) { }; SocketModules.chats.isDnD = async function (socket, uid) { - const status = await db.getObjectField('user:' + uid, 'status'); + const status = await db.getObjectField(`user:${uid}`, 'status'); return status === 'dnd'; }; @@ -220,7 +220,7 @@ SocketModules.chats.markRead = async function (socket, roomId) { ]); Messaging.pushUnreadCount(socket.uid); - server.in('uid_' + socket.uid).emit('event:chats.markedAsRead', { roomId: roomId }); + server.in(`uid_${socket.uid}`).emit('event:chats.markedAsRead', { roomId: roomId }); if (!uidsInRoom.includes(String(socket.uid))) { return; @@ -228,7 +228,7 @@ SocketModules.chats.markRead = async function (socket, roomId) { // Mark notification read const nids = uidsInRoom.filter(uid => parseInt(uid, 10) !== socket.uid) - .map(uid => 'chat_' + uid + '_' + roomId); + .map(uid => `chat_${uid}_${roomId}`); await notifications.markReadMultiple(nids, socket.uid); await user.notifications.pushCount(socket.uid); @@ -247,7 +247,7 @@ SocketModules.chats.renameRoom = async function (socket, data) { const uids = await Messaging.getUidsInRoom(data.roomId, 0, -1); const eventData = { roomId: data.roomId, newName: validator.escape(String(data.newName)) }; uids.forEach(function (uid) { - server.in('uid_' + uid).emit('event:chats.roomRename', eventData); + server.in(`uid_${uid}`).emit('event:chats.roomRename', eventData); }); }; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index df9a773154..c3a1e6c254 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -79,7 +79,7 @@ SocketPosts.getPostSummaryByIndex = async function (socket, data) { if (data.index === 0) { pid = await topics.getTopicField(data.tid, 'mainPid'); } else { - pid = await db.getSortedSetRange('tid:' + data.tid + ':posts', data.index - 1, data.index - 1); + pid = await db.getSortedSetRange(`tid:${data.tid}:posts`, data.index - 1, data.index - 1); } pid = Array.isArray(pid) ? pid[0] : pid; if (!pid) { @@ -102,27 +102,27 @@ SocketPosts.getPost = async function (socket, pid) { }; SocketPosts.loadMoreBookmarks = async function (socket, data) { - return await loadMorePosts('uid:' + data.uid + ':bookmarks', socket.uid, data); + return await loadMorePosts(`uid:${data.uid}:bookmarks`, socket.uid, data); }; SocketPosts.loadMoreUserPosts = async function (socket, data) { const cids = await categories.getCidsByPrivilege('categories:cid', socket.uid, 'topics:read'); - const keys = cids.map(c => 'cid:' + c + ':uid:' + data.uid + ':pids'); + const keys = cids.map(c => `cid:${c}:uid:${data.uid}:pids`); return await loadMorePosts(keys, socket.uid, data); }; SocketPosts.loadMoreBestPosts = async function (socket, data) { const cids = await categories.getCidsByPrivilege('categories:cid', socket.uid, 'topics:read'); - const keys = cids.map(c => 'cid:' + c + ':uid:' + data.uid + ':pids:votes'); + const keys = cids.map(c => `cid:${c}:uid:${data.uid}:pids:votes`); return await loadMorePosts(keys, socket.uid, data); }; SocketPosts.loadMoreUpVotedPosts = async function (socket, data) { - return await loadMorePosts('uid:' + data.uid + ':upvote', socket.uid, data); + return await loadMorePosts(`uid:${data.uid}:upvote`, socket.uid, data); }; SocketPosts.loadMoreDownVotedPosts = async function (socket, data) { - return await loadMorePosts('uid:' + data.uid + ':downvote', socket.uid, data); + return await loadMorePosts(`uid:${data.uid}:downvote`, socket.uid, data); }; async function loadMorePosts(set, uid, data) { @@ -152,7 +152,7 @@ SocketPosts.getReplies = async function (socket, pid) { throw new Error('[[error:invalid-data]]'); } - const pids = await posts.getPidsFromSet('pid:' + pid + ':replies', 0, -1, false); + const pids = await posts.getPidsFromSet(`pid:${pid}:replies`, 0, -1, false); var [postData, postPrivileges] = await Promise.all([ posts.getPostsByPids(pids, socket.uid), diff --git a/src/socket.io/posts/votes.js b/src/socket.io/posts/votes.js index 47dfaf7adb..97e6440e5f 100644 --- a/src/socket.io/posts/votes.js +++ b/src/socket.io/posts/votes.js @@ -20,8 +20,8 @@ module.exports = function (SocketPosts) { throw new Error('[[error:no-privileges]]'); } const [upvoteUids, downvoteUids] = await Promise.all([ - db.getSetMembers('pid:' + data.pid + ':upvote'), - showDownvotes ? db.getSetMembers('pid:' + data.pid + ':downvote') : [], + db.getSetMembers(`pid:${data.pid}:upvote`), + showDownvotes ? db.getSetMembers(`pid:${data.pid}:downvote`) : [], ]); const [upvoters, downvoters] = await Promise.all([ diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js index e28ecf3502..7723011b85 100644 --- a/src/socket.io/topics/infinitescroll.js +++ b/src/socket.io/topics/infinitescroll.js @@ -22,7 +22,7 @@ module.exports = function (SocketTopics) { throw new Error('[[error:no-privileges]]'); } - const set = data.topicPostSort === 'most_votes' ? 'tid:' + data.tid + ':posts:votes' : 'tid:' + data.tid + ':posts'; + const set = data.topicPostSort === 'most_votes' ? `tid:${data.tid}:posts:votes` : `tid:${data.tid}:posts`; const reverse = data.topicPostSort === 'newest_to_oldest' || data.topicPostSort === 'most_votes'; let start = Math.max(0, parseInt(data.after, 10)); @@ -91,7 +91,7 @@ module.exports = function (SocketTopics) { SocketTopics.loadMoreUserTopics = async function (socket, data) { const cids = await categories.getCidsByPrivilege('categories:cid', socket.uid, 'topics:read'); - data.set = cids.map(c => 'cid:' + c + ':uid:' + data.uid + ':tids'); + data.set = cids.map(c => `cid:${c}:uid:${data.uid}:tids`); return await SocketTopics.loadMoreFromSet(socket, data); }; diff --git a/src/socket.io/topics/unread.js b/src/socket.io/topics/unread.js index d7662884af..238ef89b7f 100644 --- a/src/socket.io/topics/unread.js +++ b/src/socket.io/topics/unread.js @@ -66,7 +66,7 @@ module.exports = function (SocketTopics) { } await topics.markAsUnreadForAll(tid); await topics.updateRecent(tid, now); - await db.sortedSetAdd('cid:' + topicData.cid + ':tids:lastposttime', now, tid); + await db.sortedSetAdd(`cid:${topicData.cid}:tids:lastposttime`, now, tid); await topics.setTopicField(tid, 'lastposttime', now); })); topics.pushUnreadCount(socket.uid); diff --git a/src/socket.io/uploads.js b/src/socket.io/uploads.js index b248868fbd..cbbb2ca21b 100644 --- a/src/socket.io/uploads.js +++ b/src/socket.io/uploads.js @@ -32,7 +32,7 @@ uploads.upload = async function (socket, data) { const size = image.sizeFromBase64(socketUploads[method].imageData); if (size > maxSize * 1024) { - throw new Error('[[error:file-too-big, ' + maxSize + ']]'); + throw new Error(`[[error:file-too-big, ${maxSize}]]`); } if (socketUploads[method].imageData.length < data.params.size) { return; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 4617b97b0e..495bbe3bfe 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -114,12 +114,12 @@ SocketUser.reset.commit = async function (socket, data) { const username = await user.getUserField(uid, 'username'); const now = new Date(); - const parsedDate = now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate(); + const parsedDate = `${now.getFullYear()}/${now.getMonth() + 1}/${now.getDate()}`; emailer.send('reset_notify', uid, { username: username, date: parsedDate, subject: '[[email:reset.notify.subject]]', - }).catch(err => winston.error('[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[emailer.send] ${err.stack}`)); }; SocketUser.isFollowing = async function (socket, data) { @@ -244,7 +244,7 @@ SocketUser.gdpr.check = async function (socket, data) { if (!isAdmin) { data.uid = socket.uid; } - return await db.getObjectField('user:' + data.uid, 'gdpr_consent'); + return await db.getObjectField(`user:${data.uid}`, 'gdpr_consent'); }; require('../promisify')(SocketUser); diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index c17f643ffd..f5750e24b0 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -119,31 +119,31 @@ module.exports = function (SocketUser) { await user.isAdminOrSelf(socket.uid, data.uid); - const count = await db.incrObjectField('locks', 'export:' + data.uid + type); + const count = await db.incrObjectField('locks', `export:${data.uid}${type}`); if (count > 1) { throw new Error('[[error:already-exporting]]'); } - const child = require('child_process').fork('./src/user/jobs/export-' + type + '.js', [], { + const child = require('child_process').fork(`./src/user/jobs/export-${type}.js`, [], { env: process.env, }); child.send({ uid: data.uid }); child.on('error', async function (err) { winston.error(err.stack); - await db.deleteObjectField('locks', 'export:' + data.uid + type); + await db.deleteObjectField('locks', `export:${data.uid}${type}`); }); child.on('exit', async function () { - await db.deleteObjectField('locks', 'export:' + data.uid + type); + await db.deleteObjectField('locks', `export:${data.uid}${type}`); const userData = await user.getUserFields(data.uid, ['username', 'userslug']); const n = await notifications.create({ - bodyShort: '[[notifications:' + type + '-exported, ' + userData.username + ']]', - path: '/api/user/uid/' + userData.userslug + '/export/' + type, - nid: type + ':export:' + data.uid, + bodyShort: `[[notifications:${type}-exported, ${userData.username}]]`, + path: `/api/user/uid/${userData.userslug}/export/${type}`, + nid: `${type}:export:${data.uid}`, from: data.uid, }); await notifications.push(n, [socket.uid]); await events.log({ - type: 'export:' + type, + type: `export:${type}`, uid: socket.uid, targetUid: data.uid, ip: socket.ip, diff --git a/src/start.js b/src/start.js index 616d59e74c..0a0e0d7bd2 100644 --- a/src/start.js +++ b/src/start.js @@ -85,8 +85,8 @@ function printStartupInfo() { if (nconf.get('isPrimary')) { winston.info('Initializing NodeBB v%s %s', nconf.get('version'), nconf.get('url')); - const host = nconf.get(nconf.get('database') + ':host'); - const storeLocation = host ? 'at ' + host + (!host.includes('/') ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; + const host = nconf.get(`${nconf.get('database')}:host`); + const storeLocation = host ? `at ${host}${!host.includes('/') ? `:${nconf.get(`${nconf.get('database')}:port`)}` : ''}` : ''; winston.verbose('* using %s store %s', nconf.get('database'), storeLocation); winston.verbose('* using themes stored in: %s', nconf.get('themes_path')); diff --git a/src/topics/bookmarks.js b/src/topics/bookmarks.js index c9188791be..c661e73f8b 100644 --- a/src/topics/bookmarks.js +++ b/src/topics/bookmarks.js @@ -11,27 +11,27 @@ module.exports = function (Topics) { if (parseInt(uid, 10) <= 0) { return null; } - return await db.sortedSetScore('tid:' + tid + ':bookmarks', uid); + return await db.sortedSetScore(`tid:${tid}:bookmarks`, uid); }; Topics.getUserBookmarks = async function (tids, uid) { if (parseInt(uid, 10) <= 0) { return tids.map(() => null); } - return await db.sortedSetsScore(tids.map(tid => 'tid:' + tid + ':bookmarks'), uid); + return await db.sortedSetsScore(tids.map(tid => `tid:${tid}:bookmarks`), uid); }; Topics.setUserBookmark = async function (tid, uid, index) { - await db.sortedSetAdd('tid:' + tid + ':bookmarks', index, uid); + await db.sortedSetAdd(`tid:${tid}:bookmarks`, index, uid); }; Topics.getTopicBookmarks = async function (tid) { - return await db.getSortedSetRangeWithScores('tid:' + tid + ':bookmarks', 0, -1); + return await db.getSortedSetRangeWithScores(`tid:${tid}:bookmarks`, 0, -1); }; Topics.updateTopicBookmarks = async function (tid, pids) { const maxIndex = await Topics.getPostCount(tid); - const indices = await db.sortedSetRanks('tid:' + tid + ':posts', pids); + const indices = await db.sortedSetRanks(`tid:${tid}:posts`, pids); const postIndices = indices.map(i => (i === null ? 0 : i + 1)); const minIndex = Math.min.apply(Math, postIndices); diff --git a/src/topics/create.js b/src/topics/create.js index c6daa389bd..2ad633ee86 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -29,7 +29,7 @@ module.exports = function (Topics) { cid: data.cid, mainPid: 0, title: data.title, - slug: tid + '/' + (slugify(data.title) || 'topic'), + slug: `${tid}/${slugify(data.title) || 'topic'}`, timestamp: timestamp, lastposttime: 0, postcount: 0, @@ -37,22 +37,22 @@ module.exports = function (Topics) { }; const result = await plugins.hooks.fire('filter:topic.create', { topic: topicData, data: data }); topicData = result.topic; - await db.setObject('topic:' + topicData.tid, topicData); + await db.setObject(`topic:${topicData.tid}`, topicData); await Promise.all([ db.sortedSetsAdd([ 'topics:tid', - 'cid:' + topicData.cid + ':tids', - 'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids', + `cid:${topicData.cid}:tids`, + `cid:${topicData.cid}:uid:${topicData.uid}:tids`, ], timestamp, topicData.tid), db.sortedSetsAdd([ 'topics:views', 'topics:posts', 'topics:votes', - 'cid:' + topicData.cid + ':tids:votes', - 'cid:' + topicData.cid + ':tids:posts', + `cid:${topicData.cid}:tids:votes`, + `cid:${topicData.cid}:tids:posts`, ], 0, topicData.tid), categories.updateRecentTid(topicData.cid, topicData.tid), user.addTopicIdToUser(topicData.uid, topicData.tid, timestamp), - db.incrObjectField('category:' + topicData.cid, 'topic_count'), + db.incrObjectField(`category:${topicData.cid}`, 'topic_count'), db.incrObjectField('global', 'topicCount'), Topics.createTags(data.tags, topicData.tid, timestamp), ]); @@ -119,7 +119,7 @@ module.exports = function (Topics) { topicData.index = 0; postData.index = 0; - analytics.increment(['topics', 'topics:byCid:' + topicData.cid]); + analytics.increment(['topics', `topics:byCid:${topicData.cid}`]); plugins.hooks.fire('action:topic.post', { topic: topicData, post: postData, data: data }); if (parseInt(uid, 10)) { @@ -187,12 +187,12 @@ module.exports = function (Topics) { Topics.notifyFollowers(postData, uid, { type: 'new-reply', bodyShort: translator.compile('notifications:user_posted_to', postData.user.username, postData.topic.title), - nid: 'new_post:tid:' + postData.topic.tid + ':pid:' + postData.pid + ':uid:' + uid, - mergeId: 'notifications:user_posted_to|' + postData.topic.tid, + nid: `new_post:tid:${postData.topic.tid}:pid:${postData.pid}:uid:${uid}`, + mergeId: `notifications:user_posted_to|${postData.topic.tid}`, }); } - analytics.increment(['posts', 'posts:byCid:' + data.cid]); + analytics.increment(['posts', `posts:byCid:${data.cid}`]); plugins.hooks.fire('action:topic.reply', { post: _.clone(postData), data: data }); return postData; @@ -250,9 +250,9 @@ module.exports = function (Topics) { } if (item === null || item === undefined || item.length < parseInt(min, 10)) { - throw new Error('[[error:' + minError + ', ' + min + ']]'); + throw new Error(`[[error:${minError}, ${min}]]`); } else if (item.length > parseInt(max, 10)) { - throw new Error('[[error:' + maxError + ', ' + max + ']]'); + throw new Error(`[[error:${maxError}, ${max}]]`); } } diff --git a/src/topics/data.js b/src/topics/data.js index 9eb948cc2b..1696eb145d 100644 --- a/src/topics/data.js +++ b/src/topics/data.js @@ -20,7 +20,7 @@ module.exports = function (Topics) { if (!Array.isArray(tids) || !tids.length) { return []; } - const keys = tids.map(tid => 'topic:' + tid); + const keys = tids.map(tid => `topic:${tid}`); const topics = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); const result = await plugins.hooks.fire('filter:topic.getFields', { tids: tids, @@ -57,19 +57,19 @@ module.exports = function (Topics) { }; Topics.setTopicField = async function (tid, field, value) { - await db.setObjectField('topic:' + tid, field, value); + await db.setObjectField(`topic:${tid}`, field, value); }; Topics.setTopicFields = async function (tid, data) { - await db.setObject('topic:' + tid, data); + await db.setObject(`topic:${tid}`, data); }; Topics.deleteTopicField = async function (tid, field) { - await db.deleteObjectField('topic:' + tid, field); + await db.deleteObjectField(`topic:${tid}`, field); }; Topics.deleteTopicFields = async function (tid, fields) { - await db.deleteObjectFields('topic:' + tid, fields); + await db.deleteObjectFields(`topic:${tid}`, fields); }; }; diff --git a/src/topics/delete.js b/src/topics/delete.js index 38c6ec4473..faa940ee6b 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -27,7 +27,7 @@ module.exports = function (Topics) { Topics.getTopicField(tid, 'cid'), Topics.getPids(tid), ]); - await db.sortedSetRemove('cid:' + cid + ':pids', pids); + await db.sortedSetRemove(`cid:${cid}:pids`, pids); await categories.updateRecentTidForCid(cid); } @@ -44,7 +44,7 @@ module.exports = function (Topics) { pidsToAdd.push(post.pid); scores.push(post.timestamp); }); - await db.sortedSetAdd('cid:' + cid + ':pids', scores, pidsToAdd); + await db.sortedSetAdd(`cid:${cid}:pids`, scores, pidsToAdd); await categories.updateRecentTidForCid(cid); } @@ -60,7 +60,7 @@ module.exports = function (Topics) { Topics.purgePostsAndTopic = async function (tid, uid) { const mainPid = await Topics.getTopicField(tid, 'mainPid'); - await batch.processSortedSet('tid:' + tid + ':posts', function (pids, next) { + await batch.processSortedSet(`tid:${tid}:posts`, function (pids, next) { async.eachSeries(pids, function (pid, next) { posts.purge(pid, uid, next); }, next); @@ -82,12 +82,12 @@ module.exports = function (Topics) { await Promise.all([ db.deleteAll([ - 'tid:' + tid + ':followers', - 'tid:' + tid + ':ignorers', - 'tid:' + tid + ':posts', - 'tid:' + tid + ':posts:votes', - 'tid:' + tid + ':bookmarks', - 'tid:' + tid + ':posters', + `tid:${tid}:followers`, + `tid:${tid}:ignorers`, + `tid:${tid}:posts`, + `tid:${tid}:posts:votes`, + `tid:${tid}:bookmarks`, + `tid:${tid}:posters`, ]), db.sortedSetsRemove([ 'topics:tid', @@ -102,16 +102,16 @@ module.exports = function (Topics) { reduceCounters(tid), ]); plugins.hooks.fire('action:topic.purge', { topic: deletedTopic, uid: uid }); - await db.delete('topic:' + tid); + await db.delete(`topic:${tid}`); }; async function deleteFromFollowersIgnorers(tid) { const [followers, ignorers] = await Promise.all([ - db.getSetMembers('tid:' + tid + ':followers'), - db.getSetMembers('tid:' + tid + ':ignorers'), + db.getSetMembers(`tid:${tid}:followers`), + db.getSetMembers(`tid:${tid}:ignorers`), ]); - const followerKeys = followers.map(uid => 'uid:' + uid + ':followed_tids'); - const ignorerKeys = ignorers.map(uid => 'uid:' + uid + 'ignored_tids'); + const followerKeys = followers.map(uid => `uid:${uid}:followed_tids`); + const ignorerKeys = ignorers.map(uid => `uid:${uid}ignored_tids`); await db.sortedSetsRemove(followerKeys.concat(ignorerKeys), tid); } @@ -119,14 +119,14 @@ module.exports = function (Topics) { const topicData = await Topics.getTopicFields(tid, ['cid', 'uid']); await Promise.all([ db.sortedSetsRemove([ - 'cid:' + topicData.cid + ':tids', - 'cid:' + topicData.cid + ':tids:pinned', - 'cid:' + topicData.cid + ':tids:posts', - 'cid:' + topicData.cid + ':tids:lastposttime', - 'cid:' + topicData.cid + ':tids:votes', - 'cid:' + topicData.cid + ':recent_tids', - 'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids', - 'uid:' + topicData.uid + ':topics', + `cid:${topicData.cid}:tids`, + `cid:${topicData.cid}:tids:pinned`, + `cid:${topicData.cid}:tids:posts`, + `cid:${topicData.cid}:tids:lastposttime`, + `cid:${topicData.cid}:tids:votes`, + `cid:${topicData.cid}:recent_tids`, + `cid:${topicData.cid}:uid:${topicData.uid}:tids`, + `uid:${topicData.uid}:topics`, ], tid), user.decrementUserFieldBy(topicData.uid, 'topiccount', 1), ]); @@ -140,8 +140,8 @@ module.exports = function (Topics) { var postCountChange = incr * topicData.postcount; await Promise.all([ db.incrObjectFieldBy('global', 'postCount', postCountChange), - db.incrObjectFieldBy('category:' + topicData.cid, 'post_count', postCountChange), - db.incrObjectFieldBy('category:' + topicData.cid, 'topic_count', incr), + db.incrObjectFieldBy(`category:${topicData.cid}`, 'post_count', postCountChange), + db.incrObjectFieldBy(`category:${topicData.cid}`, 'topic_count', incr), ]); } }; diff --git a/src/topics/follow.js b/src/topics/follow.js index 3790b7ca8c..f53f50c671 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -48,19 +48,19 @@ module.exports = function (Topics) { } async function follow(tid, uid) { - await addToSets('tid:' + tid + ':followers', 'uid:' + uid + ':followed_tids', tid, uid); + await addToSets(`tid:${tid}:followers`, `uid:${uid}:followed_tids`, tid, uid); } async function unfollow(tid, uid) { - await removeFromSets('tid:' + tid + ':followers', 'uid:' + uid + ':followed_tids', tid, uid); + await removeFromSets(`tid:${tid}:followers`, `uid:${uid}:followed_tids`, tid, uid); } async function ignore(tid, uid) { - await addToSets('tid:' + tid + ':ignorers', 'uid:' + uid + ':ignored_tids', tid, uid); + await addToSets(`tid:${tid}:ignorers`, `uid:${uid}:ignored_tids`, tid, uid); } async function unignore(tid, uid) { - await removeFromSets('tid:' + tid + ':ignorers', 'uid:' + uid + ':ignored_tids', tid, uid); + await removeFromSets(`tid:${tid}:ignorers`, `uid:${uid}:ignored_tids`, tid, uid); } async function addToSets(set1, set2, tid, uid) { @@ -89,7 +89,7 @@ module.exports = function (Topics) { return tids.map(() => ({ following: false, ignoring: false })); } const keys = []; - tids.forEach(tid => keys.push('tid:' + tid + ':followers', 'tid:' + tid + ':ignorers')); + tids.forEach(tid => keys.push(`tid:${tid}:followers`, `tid:${tid}:ignorers`)); const data = await db.isMemberOfSets(keys, uid); @@ -110,20 +110,20 @@ module.exports = function (Topics) { if (parseInt(uid, 10) <= 0) { return tids.map(() => false); } - const keys = tids.map(tid => 'tid:' + tid + ':' + set); + const keys = tids.map(tid => `tid:${tid}:${set}`); return await db.isMemberOfSets(keys, uid); } Topics.getFollowers = async function (tid) { - return await db.getSetMembers('tid:' + tid + ':followers'); + return await db.getSetMembers(`tid:${tid}:followers`); }; Topics.getIgnorers = async function (tid) { - return await db.getSetMembers('tid:' + tid + ':ignorers'); + return await db.getSetMembers(`tid:${tid}:ignorers`); }; Topics.filterIgnoringUids = async function (tid, uids) { - const isIgnoring = await db.isSetMembers('tid:' + tid + ':ignorers', uids); + const isIgnoring = await db.isSetMembers(`tid:${tid}:ignorers`, uids); const readingUids = uids.filter((uid, index) => uid && !isIgnoring[index]); return readingUids; }; @@ -132,7 +132,7 @@ module.exports = function (Topics) { if (parseInt(uid, 10) <= 0) { return []; } - const scores = await db.sortedSetScores('uid:' + uid + ':followed_tids', tids); + const scores = await db.sortedSetScores(`uid:${uid}:followed_tids`, tids); return tids.filter((tid, index) => tid && !!scores[index]); }; @@ -140,7 +140,7 @@ module.exports = function (Topics) { if (parseInt(uid, 10) <= 0) { return tids; } - const scores = await db.sortedSetScores('uid:' + uid + ':ignored_tids', tids); + const scores = await db.sortedSetScores(`uid:${uid}:ignored_tids`, tids); return tids.filter((tid, index) => tid && !scores[index]); }; @@ -166,7 +166,7 @@ module.exports = function (Topics) { subject: title, bodyLong: postData.content, pid: postData.pid, - path: '/post/' + postData.pid, + path: `/post/${postData.pid}`, tid: postData.topic.tid, from: exceptUid, topicTitle: title, diff --git a/src/topics/fork.js b/src/topics/fork.js index 3f5648221b..25681b9481 100644 --- a/src/topics/fork.js +++ b/src/topics/fork.js @@ -17,9 +17,9 @@ module.exports = function (Topics) { } if (title.length < meta.config.minimumTitleLength) { - throw new Error('[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]'); + throw new Error(`[[error:title-too-short, ${meta.config.minimumTitleLength}]]`); } else if (title.length > meta.config.maximumTitleLength) { - throw new Error('[[error:title-too-long, ' + meta.config.maximumTitleLength + ']]'); + throw new Error(`[[error:title-too-long, ${meta.config.maximumTitleLength}]]`); } if (!pids || !pids.length) { @@ -57,7 +57,7 @@ module.exports = function (Topics) { upvotes: postData.upvotes, downvotes: postData.downvotes, }), - db.sortedSetsAdd(['topics:votes', 'cid:' + cid + ':tids:votes'], postData.votes, tid), + db.sortedSetsAdd(['topics:votes', `cid:${cid}:tids:votes`], postData.votes, tid), ]); plugins.hooks.fire('action:topic.fork', { tid: tid, fromTid: fromTid, uid: uid }); @@ -104,29 +104,29 @@ module.exports = function (Topics) { } if (!topicData[0].pinned) { - await db.sortedSetIncrBy('cid:' + topicData[0].cid + ':tids:posts', -1, postData.tid); + await db.sortedSetIncrBy(`cid:${topicData[0].cid}:tids:posts`, -1, postData.tid); } if (!topicData[1].pinned) { - await db.sortedSetIncrBy('cid:' + topicData[1].cid + ':tids:posts', 1, toTid); + await db.sortedSetIncrBy(`cid:${topicData[1].cid}:tids:posts`, 1, toTid); } if (topicData[0].cid === topicData[1].cid) { await categories.updateRecentTidForCid(topicData[0].cid); return; } const removeFrom = [ - 'cid:' + topicData[0].cid + ':pids', - 'cid:' + topicData[0].cid + ':uid:' + postData.uid + ':pids', - 'cid:' + topicData[0].cid + ':uid:' + postData.uid + ':pids:votes', + `cid:${topicData[0].cid}:pids`, + `cid:${topicData[0].cid}:uid:${postData.uid}:pids`, + `cid:${topicData[0].cid}:uid:${postData.uid}:pids:votes`, ]; const tasks = [ - db.incrObjectFieldBy('category:' + topicData[0].cid, 'post_count', -1), - db.incrObjectFieldBy('category:' + topicData[1].cid, 'post_count', 1), + db.incrObjectFieldBy(`category:${topicData[0].cid}`, 'post_count', -1), + db.incrObjectFieldBy(`category:${topicData[1].cid}`, 'post_count', 1), db.sortedSetRemove(removeFrom, postData.pid), - db.sortedSetAdd('cid:' + topicData[1].cid + ':pids', postData.timestamp, postData.pid), - db.sortedSetAdd('cid:' + topicData[1].cid + ':uid:' + postData.uid + ':pids', postData.timestamp, postData.pid), + db.sortedSetAdd(`cid:${topicData[1].cid}:pids`, postData.timestamp, postData.pid), + db.sortedSetAdd(`cid:${topicData[1].cid}:uid:${postData.uid}:pids`, postData.timestamp, postData.pid), ]; if (postData.votes > 0) { - tasks.push(db.sortedSetAdd('cid:' + topicData[1].cid + ':uid:' + postData.uid + ':pids:votes', postData.votes, postData.pid)); + tasks.push(db.sortedSetAdd(`cid:${topicData[1].cid}:uid:${postData.uid}:pids:votes`, postData.votes, postData.pid)); } await Promise.all(tasks); diff --git a/src/topics/index.js b/src/topics/index.js index 7b6bef2017..2c77feba1a 100644 --- a/src/topics/index.js +++ b/src/topics/index.js @@ -35,7 +35,7 @@ require('./merge')(Topics); Topics.events = require('./events'); Topics.exists = async function (tid) { - return await db.exists('topic:' + tid); + return await db.exists(`topic:${tid}`); }; Topics.getTopicsFromSet = async function (set, uid, start, stop) { diff --git a/src/topics/posts.js b/src/topics/posts.js index 9ebf29a315..cc19fc8a8b 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -150,7 +150,7 @@ module.exports = function (Topics) { var index = 0; do { /* eslint-disable no-await-in-loop */ - const pids = await db.getSortedSetRevRange('tid:' + tid + ':posts', index, index); + const pids = await db.getSortedSetRevRange(`tid:${tid}:posts`, index, index); if (!pids.length) { return null; } @@ -171,25 +171,25 @@ module.exports = function (Topics) { const downvotes = parseInt(postData.downvotes, 10) || 0; const votes = upvotes - downvotes; await db.sortedSetsAdd([ - 'tid:' + tid + ':posts', 'tid:' + tid + ':posts:votes', + `tid:${tid}:posts`, `tid:${tid}:posts:votes`, ], [postData.timestamp, votes], postData.pid); } await Topics.increasePostCount(tid); - await db.sortedSetIncrBy('tid:' + tid + ':posters', 1, postData.uid); - const posterCount = await db.sortedSetCard('tid:' + tid + ':posters'); + await db.sortedSetIncrBy(`tid:${tid}:posters`, 1, postData.uid); + const posterCount = await db.sortedSetCard(`tid:${tid}:posters`); await Topics.setTopicField(tid, 'postercount', posterCount); await Topics.updateTeaser(tid); }; Topics.removePostFromTopic = async function (tid, postData) { await db.sortedSetsRemove([ - 'tid:' + tid + ':posts', - 'tid:' + tid + ':posts:votes', + `tid:${tid}:posts`, + `tid:${tid}:posts:votes`, ], postData.pid); await Topics.decreasePostCount(tid); - await db.sortedSetIncrBy('tid:' + tid + ':posters', -1, postData.uid); - await db.sortedSetsRemoveRangeByScore(['tid:' + tid + ':posters'], '-inf', 0); - const posterCount = await db.sortedSetCard('tid:' + tid + ':posters'); + await db.sortedSetIncrBy(`tid:${tid}:posters`, -1, postData.uid); + await db.sortedSetsRemoveRangeByScore([`tid:${tid}:posters`], '-inf', 0); + const posterCount = await db.sortedSetCard(`tid:${tid}:posters`); await Topics.setTopicField(tid, 'postercount', posterCount); await Topics.updateTeaser(tid); }; @@ -197,7 +197,7 @@ module.exports = function (Topics) { Topics.getPids = async function (tid) { var [mainPid, pids] = await Promise.all([ Topics.getTopicField(tid, 'mainPid'), - db.getSortedSetRange('tid:' + tid + ':posts', 0, -1), + db.getSortedSetRange(`tid:${tid}:posts`, 0, -1), ]); if (parseInt(mainPid, 10)) { pids = [mainPid].concat(pids); @@ -218,7 +218,7 @@ module.exports = function (Topics) { }; async function incrementFieldAndUpdateSortedSet(tid, field, by, set) { - const value = await db.incrObjectFieldBy('topic:' + tid, field, by); + const value = await db.incrObjectFieldBy(`topic:${tid}`, field, by); await db.sortedSetAdd(set, value, tid); } @@ -237,11 +237,11 @@ module.exports = function (Topics) { }; Topics.getPostCount = async function (tid) { - return await db.getObjectField('topic:' + tid, 'postcount'); + return await db.getObjectField(`topic:${tid}`, 'postcount'); }; async function getPostReplies(pids, callerUid) { - const keys = pids.map(pid => 'pid:' + pid + ':replies'); + const keys = pids.map(pid => `pid:${pid}:replies`); const arrayOfReplyPids = await db.getSortedSetsMembers(keys); const uniquePids = _.uniq(_.flatten(arrayOfReplyPids)); @@ -268,7 +268,7 @@ module.exports = function (Topics) { const currentData = { hasMore: false, users: [], - text: replyPids.length > 1 ? '[[topic:replies_to_this_post, ' + replyPids.length + ']]' : '[[topic:one_reply_to_this_post]]', + text: replyPids.length > 1 ? `[[topic:replies_to_this_post, ${replyPids.length}]]` : '[[topic:one_reply_to_this_post]]', count: replyPids.length, timestampISO: replyPids.length ? utils.toISOString(pidMap[replyPids[0]].timestamp) : undefined, }; diff --git a/src/topics/recent.js b/src/topics/recent.js index 0cc8ec3630..06c0482c81 100644 --- a/src/topics/recent.js +++ b/src/topics/recent.js @@ -58,12 +58,12 @@ module.exports = function (Topics) { await Topics.setTopicField(tid, 'lastposttime', lastposttime); const topicData = await Topics.getTopicFields(tid, ['cid', 'deleted', 'pinned']); - await db.sortedSetAdd('cid:' + topicData.cid + ':tids:lastposttime', lastposttime, tid); + await db.sortedSetAdd(`cid:${topicData.cid}:tids:lastposttime`, lastposttime, tid); await Topics.updateRecent(tid, lastposttime); if (!topicData.pinned) { - await db.sortedSetAdd('cid:' + topicData.cid + ':tids', lastposttime, tid); + await db.sortedSetAdd(`cid:${topicData.cid}:tids`, lastposttime, tid); } }; diff --git a/src/topics/sorted.js b/src/topics/sorted.js index a8d4ac53b7..8006ea5ff0 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -45,11 +45,11 @@ module.exports = function (Topics) { tids = await Topics.filterWatchedTids(tids, params.uid); } } else if (params.filter === 'watched') { - tids = await db.getSortedSetRevRange('uid:' + params.uid + ':followed_tids', 0, -1); + tids = await db.getSortedSetRevRange(`uid:${params.uid}:followed_tids`, 0, -1); } else if (params.cids) { tids = await getCidTids(params); } else { - tids = await db.getSortedSetRevRange('topics:' + params.sort, 0, meta.config.recentMaxTopics - 1); + tids = await db.getSortedSetRevRange(`topics:${params.sort}`, 0, meta.config.recentMaxTopics - 1); } return tids; @@ -60,11 +60,11 @@ module.exports = function (Topics) { const pinnedSets = []; params.cids.forEach(function (cid) { if (params.sort === 'recent') { - sets.push('cid:' + cid + ':tids'); + sets.push(`cid:${cid}:tids`); } else { - sets.push('cid:' + cid + ':tids' + (params.sort ? ':' + params.sort : '')); + sets.push(`cid:${cid}:tids${params.sort ? `:${params.sort}` : ''}`); } - pinnedSets.push('cid:' + cid + ':tids:pinned'); + pinnedSets.push(`cid:${cid}:tids:pinned`); }); let pinnedTids = await db.getSortedSetRevRange(pinnedSets, 0, -1); pinnedTids = await Topics.tools.checkPinExpiry(pinnedTids); diff --git a/src/topics/suggested.js b/src/topics/suggested.js index abf904f19e..c2edf5a355 100644 --- a/src/topics/suggested.js +++ b/src/topics/suggested.js @@ -34,7 +34,7 @@ module.exports = function (Topics) { async function getTidsWithSameTags(tid) { const tags = await Topics.getTopicTags(tid); - const tids = await db.getSortedSetRevRange(tags.map(tag => 'tag:' + tag + ':topics'), 0, -1); + const tids = await db.getSortedSetRevRange(tags.map(tag => `tag:${tag}:topics`), 0, -1); return _.shuffle(_.uniq(tids)).slice(0, 10).map(Number); } @@ -53,7 +53,7 @@ module.exports = function (Topics) { async function getCategoryTids(tid) { const cid = await Topics.getTopicField(tid, 'cid'); - const tids = await db.getSortedSetRevRange('cid:' + cid + ':tids:lastposttime', 0, 9); + const tids = await db.getSortedSetRevRange(`cid:${cid}:tids:lastposttime`, 0, 9); return _.shuffle(tids.map(Number).filter(_tid => _tid !== tid)); } }; diff --git a/src/topics/tags.js b/src/topics/tags.js index 33be8f7756..8ae22c04c4 100644 --- a/src/topics/tags.js +++ b/src/topics/tags.js @@ -25,11 +25,11 @@ module.exports = function (Topics) { tags = await filterCategoryTags(tags, tid); const cid = await Topics.getTopicField(tid, 'cid'); - const topicSets = tags.map(tag => 'tag:' + tag + ':topics').concat( - tags.map(tag => 'cid:' + cid + ':tag:' + tag + ':topics') + const topicSets = tags.map(tag => `tag:${tag}:topics`).concat( + tags.map(tag => `cid:${cid}:tag:${tag}:topics`) ); await Promise.all([ - db.setAdd('topic:' + tid + ':tags', tags), + db.setAdd(`topic:${tid}:tags`, tags), db.sortedSetsAdd(topicSets, timestamp, tid), ]); await Topics.updateCategoryTagsCount([cid], tags); @@ -39,9 +39,9 @@ module.exports = function (Topics) { Topics.updateCategoryTagsCount = async function (cids, tags) { await Promise.all(cids.map(async (cid) => { const counts = await db.sortedSetsCard( - tags.map(tag => 'cid:' + cid + ':tag:' + tag + ':topics') + tags.map(tag => `cid:${cid}:tag:${tag}:topics`) ); - const set = 'cid:' + cid + ':tags'; + const set = `cid:${cid}:tags`; const bulkAdd = tags.filter((tag, index) => counts[index] > 0) .map((tag, index) => [set, counts[index], tag]); @@ -56,7 +56,7 @@ module.exports = function (Topics) { })); await db.sortedSetsRemoveRangeByScore( - cids.map(cid => 'cid:' + cid + ':tags'), '-inf', 0 + cids.map(cid => `cid:${cid}:tags`), '-inf', 0 ); }; @@ -67,9 +67,9 @@ module.exports = function (Topics) { tags = _.uniq(tags); const categoryData = await categories.getCategoryFields(cid, ['minTags', 'maxTags']); if (tags.length < parseInt(categoryData.minTags, 10)) { - throw new Error('[[error:not-enough-tags, ' + categoryData.minTags + ']]'); + throw new Error(`[[error:not-enough-tags, ${categoryData.minTags}]]`); } else if (tags.length > parseInt(categoryData.maxTags, 10)) { - throw new Error('[[error:too-many-tags, ' + categoryData.maxTags + ']]'); + throw new Error(`[[error:too-many-tags, ${categoryData.maxTags}]]`); } }; @@ -99,7 +99,7 @@ module.exports = function (Topics) { Topics.updateTags = async function (data) { await async.eachSeries(data, async function (tagData) { - await db.setObject('tag:' + tagData.value, { + await db.setObject(`tag:${tagData.value}`, { color: tagData.color, bgColor: tagData.bgColor, }); @@ -120,31 +120,31 @@ module.exports = function (Topics) { const targetExists = await db.isSortedSetMember('tags:topic:count', newTagName); await Topics.createEmptyTag(newTagName); const allCids = {}; - const tagData = await db.getObject('tag:' + tag); + const tagData = await db.getObject(`tag:${tag}`); if (tagData && !targetExists) { - await db.setObject('tag:' + newTagName, { + await db.setObject(`tag:${newTagName}`, { color: tagData.color, bgColor: tagData.bgColor, }); } - await batch.processSortedSet('tag:' + tag + ':topics', async function (tids) { + await batch.processSortedSet(`tag:${tag}:topics`, async function (tids) { const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid']); const cids = topicData.map(t => t.cid); topicData.forEach((t) => { allCids[t.cid] = true; }); - const scores = await db.sortedSetScores('tag:' + tag + ':topics', tids); + const scores = await db.sortedSetScores(`tag:${tag}:topics`, tids); // update tag::topics - await db.sortedSetAdd('tag:' + newTagName + ':topics', scores, tids); - await db.sortedSetRemove('tag:' + tag + ':topics', tids); + await db.sortedSetAdd(`tag:${newTagName}:topics`, scores, tids); + await db.sortedSetRemove(`tag:${tag}:topics`, tids); // update cid::tag::topics await db.sortedSetAddBulk(topicData.map( - (t, index) => ['cid:' + t.cid + ':tag:' + newTagName + ':topics', scores[index], t.tid] + (t, index) => [`cid:${t.cid}:tag:${newTagName}:topics`, scores[index], t.tid] )); - await db.sortedSetRemove(cids.map(cid => 'cid:' + cid + ':tag:' + tag + ':topics'), tids); + await db.sortedSetRemove(cids.map(cid => `cid:${cid}:tag:${tag}:topics`), tids); // update topic::tags - const keys = tids.map(tid => 'topic:' + tid + ':tags'); + const keys = tids.map(tid => `topic:${tid}:tags`); await db.setsRemove(keys, tag); await db.setsAdd(keys, newTagName); }, {}); @@ -160,13 +160,13 @@ module.exports = function (Topics) { } Topics.getTagTids = async function (tag, start, stop) { - const tids = await db.getSortedSetRevRange('tag:' + tag + ':topics', start, stop); + const tids = await db.getSortedSetRevRange(`tag:${tag}:topics`, start, stop); const payload = await plugins.hooks.fire('filter:topics.getTagTids', { tag, start, stop, tids }); return payload.tids; }; Topics.getTagTidsByCids = async function (tag, cids, start, stop) { - const keys = cids.map(cid => 'cid:' + cid + ':tag:' + tag + ':topics'); + const keys = cids.map(cid => `cid:${cid}:tag:${tag}:topics`); const tids = await db.getSortedSetRevRange(keys, start, stop); const payload = await plugins.hooks.fire('filter:topics.getTagTidsByCids', { tag, cids, start, stop, tids }); return payload.tids; @@ -176,10 +176,10 @@ module.exports = function (Topics) { let count = 0; if (cids.length) { count = await db.sortedSetsCardSum( - cids.map(cid => 'cid:' + cid + ':tag:' + tag + ':topics') + cids.map(cid => `cid:${cid}:tag:${tag}:topics`) ); } else { - count = await db.sortedSetCard('tag:' + tag + ':topics'); + count = await db.sortedSetCard(`tag:${tag}:topics`); } const payload = await plugins.hooks.fire('filter:topics.getTagTopicCount', { tag, count, cids }); @@ -191,19 +191,19 @@ module.exports = function (Topics) { return; } await removeTagsFromTopics(tags); - const keys = tags.map(tag => 'tag:' + tag + ':topics'); + const keys = tags.map(tag => `tag:${tag}:topics`); await db.deleteAll(keys); await db.sortedSetRemove('tags:topic:count', tags); cache.del('tags:topic:count'); const cids = await categories.getAllCidsFromSet('categories:cid'); - await db.sortedSetRemove(cids.map(cid => 'cid:' + cid + ':tags'), tags); + await db.sortedSetRemove(cids.map(cid => `cid:${cid}:tags`), tags); const deleteKeys = []; tags.forEach((tag) => { - deleteKeys.push('tag:' + tag); + deleteKeys.push(`tag:${tag}`); cids.forEach((cid) => { - deleteKeys.push('cid:' + cid + ':tag:' + tag + ':topics'); + deleteKeys.push(`cid:${cid}:tag:${tag}:topics`); }); }); await db.deleteAll(deleteKeys); @@ -211,11 +211,11 @@ module.exports = function (Topics) { async function removeTagsFromTopics(tags) { await async.eachLimit(tags, 50, async function (tag) { - const tids = await db.getSortedSetRange('tag:' + tag + ':topics', 0, -1); + const tids = await db.getSortedSetRange(`tag:${tag}:topics`, 0, -1); if (!tids.length) { return; } - const keys = tids.map(tid => 'topic:' + tid + ':tags'); + const keys = tids.map(tid => `topic:${tid}:tags`); await db.setsRemove(keys, tag); }); } @@ -231,17 +231,17 @@ module.exports = function (Topics) { Topics.getCategoryTags = async function (cids, start, stop) { if (Array.isArray(cids)) { return await db.getSortedSetRevUnion({ - sets: cids.map(cid => 'cid:' + cid + ':tags'), + sets: cids.map(cid => `cid:${cid}:tags`), start, stop, }); } - return await db.getSortedSetRevRange('cid:' + cids + ':tags', start, stop); + return await db.getSortedSetRevRange(`cid:${cids}:tags`, start, stop); }; Topics.getCategoryTagsData = async function (cids, start, stop) { return await getFromSet( - Array.isArray(cids) ? cids.map(cid => 'cid:' + cid + ':tags') : 'cid:' + cids + ':tags', + Array.isArray(cids) ? cids.map(cid => `cid:${cid}:tags`) : `cid:${cids}:tags`, start, stop ); @@ -270,7 +270,7 @@ module.exports = function (Topics) { if (!tags.length) { return []; } - const tagData = await db.getObjects(tags.map(tag => 'tag:' + tag.value)); + const tagData = await db.getObjects(tags.map(tag => `tag:${tag.value}`)); tags.forEach(function (tag, index) { tag.valueEscaped = validator.escape(String(tag.value)); tag.color = tagData[index] ? tagData[index].color : ''; @@ -280,12 +280,12 @@ module.exports = function (Topics) { }; Topics.getTopicTags = async function (tid) { - const tags = await db.getSetMembers('topic:' + tid + ':tags'); + const tags = await db.getSetMembers(`topic:${tid}:tags`); return tags.sort(); }; Topics.getTopicsTags = async function (tids) { - const keys = tids.map(tid => 'topic:' + tid + ':tags'); + const keys = tids.map(tid => `topic:${tid}:tags`); const tags = await db.getSetsMembers(keys); tags.forEach(tags => tags.sort()); return tags; @@ -316,13 +316,13 @@ module.exports = function (Topics) { Topics.addTags = async function (tags, tids) { const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid', 'timestamp']); - const sets = tids.map(tid => 'topic:' + tid + ':tags'); + const sets = tids.map(tid => `topic:${tid}:tags`); for (let i = 0; i < tags.length; i++) { /* eslint-disable no-await-in-loop */ const bulkAdd = []; topicData.forEach((t) => { - bulkAdd.push(['tag:' + tags[i] + ':topics', t.timestamp, t.tid]); - bulkAdd.push(['cid:' + t.cid + ':tag:' + tags[i] + ':topics', t.timestamp, t.tid]); + bulkAdd.push([`tag:${tags[i]}:topics`, t.timestamp, t.tid]); + bulkAdd.push([`cid:${t.cid}:tag:${tags[i]}:topics`, t.timestamp, t.tid]); }); await Promise.all([ db.setsAdd(sets, tags[i]), @@ -335,13 +335,13 @@ module.exports = function (Topics) { Topics.removeTags = async function (tags, tids) { const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid']); - const sets = tids.map(tid => 'topic:' + tid + ':tags'); + const sets = tids.map(tid => `topic:${tid}:tags`); for (let i = 0; i < tags.length; i++) { /* eslint-disable no-await-in-loop */ const bulkRemove = []; topicData.forEach((t) => { - bulkRemove.push(['tag:' + tags[i] + ':topics', t.tid]); - bulkRemove.push(['cid:' + t.cid + ':tag:' + tags[i] + ':topics', t.tid]); + bulkRemove.push([`tag:${tags[i]}:topics`, t.tid]); + bulkRemove.push([`cid:${t.cid}:tag:${tags[i]}:topics`, t.tid]); }); await Promise.all([ db.setsRemove(sets, tags[i]), @@ -363,10 +363,10 @@ module.exports = function (Topics) { Topics.getTopicTags(tid), Topics.getTopicField(tid, 'cid'), ]); - await db.delete('topic:' + tid + ':tags'); + await db.delete(`topic:${tid}:tags`); - const sets = tags.map(tag => 'tag:' + tag + ':topics') - .concat(tags.map(tag => 'cid:' + cid + ':tag:' + tag + ':topics')); + const sets = tags.map(tag => `tag:${tag}:topics`) + .concat(tags.map(tag => `cid:${cid}:tag:${tag}:topics`)); await db.sortedSetsRemove(sets, tid); await Topics.updateCategoryTagsCount([cid], tags); @@ -418,11 +418,11 @@ module.exports = function (Topics) { } let tags = []; if (Array.isArray(tagWhitelist[0]) && tagWhitelist[0].length) { - const scores = await db.sortedSetScores('cid:' + data.cid + ':tags', tagWhitelist[0]); + const scores = await db.sortedSetScores(`cid:${data.cid}:tags`, tagWhitelist[0]); tags = tagWhitelist[0].map((tag, index) => ({ value: tag, score: scores[index] })); } else if (data.cids) { tags = await db.getSortedSetRevUnion({ - sets: data.cids.map(cid => 'cid:' + cid + ':tags'), + sets: data.cids.map(cid => `cid:${cid}:tags`), start: 0, stop: -1, withScores: true, diff --git a/src/topics/teaser.js b/src/topics/teaser.js index 6b5a000117..b6da823e65 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -120,7 +120,7 @@ module.exports = function (Topics) { do { /* eslint-disable no-await-in-loop */ - let pids = await db.getSortedSetRevRange('tid:' + postData.tid + ':posts', start, stop); + let pids = await db.getSortedSetRevRange(`tid:${postData.tid}:posts`, start, stop); if (!pids.length) { checkedAllReplies = true; const mainPid = await Topics.getTopicField(postData.tid, 'mainPid'); diff --git a/src/topics/thumbs.js b/src/topics/thumbs.js index 6c86505ecd..6fdd12f501 100644 --- a/src/topics/thumbs.js +++ b/src/topics/thumbs.js @@ -123,7 +123,7 @@ Thumbs.delete = async function (id, relativePath) { const topics = require('.'); const numThumbs = await db.sortedSetCard(set); if (!numThumbs) { - await db.deleteObjectField('topic:' + id, 'numThumbs'); + await db.deleteObjectField(`topic:${id}`, 'numThumbs'); } const mainPid = (await topics.getMainPids([id]))[0]; posts.uploads.dissociate(mainPid, relativePath.replace('/files/', '')); diff --git a/src/topics/tools.js b/src/topics/tools.js index 6a9bb124b6..a48b5d8eea 100644 --- a/src/topics/tools.js +++ b/src/topics/tools.js @@ -158,19 +158,19 @@ module.exports = function (Topics) { Topics.events.log(tid, { type: pin ? 'pin' : 'unpin', uid }), ]; if (pin) { - promises.push(db.sortedSetAdd('cid:' + topicData.cid + ':tids:pinned', Date.now(), tid)); + promises.push(db.sortedSetAdd(`cid:${topicData.cid}:tids:pinned`, Date.now(), tid)); promises.push(db.sortedSetsRemove([ - 'cid:' + topicData.cid + ':tids', - 'cid:' + topicData.cid + ':tids:posts', - 'cid:' + topicData.cid + ':tids:votes', + `cid:${topicData.cid}:tids`, + `cid:${topicData.cid}:tids:posts`, + `cid:${topicData.cid}:tids:votes`, ], tid)); } else { - promises.push(db.sortedSetRemove('cid:' + topicData.cid + ':tids:pinned', tid)); + promises.push(db.sortedSetRemove(`cid:${topicData.cid}:tids:pinned`, tid)); promises.push(Topics.deleteTopicField(tid, 'pinExpiry')); promises.push(db.sortedSetAddBulk([ - ['cid:' + topicData.cid + ':tids', topicData.lastposttime, tid], - ['cid:' + topicData.cid + ':tids:posts', topicData.postcount, tid], - ['cid:' + topicData.cid + ':tids:votes', parseInt(topicData.votes, 10) || 0, tid], + [`cid:${topicData.cid}:tids`, topicData.lastposttime, tid], + [`cid:${topicData.cid}:tids:posts`, topicData.postcount, tid], + [`cid:${topicData.cid}:tids:votes`, parseInt(topicData.votes, 10) || 0, tid], ])); topicData.pinExpiry = undefined; topicData.pinExpiryISO = undefined; @@ -203,9 +203,9 @@ module.exports = function (Topics) { throw new Error('[[error:no-privileges]]'); } - const isPinned = await db.isSortedSetMembers('cid:' + cid + ':tids:pinned', tids); + const isPinned = await db.isSortedSetMembers(`cid:${cid}:tids:pinned`, tids); data = data.filter((topicData, index) => isPinned[index]); - const bulk = data.map(topicData => ['cid:' + cid + ':tids:pinned', topicData.order, topicData.tid]); + const bulk = data.map(topicData => [`cid:${cid}:tids:pinned`, topicData.order, topicData.tid]); await db.sortedSetAddBulk(bulk); }; @@ -220,30 +220,30 @@ module.exports = function (Topics) { } const tags = await Topics.getTopicTags(tid); await db.sortedSetsRemove([ - 'cid:' + topicData.cid + ':tids', - 'cid:' + topicData.cid + ':tids:pinned', - 'cid:' + topicData.cid + ':tids:posts', - 'cid:' + topicData.cid + ':tids:votes', - 'cid:' + topicData.cid + ':tids:lastposttime', - 'cid:' + topicData.cid + ':recent_tids', - 'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids', - ...tags.map(tag => 'cid:' + topicData.cid + ':tag:' + tag + ':topics'), + `cid:${topicData.cid}:tids`, + `cid:${topicData.cid}:tids:pinned`, + `cid:${topicData.cid}:tids:posts`, + `cid:${topicData.cid}:tids:votes`, + `cid:${topicData.cid}:tids:lastposttime`, + `cid:${topicData.cid}:recent_tids`, + `cid:${topicData.cid}:uid:${topicData.uid}:tids`, + ...tags.map(tag => `cid:${topicData.cid}:tag:${tag}:topics`), ], tid); topicData.postcount = topicData.postcount || 0; const votes = topicData.upvotes - topicData.downvotes; const bulk = [ - ['cid:' + cid + ':tids:lastposttime', topicData.lastposttime, tid], - ['cid:' + cid + ':uid:' + topicData.uid + ':tids', topicData.timestamp, tid], - ...tags.map(tag => ['cid:' + cid + ':tag:' + tag + ':topics', topicData.timestamp, tid]), + [`cid:${cid}:tids:lastposttime`, topicData.lastposttime, tid], + [`cid:${cid}:uid:${topicData.uid}:tids`, topicData.timestamp, tid], + ...tags.map(tag => [`cid:${cid}:tag:${tag}:topics`, topicData.timestamp, tid]), ]; if (topicData.pinned) { - bulk.push(['cid:' + cid + ':tids:pinned', Date.now(), tid]); + bulk.push([`cid:${cid}:tids:pinned`, Date.now(), tid]); } else { - bulk.push(['cid:' + cid + ':tids', topicData.lastposttime, tid]); - bulk.push(['cid:' + cid + ':tids:posts', topicData.postcount, tid]); - bulk.push(['cid:' + cid + ':tids:votes', votes, tid]); + bulk.push([`cid:${cid}:tids`, topicData.lastposttime, tid]); + bulk.push([`cid:${cid}:tids:posts`, topicData.postcount, tid]); + bulk.push([`cid:${cid}:tids:votes`, votes, tid]); } await db.sortedSetAddBulk(bulk); diff --git a/src/topics/unread.js b/src/topics/unread.js index b274c5287f..b7acce66af 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -97,8 +97,8 @@ module.exports = function (Topics) { getFollowedTids(params), user.getIgnoredTids(params.uid, 0, -1), getCategoryTids(params), - db.getSortedSetRevRangeByScoreWithScores('uid:' + params.uid + ':tids_read', 0, -1, '+inf', params.cutoff), - db.getSortedSetRevRangeWithScores('uid:' + params.uid + ':tids_unread', 0, -1), + db.getSortedSetRevRangeByScoreWithScores(`uid:${params.uid}:tids_read`, 0, -1, '+inf', params.cutoff), + db.getSortedSetRevRangeWithScores(`uid:${params.uid}:tids_unread`, 0, -1), ]); const userReadTime = _.mapValues(_.keyBy(userScores, 'value'), 'score'); @@ -107,7 +107,7 @@ module.exports = function (Topics) { isTopicsFollowed[t.value] = true; }); const unreadFollowed = await db.isSortedSetMembers( - 'uid:' + params.uid + ':followed_tids', tids_unread.map(t => t.value) + `uid:${params.uid}:followed_tids`, tids_unread.map(t => t.value) ); tids_unread.forEach((t, i) => { @@ -184,12 +184,12 @@ module.exports = function (Topics) { return []; } const cids = params.cid || await user.getWatchedCategories(params.uid); - const keys = cids.map(cid => 'cid:' + cid + ':tids:lastposttime'); + const keys = cids.map(cid => `cid:${cid}:tids:lastposttime`); return await db.getSortedSetRevRangeByScoreWithScores(keys, 0, -1, '+inf', params.cutoff); } async function getFollowedTids(params) { - let tids = await db.getSortedSetMembers('uid:' + params.uid + ':followed_tids'); + let tids = await db.getSortedSetMembers(`uid:${params.uid}:followed_tids`); const filterCids = params.cid && params.cid.map(cid => parseInt(cid, 10)); if (filterCids) { const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid']); @@ -206,7 +206,7 @@ module.exports = function (Topics) { } const topicScores = _.mapValues(_.keyBy(params.recentTids, 'value'), 'score'); - const results = await db.sortedSetScores('uid:' + params.uid + ':tids_read', params.tids); + const results = await db.sortedSetScores(`uid:${params.uid}:tids_read`, params.tids); const userScores = _.zipObject(params.tids, results); @@ -233,7 +233,7 @@ module.exports = function (Topics) { } while (!done) { /* eslint-disable no-await-in-loop */ - const pidsSinceLastVisit = await db.getSortedSetRangeByScore('tid:' + tid + ':posts', start, count, userLastReadTimestamp, '+inf'); + const pidsSinceLastVisit = await db.getSortedSetRangeByScore(`tid:${tid}:posts`, start, count, userLastReadTimestamp, '+inf'); if (!pidsSinceLastVisit.length) { return hasUnblockedUnread; } @@ -252,7 +252,7 @@ module.exports = function (Topics) { return; } const results = await Topics.getUnreadTids({ uid: uid, count: true }); - require('../socket.io').in('uid_' + uid).emit('event:unread.updateCount', { + require('../socket.io').in(`uid_${uid}`).emit('event:unread.updateCount', { unreadTopicCount: results[''], unreadNewTopicCount: results.new, unreadWatchedTopicCount: results.watched, @@ -276,7 +276,7 @@ module.exports = function (Topics) { } const [topicScores, userScores] = await Promise.all([ Topics.getTopicsFields(tids, ['tid', 'lastposttime']), - db.sortedSetScores('uid:' + uid + ':tids_read', tids), + db.sortedSetScores(`uid:${uid}:tids_read`, tids), ]); tids = topicScores.filter((t, i) => t.lastposttime && (!userScores[i] || userScores[i] < t.lastposttime)) @@ -290,8 +290,8 @@ module.exports = function (Topics) { const scores = tids.map(() => now); const [topicData] = await Promise.all([ Topics.getTopicsFields(tids, ['cid']), - db.sortedSetAdd('uid:' + uid + ':tids_read', scores, tids), - db.sortedSetRemove('uid:' + uid + ':tids_unread', tids), + db.sortedSetAdd(`uid:${uid}:tids_read`, scores, tids), + db.sortedSetRemove(`uid:${uid}:tids_unread`, tids), ]); const cids = _.uniq(topicData.map(t => t && t.cid).filter(Boolean)); @@ -306,7 +306,7 @@ module.exports = function (Topics) { const tids = await db.getSortedSetRevRangeByScore('topics:recent', 0, -1, '+inf', cutoff); Topics.markTopicNotificationsRead(tids, uid); await Topics.markAsRead(tids, uid); - await db.delete('uid:' + uid + ':tids_unread'); + await db.delete(`uid:${uid}:tids_unread`); }; Topics.markTopicNotificationsRead = async function (tids, uid) { @@ -329,8 +329,8 @@ module.exports = function (Topics) { } const [topicScores, userScores, tids_unread, blockedUids] = await Promise.all([ db.sortedSetScores('topics:recent', tids), - db.sortedSetScores('uid:' + uid + ':tids_read', tids), - db.sortedSetScores('uid:' + uid + ':tids_unread', tids), + db.sortedSetScores(`uid:${uid}:tids_read`, tids), + db.sortedSetScores(`uid:${uid}:tids_unread`, tids), user.blocks.list(uid), ]); @@ -368,15 +368,15 @@ module.exports = function (Topics) { if (!exists) { throw new Error('[[error:no-topic]]'); } - await db.sortedSetRemove('uid:' + uid + ':tids_read', tid); - await db.sortedSetAdd('uid:' + uid + ':tids_unread', Date.now(), tid); + await db.sortedSetRemove(`uid:${uid}:tids_read`, tid); + await db.sortedSetAdd(`uid:${uid}:tids_unread`, Date.now(), tid); }; Topics.filterNewTids = async function (tids, uid) { if (parseInt(uid, 10) <= 0) { return []; } - const scores = await db.sortedSetScores('uid:' + uid + ':tids_read', tids); + const scores = await db.sortedSetScores(`uid:${uid}:tids_read`, tids); return tids.filter((tid, index) => tid && !scores[index]); }; diff --git a/src/topics/user.js b/src/topics/user.js index 1043e0e6de..4156eae38d 100644 --- a/src/topics/user.js +++ b/src/topics/user.js @@ -13,6 +13,6 @@ module.exports = function (Topics) { }; Topics.getUids = async function (tid) { - return await db.getSortedSetRevRangeByScore('tid:' + tid + ':posters', 0, -1, '+inf', 1); + return await db.getSortedSetRevRangeByScore(`tid:${tid}:posters`, 0, -1, '+inf', 1); }; }; diff --git a/src/upgrade.js b/src/upgrade.js index 2136913c68..9c2da9571a 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -51,7 +51,7 @@ Upgrade.getAll = async function () { } }); if (dupes.length) { - winston.error('Found duplicate upgrade scripts\n' + dupes); + winston.error(`Found duplicate upgrade scripts\n${dupes}`); throw new Error('[[error:duplicate-upgrade-scripts]]'); } @@ -71,7 +71,7 @@ Upgrade.appendPluginScripts = async function (files) { }); } } catch (e) { - winston.warn('[upgrade/appendPluginScripts] Unable to read plugin.json for plugin `' + plugin + '`. Skipping.'); + winston.warn(`[upgrade/appendPluginScripts] Unable to read plugin.json for plugin \`${plugin}\`. Skipping.`); } }); return files; @@ -136,7 +136,7 @@ Upgrade.process = async function (files, skipCount) { date: date, }; - process.stdout.write(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '...'); + process.stdout.write(`${' → '.white + String(`[${[date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/')}] `).gray + String(scriptExport.name).reset}...`); // For backwards compatibility, cross-reference with schemaDate (if found). If a script's date is older, skip it if ((!schemaDate && !schemaLogCount) || (scriptExport.timestamp <= schemaDate && semver.lt(version, '1.5.0'))) { @@ -187,13 +187,13 @@ Upgrade.incrementProgress = function (value) { var filled = 0; var unfilled = 15; if (this.total) { - percentage = Math.floor((this.current / this.total) * 100) + '%'; + percentage = `${Math.floor((this.current / this.total) * 100)}%`; filled = Math.floor((this.current / this.total) * 15); unfilled = Math.max(0, 15 - filled); } readline.cursorTo(process.stdout, 0); - process.stdout.write(' [' + (filled ? new Array(filled).join('#') : '') + new Array(unfilled).join(' ') + '] (' + this.current + '/' + (this.total || '??') + ') ' + percentage + ' '); + process.stdout.write(` [${filled ? new Array(filled).join('#') : ''}${new Array(unfilled).join(' ')}] (${this.current}/${this.total || '??'}) ${percentage} `); } }; diff --git a/src/upgrades/1.0.0/chat_room_hashes.js b/src/upgrades/1.0.0/chat_room_hashes.js index 9c1f9679b3..2f4efeeaf1 100644 --- a/src/upgrades/1.0.0/chat_room_hashes.js +++ b/src/upgrades/1.0.0/chat_room_hashes.js @@ -16,7 +16,7 @@ module.exports = { async.whilst(function (next) { next(null, currentChatRoomId <= nextChatRoomId); }, function (next) { - db.getSortedSetRange('chat:room:' + currentChatRoomId + ':uids', 0, 0, function (err, uids) { + db.getSortedSetRange(`chat:room:${currentChatRoomId}:uids`, 0, 0, function (err, uids) { if (err) { return next(err); } @@ -25,7 +25,7 @@ module.exports = { return next(); } - db.setObject('chat:room:' + currentChatRoomId, { owner: uids[0], roomId: currentChatRoomId }, function (err) { + db.setObject(`chat:room:${currentChatRoomId}`, { owner: uids[0], roomId: currentChatRoomId }, function (err) { if (err) { return next(err); } diff --git a/src/upgrades/1.0.0/chat_upgrade.js b/src/upgrades/1.0.0/chat_upgrade.js index db7e5934cd..3773e3f72c 100644 --- a/src/upgrades/1.0.0/chat_upgrade.js +++ b/src/upgrades/1.0.0/chat_upgrade.js @@ -21,16 +21,16 @@ module.exports = { async.whilst(function (next) { next(null, currentMid <= globalData.nextMid); }, function (next) { - db.getObject('message:' + currentMid, function (err, message) { + db.getObject(`message:${currentMid}`, function (err, message) { var msgTime; function addMessageToUids(roomId, callback) { async.parallel([ function (next) { - db.sortedSetAdd('uid:' + message.fromuid + ':chat:room:' + roomId + ':mids', msgTime, currentMid, next); + db.sortedSetAdd(`uid:${message.fromuid}:chat:room:${roomId}:mids`, msgTime, currentMid, next); }, function (next) { - db.sortedSetAdd('uid:' + message.touid + ':chat:room:' + roomId + ':mids', msgTime, currentMid, next); + db.sortedSetAdd(`uid:${message.touid}:chat:room:${roomId}:mids`, msgTime, currentMid, next); }, ], callback); } @@ -45,7 +45,7 @@ module.exports = { msgTime = parseInt(message.timestamp, 10); if (rooms[pairID]) { - winston.verbose('adding message ' + currentMid + ' to existing roomID ' + roomId); + winston.verbose(`adding message ${currentMid} to existing roomID ${roomId}`); addMessageToUids(rooms[pairID], function (err) { if (err) { return next(err); @@ -54,16 +54,16 @@ module.exports = { next(); }); } else { - winston.verbose('adding message ' + currentMid + ' to new roomID ' + roomId); + winston.verbose(`adding message ${currentMid} to new roomID ${roomId}`); async.parallel([ function (next) { - db.sortedSetAdd('uid:' + message.fromuid + ':chat:rooms', msgTime, roomId, next); + db.sortedSetAdd(`uid:${message.fromuid}:chat:rooms`, msgTime, roomId, next); }, function (next) { - db.sortedSetAdd('uid:' + message.touid + ':chat:rooms', msgTime, roomId, next); + db.sortedSetAdd(`uid:${message.touid}:chat:rooms`, msgTime, roomId, next); }, function (next) { - db.sortedSetAdd('chat:room:' + roomId + ':uids', [msgTime, msgTime + 1], [message.fromuid, message.touid], next); + db.sortedSetAdd(`chat:room:${roomId}:uids`, [msgTime, msgTime + 1], [message.fromuid, message.touid], next); }, function (next) { addMessageToUids(roomId, next); diff --git a/src/upgrades/1.0.0/user_best_posts.js b/src/upgrades/1.0.0/user_best_posts.js index 1980f9c473..3b2f85ebe4 100644 --- a/src/upgrades/1.0.0/user_best_posts.js +++ b/src/upgrades/1.0.0/user_best_posts.js @@ -14,15 +14,15 @@ module.exports = { batch.processSortedSet('posts:pid', function (ids, next) { async.eachSeries(ids, function (id, next) { - db.getObjectFields('post:' + id, ['pid', 'uid', 'votes'], function (err, postData) { + db.getObjectFields(`post:${id}`, ['pid', 'uid', 'votes'], function (err, postData) { if (err) { return next(err); } if (!postData || !parseInt(postData.votes, 10) || !parseInt(postData.uid, 10)) { return next(); } - winston.verbose('processing pid: ' + postData.pid + ' uid: ' + postData.uid + ' votes: ' + postData.votes); - db.sortedSetAdd('uid:' + postData.uid + ':posts:votes', postData.votes, postData.pid, next); + winston.verbose(`processing pid: ${postData.pid} uid: ${postData.uid} votes: ${postData.votes}`); + db.sortedSetAdd(`uid:${postData.uid}:posts:votes`, postData.votes, postData.pid, next); progress.incr(); }); }, next); diff --git a/src/upgrades/1.0.0/users_notvalidated.js b/src/upgrades/1.0.0/users_notvalidated.js index 78523736f0..9fd9dfeb3c 100644 --- a/src/upgrades/1.0.0/users_notvalidated.js +++ b/src/upgrades/1.0.0/users_notvalidated.js @@ -13,14 +13,14 @@ module.exports = { var now = Date.now(); batch.processSortedSet('users:joindate', function (ids, next) { async.eachSeries(ids, function (id, next) { - db.getObjectFields('user:' + id, ['uid', 'email:confirmed'], function (err, userData) { + db.getObjectFields(`user:${id}`, ['uid', 'email:confirmed'], function (err, userData) { if (err) { return next(err); } if (!userData || !parseInt(userData.uid, 10) || parseInt(userData['email:confirmed'], 10) === 1) { return next(); } - winston.verbose('processing uid: ' + userData.uid + ' email:confirmed: ' + userData['email:confirmed']); + winston.verbose(`processing uid: ${userData.uid} email:confirmed: ${userData['email:confirmed']}`); db.sortedSetAdd('users:notvalidated', now, userData.uid, next); }); }, next); diff --git a/src/upgrades/1.1.0/assign_topic_read_privilege.js b/src/upgrades/1.1.0/assign_topic_read_privilege.js index 564fb9dae9..75ff4d4b18 100644 --- a/src/upgrades/1.1.0/assign_topic_read_privilege.js +++ b/src/upgrades/1.1.0/assign_topic_read_privilege.js @@ -30,9 +30,9 @@ module.exports = { function (next) { async.eachSeries(groups, function (group, next) { if (group.privileges['groups:read']) { - return groupsAPI.join('cid:' + cid + ':privileges:groups:topics:read', group.name, function (err) { + return groupsAPI.join(`cid:${cid}:privileges:groups:topics:read`, group.name, function (err) { if (!err) { - winston.verbose('cid:' + cid + ':privileges:groups:topics:read granted to gid: ' + group.name); + winston.verbose(`cid:${cid}:privileges:groups:topics:read granted to gid: ${group.name}`); } return next(err); @@ -45,9 +45,9 @@ module.exports = { function (next) { async.eachSeries(users, function (user, next) { if (user.privileges.read) { - return groupsAPI.join('cid:' + cid + ':privileges:topics:read', user.uid, function (err) { + return groupsAPI.join(`cid:${cid}:privileges:topics:read`, user.uid, function (err) { if (!err) { - winston.verbose('cid:' + cid + ':privileges:topics:read granted to uid: ' + user.uid); + winston.verbose(`cid:${cid}:privileges:topics:read granted to uid: ${user.uid}`); } return next(err); @@ -59,7 +59,7 @@ module.exports = { }, ], function (err) { if (!err) { - winston.verbose('-- cid ' + cid + ' upgraded'); + winston.verbose(`-- cid ${cid} upgraded`); } next(err); diff --git a/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.js b/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.js index 07becbd858..a47656d03e 100644 --- a/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.js +++ b/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.js @@ -33,7 +33,7 @@ module.exports = { return parseInt(a.deleted, 10) === 1 ? pids[idx] : null; }).filter(Boolean); - winston.verbose('[2016/04/29] ' + toDismiss.length + ' dismissable flags found'); + winston.verbose(`[2016/04/29] ${toDismiss.length} dismissable flags found`); async.each(toDismiss, dismissFlag, next); }, ], callback); @@ -45,7 +45,7 @@ module.exports = { function dismissFlag(pid, callback) { async.waterfall([ function (next) { - db.getObjectFields('post:' + pid, ['pid', 'uid', 'flags'], next); + db.getObjectFields(`post:${pid}`, ['pid', 'uid', 'flags'], next); }, function (postData, next) { if (!postData.pid) { @@ -57,7 +57,7 @@ function dismissFlag(pid, callback) { if (parseInt(postData.flags, 10) > 0) { async.parallel([ async.apply(db.sortedSetIncrBy, 'users:flags', -postData.flags, postData.uid), - async.apply(db.incrObjectFieldBy, 'user:' + postData.uid, 'flags', -postData.flags), + async.apply(db.incrObjectFieldBy, `user:${postData.uid}`, 'flags', -postData.flags), ], next); } else { next(); @@ -70,32 +70,32 @@ function dismissFlag(pid, callback) { db.sortedSetsRemove([ 'posts:flagged', 'posts:flags:count', - 'uid:' + postData.uid + ':flag:pids', + `uid:${postData.uid}:flag:pids`, ], pid, next); }, function (next) { async.series([ function (next) { - db.getSortedSetRange('pid:' + pid + ':flag:uids', 0, -1, function (err, uids) { + db.getSortedSetRange(`pid:${pid}:flag:uids`, 0, -1, function (err, uids) { if (err) { return next(err); } async.each(uids, function (uid, next) { - var nid = 'post_flag:' + pid + ':uid:' + uid; + var nid = `post_flag:${pid}:uid:${uid}`; async.parallel([ - async.apply(db.delete, 'notifications:' + nid), - async.apply(db.sortedSetRemove, 'notifications', 'post_flag:' + pid + ':uid:' + uid), + async.apply(db.delete, `notifications:${nid}`), + async.apply(db.sortedSetRemove, 'notifications', `post_flag:${pid}:uid:${uid}`), ], next); }, next); }); }, - async.apply(db.delete, 'pid:' + pid + ':flag:uids'), + async.apply(db.delete, `pid:${pid}:flag:uids`), ], next); }, - async.apply(db.deleteObjectField, 'post:' + pid, 'flags'), - async.apply(db.delete, 'pid:' + pid + ':flag:uid:reason'), - async.apply(db.deleteObjectFields, 'post:' + pid, ['flag:state', 'flag:assignee', 'flag:notes', 'flag:history']), + async.apply(db.deleteObjectField, `post:${pid}`, 'flags'), + async.apply(db.delete, `pid:${pid}:flag:uid:reason`), + async.apply(db.deleteObjectFields, `post:${pid}`, ['flag:state', 'flag:assignee', 'flag:notes', 'flag:history']), ], next); }, function (results, next) { diff --git a/src/upgrades/1.1.0/group_title_update.js b/src/upgrades/1.1.0/group_title_update.js index 1734050866..94ca3b01a2 100644 --- a/src/upgrades/1.1.0/group_title_update.js +++ b/src/upgrades/1.1.0/group_title_update.js @@ -13,7 +13,7 @@ module.exports = { var batch = require('../../batch'); var count = 0; batch.processSortedSet('users:joindate', function (uids, next) { - winston.verbose('upgraded ' + count + ' users'); + winston.verbose(`upgraded ${count} users`); user.getMultipleUserSettings(uids, function (err, settings) { if (err) { return next(err); @@ -24,7 +24,7 @@ module.exports = { }); async.each(settings, function (setting, next) { - db.setObjectField('user:' + setting.uid, 'groupTitle', setting.groupTitle, next); + db.setObjectField(`user:${setting.uid}`, 'groupTitle', setting.groupTitle, next); }, next); }); }, {}, callback); diff --git a/src/upgrades/1.1.0/separate_upvote_downvote.js b/src/upgrades/1.1.0/separate_upvote_downvote.js index 0c8d9f9fdf..17d16439f5 100644 --- a/src/upgrades/1.1.0/separate_upvote_downvote.js +++ b/src/upgrades/1.1.0/separate_upvote_downvote.js @@ -15,15 +15,15 @@ module.exports = { var progress = this.progress; batch.processSortedSet('posts:pid', function (pids, next) { - winston.verbose('upgraded ' + count + ' posts'); + winston.verbose(`upgraded ${count} posts`); count += pids.length; async.each(pids, function (pid, next) { async.parallel({ upvotes: function (next) { - db.setCount('pid:' + pid + ':upvote', next); + db.setCount(`pid:${pid}:upvote`, next); }, downvotes: function (next) { - db.setCount('pid:' + pid + ':downvote', next); + db.setCount(`pid:${pid}:downvote`, next); }, }, function (err, results) { if (err) { diff --git a/src/upgrades/1.1.0/user_post_count_per_tid.js b/src/upgrades/1.1.0/user_post_count_per_tid.js index 64faa475ec..77e86325d7 100644 --- a/src/upgrades/1.1.0/user_post_count_per_tid.js +++ b/src/upgrades/1.1.0/user_post_count_per_tid.js @@ -13,10 +13,10 @@ module.exports = { var topics = require('../../topics'); var count = 0; batch.processSortedSet('topics:tid', function (tids, next) { - winston.verbose('upgraded ' + count + ' topics'); + winston.verbose(`upgraded ${count} topics`); count += tids.length; async.each(tids, function (tid, next) { - db.delete('tid:' + tid + ':posters', function (err) { + db.delete(`tid:${tid}:posters`, function (err) { if (err) { return next(err); } @@ -30,14 +30,14 @@ module.exports = { } async.eachSeries(pids, function (pid, next) { - db.getObjectField('post:' + pid, 'uid', function (err, uid) { + db.getObjectField(`post:${pid}`, 'uid', function (err, uid) { if (err) { return next(err); } if (!parseInt(uid, 10)) { return next(); } - db.sortedSetIncrBy('tid:' + tid + ':posters', 1, uid, next); + db.sortedSetIncrBy(`tid:${tid}:posters`, 1, uid, next); }); }, next); }); diff --git a/src/upgrades/1.1.1/remove_negative_best_posts.js b/src/upgrades/1.1.1/remove_negative_best_posts.js index d9889a97c1..fc71b4f524 100644 --- a/src/upgrades/1.1.1/remove_negative_best_posts.js +++ b/src/upgrades/1.1.1/remove_negative_best_posts.js @@ -12,8 +12,8 @@ module.exports = { var batch = require('../../batch'); batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (id, next) { - winston.verbose('processing uid ' + id); - db.sortedSetsRemoveRangeByScore(['uid:' + id + ':posts:votes'], '-inf', 0, next); + winston.verbose(`processing uid ${id}`); + db.sortedSetsRemoveRangeByScore([`uid:${id}:posts:votes`], '-inf', 0, next); }, next); }, {}, callback); }, diff --git a/src/upgrades/1.10.0/view_deleted_privilege.js b/src/upgrades/1.10.0/view_deleted_privilege.js index 2d7f7410e0..00bf9474f9 100644 --- a/src/upgrades/1.10.0/view_deleted_privilege.js +++ b/src/upgrades/1.10.0/view_deleted_privilege.js @@ -16,9 +16,9 @@ module.exports = { } async.eachSeries(cids, function (cid, next) { async.waterfall([ - async.apply(db.getSortedSetRange.bind(db), 'group:cid:' + cid + ':privileges:moderate:members', 0, -1), + async.apply(db.getSortedSetRange.bind(db), `group:cid:${cid}:privileges:moderate:members`, 0, -1), function (uids, next) { - async.eachSeries(uids, (uid, next) => groups.join('cid:' + cid + ':privileges:posts:view_deleted', uid, next), next); + async.eachSeries(uids, (uid, next) => groups.join(`cid:${cid}:privileges:posts:view_deleted`, uid, next), next); }, ], next); }, callback); diff --git a/src/upgrades/1.10.2/event_filters.js b/src/upgrades/1.10.2/event_filters.js index 167ae152b3..b016d7358f 100644 --- a/src/upgrades/1.10.2/event_filters.js +++ b/src/upgrades/1.10.2/event_filters.js @@ -15,7 +15,7 @@ module.exports = { async.eachSeries(eids, function (eid, next) { progress.incr(); - db.getObject('event:' + eid, function (err, eventData) { + db.getObject(`event:${eid}`, function (err, eventData) { if (err) { return next(err); } @@ -27,16 +27,16 @@ module.exports = { eventData.type = 'privilege-change'; async.waterfall([ function (next) { - db.setObjectField('event:' + eid, 'type', 'privilege-change', next); + db.setObjectField(`event:${eid}`, 'type', 'privilege-change', next); }, function (next) { - db.sortedSetAdd('events:time:' + eventData.type, eventData.timestamp, eid, next); + db.sortedSetAdd(`events:time:${eventData.type}`, eventData.timestamp, eid, next); }, ], next); return; } - db.sortedSetAdd('events:time:' + (eventData.type || ''), eventData.timestamp, eid, next); + db.sortedSetAdd(`events:time:${eventData.type || ''}`, eventData.timestamp, eid, next); }); }, next); }, { diff --git a/src/upgrades/1.10.2/fix_category_post_zsets.js b/src/upgrades/1.10.2/fix_category_post_zsets.js index 4c3d4f800a..b9aef92bd7 100644 --- a/src/upgrades/1.10.2/fix_category_post_zsets.js +++ b/src/upgrades/1.10.2/fix_category_post_zsets.js @@ -16,7 +16,7 @@ module.exports = { return callback(err); } var keys = cids.map(function (cid) { - return 'cid:' + cid + ':pids'; + return `cid:${cid}:pids`; }); var posts = require('../../posts'); batch.processSortedSet('posts:pid', function (postData, next) { @@ -42,8 +42,8 @@ module.exports = { }); if (memberCids.length > 1) { async.waterfall([ - async.apply(db.sortedSetRemove, memberCids.map(cid => 'cid:' + cid + ':pids'), pid), - async.apply(db.sortedSetAdd, 'cid:' + cid + ':pids', timestamp, pid), + async.apply(db.sortedSetRemove, memberCids.map(cid => `cid:${cid}:pids`), pid), + async.apply(db.sortedSetAdd, `cid:${cid}:pids`, timestamp, pid), ], next); } else { next(); diff --git a/src/upgrades/1.10.2/fix_category_topic_zsets.js b/src/upgrades/1.10.2/fix_category_topic_zsets.js index b469f5c480..3679c13dc4 100644 --- a/src/upgrades/1.10.2/fix_category_topic_zsets.js +++ b/src/upgrades/1.10.2/fix_category_topic_zsets.js @@ -18,14 +18,14 @@ module.exports = { async.waterfall([ function (next) { - db.getObjectFields('topic:' + tid, ['cid', 'pinned', 'postcount'], next); + db.getObjectFields(`topic:${tid}`, ['cid', 'pinned', 'postcount'], next); }, function (topicData, next) { if (parseInt(topicData.pinned, 10) === 1) { return setImmediate(next); } topicData.postcount = parseInt(topicData.postcount, 10) || 0; - db.sortedSetAdd('cid:' + topicData.cid + ':tids:posts', topicData.postcount, tid, next); + db.sortedSetAdd(`cid:${topicData.cid}:tids:posts`, topicData.postcount, tid, next); }, function (next) { topics.updateLastPostTimeFromLastPid(tid, next); diff --git a/src/upgrades/1.10.2/upgrade_bans_to_hashes.js b/src/upgrades/1.10.2/upgrade_bans_to_hashes.js index c096728331..0a2cd722fb 100644 --- a/src/upgrades/1.10.2/upgrade_bans_to_hashes.js +++ b/src/upgrades/1.10.2/upgrade_bans_to_hashes.js @@ -18,13 +18,13 @@ module.exports = { async.parallel({ bans: function (next) { - db.getSortedSetRevRangeWithScores('uid:' + uid + ':bans', 0, -1, next); + db.getSortedSetRevRangeWithScores(`uid:${uid}:bans`, 0, -1, next); }, reasons: function (next) { - db.getSortedSetRevRangeWithScores('banned:' + uid + ':reasons', 0, -1, next); + db.getSortedSetRevRangeWithScores(`banned:${uid}:reasons`, 0, -1, next); }, userData: function (next) { - db.getObjectFields('user:' + uid, ['banned', 'banned:expire', 'joindate', 'lastposttime', 'lastonline'], next); + db.getObjectFields(`user:${uid}`, ['banned', 'banned:expire', 'joindate', 'lastposttime', 'lastonline'], next); }, }, function (err, results) { function addBan(key, data, callback) { @@ -33,7 +33,7 @@ module.exports = { db.setObject(key, data, next); }, function (next) { - db.sortedSetAdd('uid:' + uid + ':bans:timestamp', data.timestamp, key, next); + db.sortedSetAdd(`uid:${uid}:bans:timestamp`, data.timestamp, key, next); }, ], callback); } @@ -48,7 +48,7 @@ module.exports = { // has no history, but is banned, create plain object with just uid and timestmap if (!results.bans.length && parseInt(results.userData.banned, 10)) { const banTimestamp = results.userData.lastonline || results.userData.lastposttime || results.userData.joindate || Date.now(); - const banKey = 'uid:' + uid + ':ban:' + banTimestamp; + const banKey = `uid:${uid}:ban:${banTimestamp}`; addBan(banKey, { uid: uid, timestamp: banTimestamp }, next); return; } @@ -61,7 +61,7 @@ module.exports = { }); } const reasonData = findReason(ban.score); - const banKey = 'uid:' + uid + ':ban:' + ban.score; + const banKey = `uid:${uid}:ban:${ban.score}`; var data = { uid: uid, timestamp: ban.score, diff --git a/src/upgrades/1.10.2/username_email_history.js b/src/upgrades/1.10.2/username_email_history.js index 69c48be82a..14bba15c18 100644 --- a/src/upgrades/1.10.2/username_email_history.js +++ b/src/upgrades/1.10.2/username_email_history.js @@ -18,7 +18,7 @@ module.exports = { function (next) { // Username async.waterfall([ - async.apply(db.sortedSetCard, 'user:' + uid + ':usernames'), + async.apply(db.sortedSetCard, `user:${uid}:usernames`), (count, next) => { if (count > 0) { // User has changed their username before, no record of original username, skip. @@ -32,14 +32,14 @@ module.exports = { return setImmediate(next); } - db.sortedSetAdd('user:' + uid + ':usernames', userdata.joindate, [userdata.username, userdata.joindate].join(':'), next); + db.sortedSetAdd(`user:${uid}:usernames`, userdata.joindate, [userdata.username, userdata.joindate].join(':'), next); }, ], next); }, function (next) { // Email async.waterfall([ - async.apply(db.sortedSetCard, 'user:' + uid + ':emails'), + async.apply(db.sortedSetCard, `user:${uid}:emails`), (count, next) => { if (count > 0) { // User has changed their email before, no record of original email, skip. @@ -53,7 +53,7 @@ module.exports = { return setImmediate(next); } - db.sortedSetAdd('user:' + uid + ':emails', userdata.joindate, [userdata.email, userdata.joindate].join(':'), next); + db.sortedSetAdd(`user:${uid}:emails`, userdata.joindate, [userdata.email, userdata.joindate].join(':'), next); }, ], next); }, diff --git a/src/upgrades/1.11.1/remove_ignored_cids_per_user.js b/src/upgrades/1.11.1/remove_ignored_cids_per_user.js index 1d80f0cf09..9ce08a49a5 100644 --- a/src/upgrades/1.11.1/remove_ignored_cids_per_user.js +++ b/src/upgrades/1.11.1/remove_ignored_cids_per_user.js @@ -12,7 +12,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (uids, next) { progress.incr(uids.length); - const keys = uids.map(uid => 'uid:' + uid + ':ignored:cids'); + const keys = uids.map(uid => `uid:${uid}:ignored:cids`); db.deleteAll(keys, next); }, { progress: this.progress, diff --git a/src/upgrades/1.12.0/category_watch_state.js b/src/upgrades/1.12.0/category_watch_state.js index 2d9cbe0c4c..9f1cda40e6 100644 --- a/src/upgrades/1.12.0/category_watch_state.js +++ b/src/upgrades/1.12.0/category_watch_state.js @@ -17,12 +17,12 @@ module.exports = { db.getSortedSetRange('categories:cid', 0, -1, next); }, function (cids, next) { - keys = cids.map(cid => 'cid:' + cid + ':ignorers'); + keys = cids.map(cid => `cid:${cid}:ignorers`); batch.processSortedSet('users:joindate', function (uids, next) { progress.incr(uids.length); async.eachSeries(cids, function (cid, next) { - db.isSortedSetMembers('cid:' + cid + ':ignorers', uids, function (err, isMembers) { + db.isSortedSetMembers(`cid:${cid}:ignorers`, uids, function (err, isMembers) { if (err) { return next(err); } @@ -31,7 +31,7 @@ module.exports = { return setImmediate(next); } const states = uids.map(() => categories.watchStates.ignoring); - db.sortedSetAdd('cid:' + cid + ':uid:watch:state', states, uids, next); + db.sortedSetAdd(`cid:${cid}:uid:watch:state`, states, uids, next); }); }, next); }, { diff --git a/src/upgrades/1.12.1/clear_username_email_history.js b/src/upgrades/1.12.1/clear_username_email_history.js index e7c7e82766..d84f916374 100644 --- a/src/upgrades/1.12.1/clear_username_email_history.js +++ b/src/upgrades/1.12.1/clear_username_email_history.js @@ -28,7 +28,7 @@ module.exports = { currentUid += 1; return next(); } - db.deleteAll(['user:' + currentUid + ':usernames', 'user:' + currentUid + ':emails'], function (err) { + db.deleteAll([`user:${currentUid}:usernames`, `user:${currentUid}:emails`], function (err) { if (err) { return next(err); } diff --git a/src/upgrades/1.12.1/moderation_notes_refactor.js b/src/upgrades/1.12.1/moderation_notes_refactor.js index 0bc17846ba..958466a410 100644 --- a/src/upgrades/1.12.1/moderation_notes_refactor.js +++ b/src/upgrades/1.12.1/moderation_notes_refactor.js @@ -14,7 +14,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (uid, next) { progress.incr(); - db.getSortedSetRevRange('uid:' + uid + ':moderation:notes', 0, -1, function (err, notes) { + db.getSortedSetRevRange(`uid:${uid}:moderation:notes`, 0, -1, function (err, notes) { if (err || !notes.length) { return next(err); } @@ -32,17 +32,17 @@ module.exports = { } }, function (next) { - db.sortedSetRemove('uid:' + uid + ':moderation:notes', note, next); + db.sortedSetRemove(`uid:${uid}:moderation:notes`, note, next); }, function (next) { - db.setObject('uid:' + uid + ':moderation:note:' + noteData.timestamp, { + db.setObject(`uid:${uid}:moderation:note:${noteData.timestamp}`, { uid: noteData.uid, timestamp: noteData.timestamp, note: noteData.note, }, next); }, function (next) { - db.sortedSetAdd('uid:' + uid + ':moderation:notes', noteData.timestamp, noteData.timestamp, next); + db.sortedSetAdd(`uid:${uid}:moderation:notes`, noteData.timestamp, noteData.timestamp, next); }, ], next); }, next); diff --git a/src/upgrades/1.12.3/give_mod_info_privilege.js b/src/upgrades/1.12.3/give_mod_info_privilege.js index 314268ba1d..bcb49b5bc2 100644 --- a/src/upgrades/1.12.3/give_mod_info_privilege.js +++ b/src/upgrades/1.12.3/give_mod_info_privilege.js @@ -32,7 +32,7 @@ module.exports = { function givePrivsToModerators(cid, groupPrefix, callback) { async.waterfall([ function (next) { - db.getSortedSetRevRange('group:cid:' + cid + ':privileges:' + groupPrefix + 'moderate:members', 0, -1, next); + db.getSortedSetRevRange(`group:cid:${cid}:privileges:${groupPrefix}moderate:members`, 0, -1, next); }, function (members, next) { async.eachSeries(members, function (member, next) { diff --git a/src/upgrades/1.12.3/give_mod_privileges.js b/src/upgrades/1.12.3/give_mod_privileges.js index f692108e21..c8d0fcda7d 100644 --- a/src/upgrades/1.12.3/give_mod_privileges.js +++ b/src/upgrades/1.12.3/give_mod_privileges.js @@ -57,7 +57,7 @@ module.exports = { givePrivsToModerators(cid, 'groups:', next); }, function (next) { - privileges.categories.give(modPrivileges.map(p => 'groups:' + p), cid, ['Global Moderators'], next); + privileges.categories.give(modPrivileges.map(p => `groups:${p}`), cid, ['Global Moderators'], next); }, ], next); }, next); @@ -69,12 +69,12 @@ module.exports = { function givePrivsToModerators(cid, groupPrefix, callback) { const privGroups = modPrivileges.map(function (priv) { - return 'cid:' + cid + ':privileges:' + groupPrefix + priv; + return `cid:${cid}:privileges:${groupPrefix}${priv}`; }); async.waterfall([ function (next) { - db.getSortedSetRevRange('group:cid:' + cid + ':privileges:' + groupPrefix + 'moderate:members', 0, -1, next); + db.getSortedSetRevRange(`group:cid:${cid}:privileges:${groupPrefix}moderate:members`, 0, -1, next); }, function (members, next) { async.eachSeries(members, function (member, next) { diff --git a/src/upgrades/1.12.3/user_pid_sets.js b/src/upgrades/1.12.3/user_pid_sets.js index 615d702c3c..ac85abdb5e 100644 --- a/src/upgrades/1.12.3/user_pid_sets.js +++ b/src/upgrades/1.12.3/user_pid_sets.js @@ -29,9 +29,9 @@ module.exports = { const bulk = []; postData.forEach(function (p, index) { if (p && p.uid && p.pid && p.tid && p.timestamp) { - bulk.push(['cid:' + topicData[index].cid + ':uid:' + p.uid + ':pids', p.timestamp, p.pid]); + bulk.push([`cid:${topicData[index].cid}:uid:${p.uid}:pids`, p.timestamp, p.pid]); if (p.votes > 0) { - bulk.push(['cid:' + topicData[index].cid + ':uid:' + p.uid + ':pids:votes', p.votes, p.pid]); + bulk.push([`cid:${topicData[index].cid}:uid:${p.uid}:pids:votes`, p.votes, p.pid]); } } }); diff --git a/src/upgrades/1.13.0/clean_flag_byCid.js b/src/upgrades/1.13.0/clean_flag_byCid.js index ab350c417e..7da4891337 100644 --- a/src/upgrades/1.13.0/clean_flag_byCid.js +++ b/src/upgrades/1.13.0/clean_flag_byCid.js @@ -11,11 +11,11 @@ module.exports = { await batch.processSortedSet('flags:datetime', async function (flagIds) { progress.incr(flagIds.length); - const flagData = await db.getObjects(flagIds.map(id => 'flag:' + id)); + const flagData = await db.getObjects(flagIds.map(id => `flag:${id}`)); const bulkRemove = []; for (const flagObj of flagData) { if (flagObj && flagObj.type === 'user' && flagObj.targetId && flagObj.flagId) { - bulkRemove.push(['flags:byCid:' + flagObj.targetId, flagObj.flagId]); + bulkRemove.push([`flags:byCid:${flagObj.targetId}`, flagObj.flagId]); } } diff --git a/src/upgrades/1.13.0/clean_post_topic_hash.js b/src/upgrades/1.13.0/clean_post_topic_hash.js index 8b35b50dac..30a5038d53 100644 --- a/src/upgrades/1.13.0/clean_post_topic_hash.js +++ b/src/upgrades/1.13.0/clean_post_topic_hash.js @@ -17,7 +17,7 @@ async function cleanPost(progress) { await batch.processSortedSet('posts:pid', async function (pids) { progress.incr(pids.length); - const postData = await db.getObjects(pids.map(pid => 'post:' + pid)); + const postData = await db.getObjects(pids.map(pid => `post:${pid}`)); await Promise.all(postData.map(async function (post) { if (!post) { return; @@ -46,7 +46,7 @@ async function cleanPost(progress) { }); if (fieldsToDelete.length) { - await db.deleteObjectFields('post:' + post.pid, fieldsToDelete); + await db.deleteObjectFields(`post:${post.pid}`, fieldsToDelete); } })); }, { @@ -58,7 +58,7 @@ async function cleanPost(progress) { async function cleanTopic(progress) { await batch.processSortedSet('topics:tid', async function (tids) { progress.incr(tids.length); - const topicData = await db.getObjects(tids.map(tid => 'topic:' + tid)); + const topicData = await db.getObjects(tids.map(tid => `topic:${tid}`)); await Promise.all(topicData.map(async function (topic) { if (!topic) { return; @@ -85,7 +85,7 @@ async function cleanTopic(progress) { }); if (fieldsToDelete.length) { - await db.deleteObjectFields('topic:' + topic.tid, fieldsToDelete); + await db.deleteObjectFields(`topic:${topic.tid}`, fieldsToDelete); } })); }, { diff --git a/src/upgrades/1.13.0/cleanup_old_notifications.js b/src/upgrades/1.13.0/cleanup_old_notifications.js index 95d446d810..dbd70eefb1 100644 --- a/src/upgrades/1.13.0/cleanup_old_notifications.js +++ b/src/upgrades/1.13.0/cleanup_old_notifications.js @@ -14,8 +14,8 @@ module.exports = { await batch.processSortedSet('users:joindate', async function (uids) { progress.incr(uids.length); await Promise.all([ - db.sortedSetsRemoveRangeByScore(uids.map(uid => 'uid:' + uid + ':notifications:unread'), '-inf', cutoffTime), - db.sortedSetsRemoveRangeByScore(uids.map(uid => 'uid:' + uid + ':notifications:read'), '-inf', cutoffTime), + db.sortedSetsRemoveRangeByScore(uids.map(uid => `uid:${uid}:notifications:unread`), '-inf', cutoffTime), + db.sortedSetsRemoveRangeByScore(uids.map(uid => `uid:${uid}:notifications:read`), '-inf', cutoffTime), ]); const userData = await user.getUsersData(uids); await Promise.all(userData.map(async function (user) { @@ -40,7 +40,7 @@ module.exports = { fields.push('icon:bgColor'); } if (fields.length) { - await db.deleteObjectFields('user:' + user.uid, fields); + await db.deleteObjectFields(`user:${user.uid}`, fields); } })); }, { diff --git a/src/upgrades/1.13.3/fix_users_sorted_sets.js b/src/upgrades/1.13.3/fix_users_sorted_sets.js index 9cf90bd855..0e5a0da746 100644 --- a/src/upgrades/1.13.3/fix_users_sorted_sets.js +++ b/src/upgrades/1.13.3/fix_users_sorted_sets.js @@ -27,7 +27,7 @@ module.exports = { await batch.processArray(allUids, async function (uids) { progress.incr(uids.length); - const userData = await db.getObjects(uids.map(id => 'user:' + id)); + const userData = await db.getObjects(uids.map(id => `user:${id}`)); await Promise.all(userData.map(async function (userData, index) { if (!userData || !userData.uid) { @@ -38,7 +38,7 @@ module.exports = { 'users:flags', ], uids[index]); if (userData && !userData.uid) { - await db.delete('user:' + uids[index]); + await db.delete(`user:${uids[index]}`); } return; } diff --git a/src/upgrades/1.14.0/fix_category_image_field.js b/src/upgrades/1.14.0/fix_category_image_field.js index 10c2e6025d..d27ad11064 100644 --- a/src/upgrades/1.14.0/fix_category_image_field.js +++ b/src/upgrades/1.14.0/fix_category_image_field.js @@ -8,14 +8,14 @@ module.exports = { method: async () => { const batch = require('../../batch'); await batch.processSortedSet('categories:cid', async function (cids) { - let categoryData = await db.getObjects(cids.map(c => 'category:' + c)); + let categoryData = await db.getObjects(cids.map(c => `category:${c}`)); categoryData = categoryData.filter(c => c && (c.image || c.backgroundImage)); if (categoryData.length) { await Promise.all(categoryData.map(async (data) => { if (data.image && !data.backgroundImage) { - await db.setObjectField('category:' + data.cid, 'backgroundImage', data.image); + await db.setObjectField(`category:${data.cid}`, 'backgroundImage', data.image); } - await db.deleteObjectField('category:' + data.cid, 'image', data.image); + await db.deleteObjectField(`category:${data.cid}`, 'image', data.image); })); } }, { batch: 500 }); diff --git a/src/upgrades/1.14.1/readd_deleted_recent_topics.js b/src/upgrades/1.14.1/readd_deleted_recent_topics.js index d2a413a514..9015dce26e 100644 --- a/src/upgrades/1.14.1/readd_deleted_recent_topics.js +++ b/src/upgrades/1.14.1/readd_deleted_recent_topics.js @@ -13,7 +13,7 @@ module.exports = { await batch.processSortedSet('topics:tid', async function (tids) { progress.incr(tids.length); const topicData = await db.getObjectsFields( - tids.map(tid => 'topic:' + tid), + tids.map(tid => `topic:${tid}`), ['tid', 'lastposttime', 'viewcount', 'postcount', 'upvotes', 'downvotes'] ); if (!topicData.tid) { diff --git a/src/upgrades/1.15.0/add_target_uid_to_flags.js b/src/upgrades/1.15.0/add_target_uid_to_flags.js index 961231fc8d..d70c8d4187 100644 --- a/src/upgrades/1.15.0/add_target_uid_to_flags.js +++ b/src/upgrades/1.15.0/add_target_uid_to_flags.js @@ -12,7 +12,7 @@ module.exports = { await batch.processSortedSet('flags:datetime', async function (flagIds) { progress.incr(flagIds.length); - const flagData = await db.getObjects(flagIds.map(id => 'flag:' + id)); + const flagData = await db.getObjects(flagIds.map(id => `flag:${id}`)); for (const flagObj of flagData) { /* eslint-disable no-await-in-loop */ if (flagObj) { @@ -21,10 +21,10 @@ module.exports = { if (flagObj.type === 'post') { const targetUid = await posts.getPostField(targetId, 'uid'); if (targetUid) { - await db.setObjectField('flag:' + flagObj.flagId, 'targetUid', targetUid); + await db.setObjectField(`flag:${flagObj.flagId}`, 'targetUid', targetUid); } } else if (flagObj.type === 'user') { - await db.setObjectField('flag:' + flagObj.flagId, 'targetUid', targetId); + await db.setObjectField(`flag:${flagObj.flagId}`, 'targetUid', targetId); } } } diff --git a/src/upgrades/1.15.0/fix_category_colors.js b/src/upgrades/1.15.0/fix_category_colors.js index d773105d54..16e6253fe1 100644 --- a/src/upgrades/1.15.0/fix_category_colors.js +++ b/src/upgrades/1.15.0/fix_category_colors.js @@ -8,12 +8,12 @@ module.exports = { method: async () => { const batch = require('../../batch'); await batch.processSortedSet('categories:cid', async function (cids) { - let categoryData = await db.getObjects(cids.map(c => 'category:' + c)); + let categoryData = await db.getObjects(cids.map(c => `category:${c}`)); categoryData = categoryData.filter(c => c && (c.color === '#fff' || c.color === '#333' || String(c.color).length !== 7)); if (categoryData.length) { await Promise.all(categoryData.map(async (data) => { - const color = '#' + new Array(6).fill((data.color && data.color[1]) || 'f').join(''); - await db.setObjectField('category:' + data.cid, 'color', color); + const color = `#${new Array(6).fill((data.color && data.color[1]) || 'f').join('')}`; + await db.setObjectField(`category:${data.cid}`, 'color', color); })); } }, { batch: 500 }); diff --git a/src/upgrades/1.15.0/fullname_search_set.js b/src/upgrades/1.15.0/fullname_search_set.js index c3955226bd..b761e846cc 100644 --- a/src/upgrades/1.15.0/fullname_search_set.js +++ b/src/upgrades/1.15.0/fullname_search_set.js @@ -16,7 +16,7 @@ module.exports = { const userData = await user.getUsersFields(uids, ['uid', 'fullname']); const bulkAdd = userData .filter(u => u.uid && u.fullname) - .map(u => ['fullname:sorted', 0, String(u.fullname).substr(0, 255).toLowerCase() + ':' + u.uid]); + .map(u => ['fullname:sorted', 0, `${String(u.fullname).substr(0, 255).toLowerCase()}:${u.uid}`]); await db.sortedSetAddBulk(bulkAdd); }, { batch: 500, diff --git a/src/upgrades/1.15.0/topic_poster_count.js b/src/upgrades/1.15.0/topic_poster_count.js index b07111c800..b25473ab19 100644 --- a/src/upgrades/1.15.0/topic_poster_count.js +++ b/src/upgrades/1.15.0/topic_poster_count.js @@ -12,13 +12,13 @@ module.exports = { await batch.processSortedSet('topics:tid', async function (tids) { progress.incr(tids.length); - const keys = tids.map(tid => 'tid:' + tid + ':posters'); + const keys = tids.map(tid => `tid:${tid}:posters`); await db.sortedSetsRemoveRangeByScore(keys, '-inf', 0); const counts = await db.sortedSetsCard(keys); for (let i = 0; i < tids.length; i++) { if (counts[i] > 0) { // eslint-disable-next-line no-await-in-loop - await db.setObjectField('topic:' + tids[i], 'postercount', counts[i]); + await db.setObjectField(`topic:${tids[i]}`, 'postercount', counts[i]); } } }, { diff --git a/src/upgrades/1.15.4/clear_purged_replies.js b/src/upgrades/1.15.4/clear_purged_replies.js index df4655116d..7401e9defb 100644 --- a/src/upgrades/1.15.4/clear_purged_replies.js +++ b/src/upgrades/1.15.4/clear_purged_replies.js @@ -13,18 +13,18 @@ module.exports = { await batch.processSortedSet('posts:pid', async function (pids) { progress.incr(pids.length); - let postData = await db.getObjects(pids.map(pid => 'post:' + pid)); + let postData = await db.getObjects(pids.map(pid => `post:${pid}`)); postData = postData.filter(p => p && parseInt(p.toPid, 10)); if (!postData.length) { return; } const toPids = postData.map(p => p.toPid); - const exists = await db.exists(toPids.map(pid => 'post:' + pid)); + const exists = await db.exists(toPids.map(pid => `post:${pid}`)); const pidsToDelete = postData.filter((p, index) => !exists[index]).map(p => p.pid); - await db.deleteObjectFields(pidsToDelete.map(pid => 'post:' + pid), ['toPid']); + await db.deleteObjectFields(pidsToDelete.map(pid => `post:${pid}`), ['toPid']); const repliesToDelete = _.uniq(toPids.filter((pid, index) => !exists[index])); - await db.deleteAll(repliesToDelete.map(pid => 'pid:' + pid + ':replies')); + await db.deleteAll(repliesToDelete.map(pid => `pid:${pid}:replies`)); }, { progress: progress, batchSize: 500, diff --git a/src/upgrades/1.16.0/category_tags.js b/src/upgrades/1.16.0/category_tags.js index ae6e204908..3dfd380d19 100644 --- a/src/upgrades/1.16.0/category_tags.js +++ b/src/upgrades/1.16.0/category_tags.js @@ -21,9 +21,9 @@ module.exports = { if (tags.length) { const cid = topicData.cid; await async.eachSeries(tags, async function (tag) { - await db.sortedSetAdd('cid:' + cid + ':tag:' + tag + ':topics', topicData.timestamp, tid); - const count = await db.sortedSetCard('cid:' + cid + ':tag:' + tag + ':topics'); - await db.sortedSetAdd('cid:' + cid + ':tags', count, tag); + await db.sortedSetAdd(`cid:${cid}:tag:${tag}:topics`, topicData.timestamp, tid); + const count = await db.sortedSetCard(`cid:${cid}:tag:${tag}:topics`); + await db.sortedSetAdd(`cid:${cid}:tags`, count, tag); }); } diff --git a/src/upgrades/1.17.0/category_name_zset.js b/src/upgrades/1.17.0/category_name_zset.js index 8caa44ee36..1c2017a6ab 100644 --- a/src/upgrades/1.17.0/category_name_zset.js +++ b/src/upgrades/1.17.0/category_name_zset.js @@ -10,14 +10,14 @@ module.exports = { const progress = this.progress; await batch.processSortedSet('categories:cid', async function (cids) { - const keys = cids.map(cid => 'category:' + cid); + const keys = cids.map(cid => `category:${cid}`); let categoryData = await db.getObjectsFields(keys, ['cid', 'name']); categoryData = categoryData.filter(c => c.cid && c.name); const bulkAdd = categoryData.map(function (cat) { return [ 'categories:name', 0, - String(cat.name).substr(0, 200).toLowerCase() + ':' + cat.cid, + `${String(cat.name).substr(0, 200).toLowerCase()}:${cat.cid}`, ]; }); await db.sortedSetAddBulk(bulkAdd); diff --git a/src/upgrades/1.17.0/subcategories_per_page.js b/src/upgrades/1.17.0/subcategories_per_page.js index 344df5d699..194105ce09 100644 --- a/src/upgrades/1.17.0/subcategories_per_page.js +++ b/src/upgrades/1.17.0/subcategories_per_page.js @@ -10,7 +10,7 @@ module.exports = { const progress = this.progress; await batch.processSortedSet('categories:cid', async function (cids) { - const keys = cids.map(cid => 'category:' + cid); + const keys = cids.map(cid => `category:${cid}`); await db.setObject(keys, { subCategoriesPerPage: 10, }); diff --git a/src/upgrades/1.17.0/topic_thumb_count.js b/src/upgrades/1.17.0/topic_thumb_count.js index f6c5242ff8..f565c076c4 100644 --- a/src/upgrades/1.17.0/topic_thumb_count.js +++ b/src/upgrades/1.17.0/topic_thumb_count.js @@ -11,12 +11,12 @@ module.exports = { const progress = this.progress; await batch.processSortedSet('topics:tid', async function (tids) { - const keys = tids.map(tid => 'topic:' + tid + ':thumbs'); + const keys = tids.map(tid => `topic:${tid}:thumbs`); const counts = await db.sortedSetsCard(keys); const tidToCount = _.zip(tids, counts); const tidsWithThumbs = tids.filter((t, i) => counts[i] > 0); await db.setObjectBulk( - tidsWithThumbs.map(tid => 'topic:' + tid), + tidsWithThumbs.map(tid => `topic:${tid}`), tidsWithThumbs.map(tid => ({ numThumbs: tidToCount[tid] })) ); diff --git a/src/upgrades/1.2.0/category_recent_tids.js b/src/upgrades/1.2.0/category_recent_tids.js index 16f34d2452..d95850db73 100644 --- a/src/upgrades/1.2.0/category_recent_tids.js +++ b/src/upgrades/1.2.0/category_recent_tids.js @@ -14,15 +14,15 @@ module.exports = { } async.eachSeries(cids, function (cid, next) { - db.getSortedSetRevRange('cid:' + cid + ':pids', 0, 0, function (err, pid) { + db.getSortedSetRevRange(`cid:${cid}:pids`, 0, 0, function (err, pid) { if (err || !pid) { return next(err); } - db.getObjectFields('post:' + pid, ['tid', 'timestamp'], function (err, postData) { + db.getObjectFields(`post:${pid}`, ['tid', 'timestamp'], function (err, postData) { if (err || !postData || !postData.tid) { return next(err); } - db.sortedSetAdd('cid:' + cid + ':recent_tids', postData.timestamp, postData.tid, next); + db.sortedSetAdd(`cid:${cid}:recent_tids`, postData.timestamp, postData.tid, next); }); }); }, callback); diff --git a/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.js b/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.js index a4910881bd..a65d340138 100644 --- a/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.js +++ b/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.js @@ -31,11 +31,11 @@ module.exports = { async.eachSeries(groups, function (group, next) { if (group.privileges['groups:topics:reply']) { return async.parallel([ - async.apply(groupsAPI.join, 'cid:' + cid + ':privileges:groups:posts:edit', group.name), - async.apply(groupsAPI.join, 'cid:' + cid + ':privileges:groups:posts:delete', group.name), + async.apply(groupsAPI.join, `cid:${cid}:privileges:groups:posts:edit`, group.name), + async.apply(groupsAPI.join, `cid:${cid}:privileges:groups:posts:delete`, group.name), ], function (err) { if (!err) { - winston.verbose('cid:' + cid + ':privileges:groups:posts:edit, cid:' + cid + ':privileges:groups:posts:delete granted to gid: ' + group.name); + winston.verbose(`cid:${cid}:privileges:groups:posts:edit, cid:${cid}:privileges:groups:posts:delete granted to gid: ${group.name}`); } return next(err); @@ -48,9 +48,9 @@ module.exports = { function (next) { async.eachSeries(groups, function (group, next) { if (group.privileges['groups:topics:create']) { - return groupsAPI.join('cid:' + cid + ':privileges:groups:topics:delete', group.name, function (err) { + return groupsAPI.join(`cid:${cid}:privileges:groups:topics:delete`, group.name, function (err) { if (!err) { - winston.verbose('cid:' + cid + ':privileges:groups:topics:delete granted to gid: ' + group.name); + winston.verbose(`cid:${cid}:privileges:groups:topics:delete granted to gid: ${group.name}`); } return next(err); @@ -64,11 +64,11 @@ module.exports = { async.eachSeries(users, function (user, next) { if (user.privileges['topics:reply']) { return async.parallel([ - async.apply(groupsAPI.join, 'cid:' + cid + ':privileges:posts:edit', user.uid), - async.apply(groupsAPI.join, 'cid:' + cid + ':privileges:posts:delete', user.uid), + async.apply(groupsAPI.join, `cid:${cid}:privileges:posts:edit`, user.uid), + async.apply(groupsAPI.join, `cid:${cid}:privileges:posts:delete`, user.uid), ], function (err) { if (!err) { - winston.verbose('cid:' + cid + ':privileges:posts:edit, cid:' + cid + ':privileges:posts:delete granted to uid: ' + user.uid); + winston.verbose(`cid:${cid}:privileges:posts:edit, cid:${cid}:privileges:posts:delete granted to uid: ${user.uid}`); } return next(err); @@ -81,9 +81,9 @@ module.exports = { function (next) { async.eachSeries(users, function (user, next) { if (user.privileges['topics:create']) { - return groupsAPI.join('cid:' + cid + ':privileges:topics:delete', user.uid, function (err) { + return groupsAPI.join(`cid:${cid}:privileges:topics:delete`, user.uid, function (err) { if (!err) { - winston.verbose('cid:' + cid + ':privileges:topics:delete granted to uid: ' + user.uid); + winston.verbose(`cid:${cid}:privileges:topics:delete granted to uid: ${user.uid}`); } return next(err); @@ -95,7 +95,7 @@ module.exports = { }, ], function (err) { if (!err) { - winston.verbose('-- cid ' + cid + ' upgraded'); + winston.verbose(`-- cid ${cid} upgraded`); } next(err); diff --git a/src/upgrades/1.3.0/favourites_to_bookmarks.js b/src/upgrades/1.3.0/favourites_to_bookmarks.js index a609969be3..86c31aa2a0 100644 --- a/src/upgrades/1.3.0/favourites_to_bookmarks.js +++ b/src/upgrades/1.3.0/favourites_to_bookmarks.js @@ -19,20 +19,20 @@ module.exports = { async.waterfall([ function (next) { - db.rename('pid:' + id + ':users_favourited', 'pid:' + id + ':users_bookmarked', next); + db.rename(`pid:${id}:users_favourited`, `pid:${id}:users_bookmarked`, next); }, function (next) { - db.getObjectField('post:' + id, 'reputation', next); + db.getObjectField(`post:${id}`, 'reputation', next); }, function (reputation, next) { if (parseInt(reputation, 10)) { - db.setObjectField('post:' + id, 'bookmarks', reputation, next); + db.setObjectField(`post:${id}`, 'bookmarks', reputation, next); } else { next(); } }, function (next) { - db.deleteObjectField('post:' + id, 'reputation', next); + db.deleteObjectField(`post:${id}`, 'reputation', next); }, ], next); }, next); @@ -46,7 +46,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (id, next) { - db.rename('uid:' + id + ':favourites', 'uid:' + id + ':bookmarks', next); + db.rename(`uid:${id}:favourites`, `uid:${id}:bookmarks`, next); }, next); }, {}, next); } diff --git a/src/upgrades/1.3.0/sorted_sets_for_post_replies.js b/src/upgrades/1.3.0/sorted_sets_for_post_replies.js index 401daf4a4a..d3503414eb 100644 --- a/src/upgrades/1.3.0/sorted_sets_for_post_replies.js +++ b/src/upgrades/1.3.0/sorted_sets_for_post_replies.js @@ -25,10 +25,10 @@ module.exports = { if (!parseInt(postData.toPid, 10)) { return next(null); } - winston.verbose('processing pid: ' + postData.pid + ' toPid: ' + postData.toPid); + winston.verbose(`processing pid: ${postData.pid} toPid: ${postData.toPid}`); async.parallel([ - async.apply(db.sortedSetAdd, 'pid:' + postData.toPid + ':replies', postData.timestamp, postData.pid), - async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies'), + async.apply(db.sortedSetAdd, `pid:${postData.toPid}:replies`, postData.timestamp, postData.pid), + async.apply(db.incrObjectField, `post:${postData.toPid}`, 'replies'), ], next); }, next); }); diff --git a/src/upgrades/1.4.0/global_and_user_language_keys.js b/src/upgrades/1.4.0/global_and_user_language_keys.js index dac4a216b4..cfa01d9bd1 100644 --- a/src/upgrades/1.4.0/global_and_user_language_keys.js +++ b/src/upgrades/1.4.0/global_and_user_language_keys.js @@ -35,7 +35,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (uid, next) { async.waterfall([ - async.apply(db.getObjectField, 'user:' + uid + ':settings', 'userLang'), + async.apply(db.getObjectField, `user:${uid}:settings`, 'userLang'), function (language, next) { if (!language) { return setImmediate(next); diff --git a/src/upgrades/1.4.0/sorted_set_for_pinned_topics.js b/src/upgrades/1.4.0/sorted_set_for_pinned_topics.js index 273b08b413..1320bd041a 100644 --- a/src/upgrades/1.4.0/sorted_set_for_pinned_topics.js +++ b/src/upgrades/1.4.0/sorted_set_for_pinned_topics.js @@ -22,12 +22,12 @@ module.exports = { }); async.eachSeries(data, function (topicData, next) { - winston.verbose('processing tid: ' + topicData.tid); + winston.verbose(`processing tid: ${topicData.tid}`); async.parallel([ - async.apply(db.sortedSetAdd, 'cid:' + topicData.cid + ':tids:pinned', Date.now(), topicData.tid), - async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids', topicData.tid), - async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids:posts', topicData.tid), + async.apply(db.sortedSetAdd, `cid:${topicData.cid}:tids:pinned`, Date.now(), topicData.tid), + async.apply(db.sortedSetRemove, `cid:${topicData.cid}:tids`, topicData.tid), + async.apply(db.sortedSetRemove, `cid:${topicData.cid}:tids:posts`, topicData.tid), ], next); }, next); }); diff --git a/src/upgrades/1.4.4/sound_settings.js b/src/upgrades/1.4.4/sound_settings.js index fb86f7bbd7..7d1225eccb 100644 --- a/src/upgrades/1.4.4/sound_settings.js +++ b/src/upgrades/1.4.4/sound_settings.js @@ -40,7 +40,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (uid, next) { - db.getObject('user:' + uid + ':settings', function (err, settings) { + db.getObject(`user:${uid}:settings`, function (err, settings) { if (err || !settings) { return next(err); } @@ -52,7 +52,7 @@ module.exports = { }); if (Object.keys(newSettings).length) { - db.setObject('user:' + uid + ':settings', newSettings, next); + db.setObject(`user:${uid}:settings`, newSettings, next); } else { setImmediate(next); } diff --git a/src/upgrades/1.5.0/flags_refactor.js b/src/upgrades/1.5.0/flags_refactor.js index 2173ab17b7..5608ab3ec1 100644 --- a/src/upgrades/1.5.0/flags_refactor.js +++ b/src/upgrades/1.5.0/flags_refactor.js @@ -27,8 +27,8 @@ module.exports = { progress.incr(); async.parallel({ - uids: async.apply(db.getSortedSetRangeWithScores, 'pid:' + post.pid + ':flag:uids', 0, -1), - reasons: async.apply(db.getSortedSetRange, 'pid:' + post.pid + ':flag:uid:reason', 0, -1), + uids: async.apply(db.getSortedSetRangeWithScores, `pid:${post.pid}:flag:uids`, 0, -1), + reasons: async.apply(db.getSortedSetRange, `pid:${post.pid}:flag:uid:reason`, 0, -1), }, function (err, data) { if (err) { return next(err); diff --git a/src/upgrades/1.5.0/moderation_history_refactor.js b/src/upgrades/1.5.0/moderation_history_refactor.js index 5eadfe46ea..50f528b1dd 100644 --- a/src/upgrades/1.5.0/moderation_history_refactor.js +++ b/src/upgrades/1.5.0/moderation_history_refactor.js @@ -13,7 +13,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (uid, next) { - db.getObjectField('user:' + uid, 'moderationNote', function (err, moderationNote) { + db.getObjectField(`user:${uid}`, 'moderationNote', function (err, moderationNote) { if (err || !moderationNote) { progress.incr(); return next(err); @@ -25,7 +25,7 @@ module.exports = { }; progress.incr(); - db.sortedSetAdd('uid:' + uid + ':moderation:notes', note.timestamp, JSON.stringify(note), next); + db.sortedSetAdd(`uid:${uid}:moderation:notes`, note.timestamp, JSON.stringify(note), next); }); }, next); }, { diff --git a/src/upgrades/1.5.0/post_votes_zset.js b/src/upgrades/1.5.0/post_votes_zset.js index dca19bc730..c25d9e58ee 100644 --- a/src/upgrades/1.5.0/post_votes_zset.js +++ b/src/upgrades/1.5.0/post_votes_zset.js @@ -12,7 +12,7 @@ module.exports = { require('../../batch').processSortedSet('posts:pid', function (pids, next) { async.each(pids, function (pid, next) { - db.getObjectFields('post:' + pid, ['upvotes', 'downvotes'], function (err, postData) { + db.getObjectFields(`post:${pid}`, ['upvotes', 'downvotes'], function (err, postData) { if (err || !postData) { return next(err); } diff --git a/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.js b/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.js index 0d228efaf8..e85d79c8d3 100644 --- a/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.js +++ b/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.js @@ -15,7 +15,7 @@ module.exports = { async.each(ids, function (uid, cb) { async.waterfall([ function (next) { - db.getObjectField('user:' + uid, 'cover:url', next); + db.getObjectField(`user:${uid}`, 'cover:url', next); }, function (url, next) { progress.incr(); @@ -25,7 +25,7 @@ module.exports = { } var newUrl = url.replace(/^.*?\/uploads\//, '/assets/uploads/'); - db.setObjectField('user:' + uid, 'cover:url', newUrl, next); + db.setObjectField(`user:${uid}`, 'cover:url', newUrl, next); }, ], cb); }, done); diff --git a/src/upgrades/1.5.1/rename_mods_group.js b/src/upgrades/1.5.1/rename_mods_group.js index 9c46947099..a15e293d74 100644 --- a/src/upgrades/1.5.1/rename_mods_group.js +++ b/src/upgrades/1.5.1/rename_mods_group.js @@ -14,14 +14,14 @@ module.exports = { var progress = this.progress; batch.processSortedSet('categories:cid', function (cids, next) { async.eachSeries(cids, function (cid, next) { - var groupName = 'cid:' + cid + ':privileges:mods'; - var newName = 'cid:' + cid + ':privileges:moderate'; + var groupName = `cid:${cid}:privileges:mods`; + var newName = `cid:${cid}:privileges:moderate`; groups.exists(groupName, function (err, exists) { if (err || !exists) { progress.incr(); return next(err); } - winston.verbose('renaming ' + groupName + ' to ' + newName); + winston.verbose(`renaming ${groupName} to ${newName}`); progress.incr(); groups.renameGroup(groupName, newName, next); }); diff --git a/src/upgrades/1.5.2/rss_token_wipe.js b/src/upgrades/1.5.2/rss_token_wipe.js index 2bfa9cd02b..2ef8a67f14 100644 --- a/src/upgrades/1.5.2/rss_token_wipe.js +++ b/src/upgrades/1.5.2/rss_token_wipe.js @@ -13,7 +13,7 @@ module.exports = { batch.processSortedSet('users:joindate', function (uids, next) { async.eachLimit(uids, 500, function (uid, next) { progress.incr(); - db.deleteObjectField('user:' + uid, 'rss_token', next); + db.deleteObjectField(`user:${uid}`, 'rss_token', next); }, next); }, { progress: progress, diff --git a/src/upgrades/1.6.2/topics_lastposttime_zset.js b/src/upgrades/1.6.2/topics_lastposttime_zset.js index 8e12b1744a..c100df32ee 100644 --- a/src/upgrades/1.6.2/topics_lastposttime_zset.js +++ b/src/upgrades/1.6.2/topics_lastposttime_zset.js @@ -12,14 +12,14 @@ module.exports = { require('../../batch').processSortedSet('topics:tid', function (tids, next) { async.eachSeries(tids, function (tid, next) { - db.getObjectFields('topic:' + tid, ['cid', 'timestamp', 'lastposttime'], function (err, topicData) { + db.getObjectFields(`topic:${tid}`, ['cid', 'timestamp', 'lastposttime'], function (err, topicData) { if (err || !topicData) { return next(err); } progress.incr(); var timestamp = topicData.lastposttime || topicData.timestamp || Date.now(); - db.sortedSetAdd('cid:' + topicData.cid + ':tids:lastposttime', timestamp, tid, next); + db.sortedSetAdd(`cid:${topicData.cid}:tids:lastposttime`, timestamp, tid, next); }, next); }, next); }, { diff --git a/src/upgrades/1.7.1/notification-settings.js b/src/upgrades/1.7.1/notification-settings.js index df6fe27404..d215e0b7aa 100644 --- a/src/upgrades/1.7.1/notification-settings.js +++ b/src/upgrades/1.7.1/notification-settings.js @@ -15,7 +15,7 @@ module.exports = { progress.incr(); async.waterfall([ function (next) { - db.getObjectFields('user:' + uid + ':settings', ['sendChatNotifications', 'sendPostNotifications'], next); + db.getObjectFields(`user:${uid}:settings`, ['sendChatNotifications', 'sendPostNotifications'], next); }, function (userSettings, _next) { if (!userSettings) { @@ -23,10 +23,10 @@ module.exports = { } var tasks = []; if (parseInt(userSettings.sendChatNotifications, 10) === 1) { - tasks.push(async.apply(db.setObjectField, 'user:' + uid + ':settings', 'notificationType_new-chat', 'notificationemail')); + tasks.push(async.apply(db.setObjectField, `user:${uid}:settings`, 'notificationType_new-chat', 'notificationemail')); } if (parseInt(userSettings.sendPostNotifications, 10) === 1) { - tasks.push(async.apply(db.setObjectField, 'user:' + uid + ':settings', 'notificationType_new-reply', 'notificationemail')); + tasks.push(async.apply(db.setObjectField, `user:${uid}:settings`, 'notificationType_new-reply', 'notificationemail')); } if (!tasks.length) { return next(); @@ -37,7 +37,7 @@ module.exports = { }); }, function (next) { - db.deleteObjectFields('user:' + uid + ':settings', ['sendChatNotifications', 'sendPostNotifications'], next); + db.deleteObjectFields(`user:${uid}:settings`, ['sendChatNotifications', 'sendPostNotifications'], next); }, ], next); }, next); diff --git a/src/upgrades/1.7.3/topic_votes.js b/src/upgrades/1.7.3/topic_votes.js index 7e360286a9..3c608606b8 100644 --- a/src/upgrades/1.7.3/topic_votes.js +++ b/src/upgrades/1.7.3/topic_votes.js @@ -16,14 +16,14 @@ module.exports = { var topicData; async.waterfall([ function (next) { - db.getObjectFields('topic:' + tid, ['mainPid', 'cid', 'pinned'], next); + db.getObjectFields(`topic:${tid}`, ['mainPid', 'cid', 'pinned'], next); }, function (_topicData, next) { topicData = _topicData; if (!topicData.mainPid || !topicData.cid) { return _next(); } - db.getObject('post:' + topicData.mainPid, next); + db.getObject(`post:${topicData.mainPid}`, next); }, function (postData, next) { if (!postData) { @@ -38,14 +38,14 @@ module.exports = { var votes = upvotes - downvotes; async.parallel([ function (next) { - db.setObject('topic:' + tid, data, next); + db.setObject(`topic:${tid}`, data, next); }, function (next) { db.sortedSetAdd('topics:votes', votes, tid, next); }, function (next) { if (parseInt(topicData.pinned, 10) !== 1) { - db.sortedSetAdd('cid:' + topicData.cid + ':tids:votes', votes, tid, next); + db.sortedSetAdd(`cid:${topicData.cid}:tids:votes`, votes, tid, next); } else { next(); } diff --git a/src/upgrades/1.7.4/fix_moved_topics_byvotes.js b/src/upgrades/1.7.4/fix_moved_topics_byvotes.js index c5f6121b95..9a11ebc5f2 100644 --- a/src/upgrades/1.7.4/fix_moved_topics_byvotes.js +++ b/src/upgrades/1.7.4/fix_moved_topics_byvotes.js @@ -16,7 +16,7 @@ module.exports = { var topicData; async.waterfall([ function (next) { - db.getObjectFields('topic:' + tid, ['cid', 'oldCid', 'upvotes', 'downvotes', 'pinned'], next); + db.getObjectFields(`topic:${tid}`, ['cid', 'oldCid', 'upvotes', 'downvotes', 'pinned'], next); }, function (_topicData, next) { topicData = _topicData; @@ -30,11 +30,11 @@ module.exports = { async.series([ function (next) { - db.sortedSetRemove('cid:' + topicData.oldCid + ':tids:votes', tid, next); + db.sortedSetRemove(`cid:${topicData.oldCid}:tids:votes`, tid, next); }, function (next) { if (parseInt(topicData.pinned, 10) !== 1) { - db.sortedSetAdd('cid:' + topicData.cid + ':tids:votes', votes, tid, next); + db.sortedSetAdd(`cid:${topicData.cid}:tids:votes`, votes, tid, next); } else { next(); } diff --git a/src/upgrades/1.7.4/fix_user_topics_per_category.js b/src/upgrades/1.7.4/fix_user_topics_per_category.js index bd963c6ea1..6347e9fd4b 100644 --- a/src/upgrades/1.7.4/fix_user_topics_per_category.js +++ b/src/upgrades/1.7.4/fix_user_topics_per_category.js @@ -16,7 +16,7 @@ module.exports = { var topicData; async.waterfall([ function (next) { - db.getObjectFields('topic:' + tid, ['cid', 'tid', 'uid', 'oldCid', 'timestamp'], next); + db.getObjectFields(`topic:${tid}`, ['cid', 'tid', 'uid', 'oldCid', 'timestamp'], next); }, function (_topicData, next) { topicData = _topicData; @@ -24,16 +24,16 @@ module.exports = { return _next(); } - db.isSortedSetMember('cid:' + topicData.oldCid + ':uid:' + topicData.uid, topicData.tid, next); + db.isSortedSetMember(`cid:${topicData.oldCid}:uid:${topicData.uid}`, topicData.tid, next); }, function (isMember, next) { if (isMember) { async.series([ function (next) { - db.sortedSetRemove('cid:' + topicData.oldCid + ':uid:' + topicData.uid + ':tids', tid, next); + db.sortedSetRemove(`cid:${topicData.oldCid}:uid:${topicData.uid}:tids`, tid, next); }, function (next) { - db.sortedSetAdd('cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids', topicData.timestamp, tid, next); + db.sortedSetAdd(`cid:${topicData.cid}:uid:${topicData.uid}:tids`, topicData.timestamp, tid, next); }, ], function (err) { next(err); diff --git a/src/upgrades/1.7.4/global_upload_privilege.js b/src/upgrades/1.7.4/global_upload_privilege.js index a7816c75b9..49be4a24bf 100644 --- a/src/upgrades/1.7.4/global_upload_privilege.js +++ b/src/upgrades/1.7.4/global_upload_privilege.js @@ -38,7 +38,7 @@ function getGroupPrivileges(cid, callback) { var tasks = {}; ['groups:upload:post:image', 'groups:upload:post:file'].forEach(function (privilege) { - tasks[privilege] = async.apply(groups.isMember, 'registered-users', 'cid:' + cid + ':privileges:' + privilege); + tasks[privilege] = async.apply(groups.isMember, 'registered-users', `cid:${cid}:privileges:${privilege}`); }); async.parallel(tasks, callback); diff --git a/src/upgrades/1.8.0/give_spiders_privileges.js b/src/upgrades/1.8.0/give_spiders_privileges.js index ea96b5ea02..18dbb722c5 100644 --- a/src/upgrades/1.8.0/give_spiders_privileges.js +++ b/src/upgrades/1.8.0/give_spiders_privileges.js @@ -42,7 +42,7 @@ function getGroupPrivileges(cid, callback) { var tasks = {}; ['groups:find', 'groups:read', 'groups:topics:read'].forEach(function (privilege) { - tasks[privilege] = async.apply(groups.isMember, 'guests', 'cid:' + cid + ':privileges:' + privilege); + tasks[privilege] = async.apply(groups.isMember, 'guests', `cid:${cid}:privileges:${privilege}`); }); async.parallel(tasks, callback); diff --git a/src/upgrades/1.8.1/diffs_zset_to_listhash.js b/src/upgrades/1.8.1/diffs_zset_to_listhash.js index a457514bef..e105c8df44 100644 --- a/src/upgrades/1.8.1/diffs_zset_to_listhash.js +++ b/src/upgrades/1.8.1/diffs_zset_to_listhash.js @@ -13,7 +13,7 @@ module.exports = { batch.processSortedSet('posts:pid', function (pids, next) { async.each(pids, function (pid, next) { - db.getSortedSetRangeWithScores('post:' + pid + ':diffs', 0, -1, function (err, diffs) { + db.getSortedSetRangeWithScores(`post:${pid}:diffs`, 0, -1, function (err, diffs) { if (err) { return next(err); } @@ -26,9 +26,9 @@ module.exports = { // For each diff, push to list async.each(diffs, function (diff, next) { async.series([ - async.apply(db.delete.bind(db), 'post:' + pid + ':diffs'), - async.apply(db.listPrepend.bind(db), 'post:' + pid + ':diffs', diff.score), - async.apply(db.setObject.bind(db), 'diff:' + pid + '.' + diff.score, { + async.apply(db.delete.bind(db), `post:${pid}:diffs`), + async.apply(db.listPrepend.bind(db), `post:${pid}:diffs`, diff.score), + async.apply(db.setObject.bind(db), `diff:${pid}.${diff.score}`, { pid: pid, patch: diff.value, }), diff --git a/src/user/admin.js b/src/user/admin.js index 45226bfe85..ec09aa7f6b 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -18,16 +18,16 @@ module.exports = function (User) { } const now = Date.now(); const bulk = [ - ['uid:' + uid + ':ip', now, ip || 'Unknown'], + [`uid:${uid}:ip`, now, ip || 'Unknown'], ]; if (ip) { - bulk.push(['ip:' + ip + ':uid', now, uid]); + bulk.push([`ip:${ip}:uid`, now, uid]); } await db.sortedSetAddBulk(bulk); }; User.getIPs = async function (uid, stop) { - const ips = await db.getSortedSetRevRange('uid:' + uid + ':ip', 0, stop); + const ips = await db.getSortedSetRevRange(`uid:${uid}:ip`, 0, stop); return ips.map(ip => validator.escape(String(ip))); }; @@ -35,11 +35,11 @@ module.exports = function (User) { winston.verbose('[user/getUsersCSV] Compiling User CSV data'); const data = await plugins.hooks.fire('filter:user.csvFields', { fields: ['uid', 'email', 'username'] }); - let csvContent = data.fields.join(',') + '\n'; + let csvContent = `${data.fields.join(',')}\n`; await batch.processSortedSet('users:joindate', async (uids) => { const usersData = await User.getUsersFields(uids, data.fields); csvContent += usersData.reduce((memo, user) => { - memo += data.fields.map(field => user[field]).join(',') + '\n'; + memo += `${data.fields.map(field => user[field]).join(',')}\n`; return memo; }, ''); }, {}); @@ -55,12 +55,12 @@ module.exports = function (User) { path.join(baseDir, 'build/export', 'users.csv'), 'w' ); - fs.promises.appendFile(fd, data.fields.join(',') + '\n'); + fs.promises.appendFile(fd, `${data.fields.join(',')}\n`); await batch.processSortedSet('users:joindate', async (uids) => { const usersData = await User.getUsersFields(uids, data.fields.slice()); let line = ''; usersData.forEach(function (user) { - line += data.fields.map(field => user[field]).join(',') + '\n'; + line += `${data.fields.map(field => user[field]).join(',')}\n`; }); await fs.promises.appendFile(fd, line); diff --git a/src/user/approval.js b/src/user/approval.js index 94514963e4..6074ab1728 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -30,7 +30,7 @@ module.exports = function (User) { hashedPassword: hashedPassword, }; const results = await plugins.hooks.fire('filter:user.addToApprovalQueue', { data: data, userData: userData }); - await db.setObject('registration:queue:name:' + userData.username, results.data); + await db.setObject(`registration:queue:name:${userData.username}`, results.data); await db.sortedSetAdd('registration:queue', Date.now(), userData.username); await sendNotificationToAdmins(userData.username); }; @@ -41,7 +41,7 @@ module.exports = function (User) { if (usernames.includes(userData.username)) { throw new Error('[[error:username-taken]]'); } - const keys = usernames.filter(Boolean).map(username => 'registration:queue:name:' + username); + const keys = usernames.filter(Boolean).map(username => `registration:queue:name:${username}`); const data = await db.getObjectsFields(keys, ['email']); const emails = data.map(data => data && data.email); if (emails.includes(userData.email)) { @@ -52,8 +52,8 @@ module.exports = function (User) { async function sendNotificationToAdmins(username) { const notifObj = await notifications.create({ type: 'new-register', - bodyShort: '[[notifications:new_register, ' + username + ']]', - nid: 'new_register:' + username, + bodyShort: `[[notifications:new_register, ${username}]]`, + nid: `new_register:${username}`, path: '/admin/manage/registration', mergeId: 'new_register', }); @@ -61,7 +61,7 @@ module.exports = function (User) { } User.acceptRegistration = async function (username) { - const userData = await db.getObject('registration:queue:name:' + username); + const userData = await db.getObject(`registration:queue:name:${username}`); if (!userData) { throw new Error('[[error:invalid-data]]'); } @@ -76,10 +76,10 @@ module.exports = function (User) { await plugins.hooks.fire('filter:register.complete', { uid: uid }); await emailer.send('registration_accepted', uid, { username: username, - subject: '[[email:welcome-to, ' + (meta.config.title || meta.config.browserTitle || 'NodeBB') + ']]', + subject: `[[email:welcome-to, ${meta.config.title || meta.config.browserTitle || 'NodeBB'}]]`, template: 'registration_accepted', uid: uid, - }).catch(err => winston.error('[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[emailer.send] ${err.stack}`)); const total = await db.incrObjectField('registration:queue:approval:times', 'totalTime', Math.floor((Date.now() - creation_time) / 60000)); const counter = await db.incrObjectField('registration:queue:approval:times', 'counter', 1); await db.setObjectField('registration:queue:approval:times', 'average', total / counter); @@ -87,7 +87,7 @@ module.exports = function (User) { }; async function markNotificationRead(username) { - const nid = 'new_register:' + username; + const nid = `new_register:${username}`; const uids = await groups.getMembers('administrators', 0, -1); const promises = uids.map(uid => notifications.markRead(nid, uid)); await Promise.all(promises); @@ -101,7 +101,7 @@ module.exports = function (User) { async function removeFromQueue(username) { await Promise.all([ db.sortedSetRemove('registration:queue', username), - db.delete('registration:queue:name:' + username), + db.delete(`registration:queue:name:${username}`), ]); } @@ -110,7 +110,7 @@ module.exports = function (User) { if (registrationApprovalType === 'admin-approval') { return true; } else if (registrationApprovalType === 'admin-approval-ip') { - const count = await db.sortedSetCard('ip:' + ip + ':uid'); + const count = await db.sortedSetCard(`ip:${ip}:uid`); return !!count; } return false; @@ -118,7 +118,7 @@ module.exports = function (User) { User.getRegistrationQueue = async function (start, stop) { const data = await db.getSortedSetRevRangeWithScores('registration:queue', start, stop); - const keys = data.filter(Boolean).map(user => 'registration:queue:name:' + user.value); + const keys = data.filter(Boolean).map(user => `registration:queue:name:${user.value}`); let users = await db.getObjects(keys); users = users.filter(Boolean).map(function (user, index) { user.timestampISO = utils.toISOString(data[index].score); @@ -149,7 +149,7 @@ module.exports = function (User) { }; async function getIPMatchedUsers(user) { - const uids = await User.getUidsFromSet('ip:' + user.ip + ':uid', 0, -1); + const uids = await User.getUidsFromSet(`ip:${user.ip}:uid`, 0, -1); user.ipMatch = await User.getUsersFields(uids, ['uid', 'username', 'picture']); } diff --git a/src/user/auth.js b/src/user/auth.js index fdf318d156..91d5b371aa 100644 --- a/src/user/auth.js +++ b/src/user/auth.js @@ -17,20 +17,20 @@ module.exports = function (User) { if (!(parseInt(uid, 10) > 0)) { return; } - const exists = await db.exists('lockout:' + uid); + const exists = await db.exists(`lockout:${uid}`); if (exists) { throw new Error('[[error:account-locked]]'); } - const attempts = await db.increment('loginAttempts:' + uid); + const attempts = await db.increment(`loginAttempts:${uid}`); if (attempts <= meta.config.loginAttempts) { - return await db.pexpire('loginAttempts:' + uid, 1000 * 60 * 60); + return await db.pexpire(`loginAttempts:${uid}`, 1000 * 60 * 60); } // Lock out the account - await db.set('lockout:' + uid, ''); + await db.set(`lockout:${uid}`, ''); const duration = 1000 * 60 * meta.config.lockoutDuration; - await db.delete('loginAttempts:' + uid); - await db.pexpire('lockout:' + uid, duration); + await db.delete(`loginAttempts:${uid}`); + await db.pexpire(`lockout:${uid}`, duration); await events.log({ type: 'account-locked', uid: uid, @@ -43,7 +43,7 @@ module.exports = function (User) { if (!(parseInt(uid, 10) > 0)) { return; } - const _token = await db.getObjectField('user:' + uid, 'rss_token'); + const _token = await db.getObjectField(`user:${uid}`, 'rss_token'); const token = _token || utils.generateUUID(); if (!_token) { await User.setUserField(uid, 'rss_token', token); @@ -52,13 +52,13 @@ module.exports = function (User) { }; User.auth.clearLoginAttempts = async function (uid) { - await db.delete('loginAttempts:' + uid); + await db.delete(`loginAttempts:${uid}`); }; User.auth.resetLockout = async function (uid) { await db.deleteAll([ - 'loginAttempts:' + uid, - 'lockout:' + uid, + `loginAttempts:${uid}`, + `lockout:${uid}`, ]); }; @@ -67,7 +67,7 @@ module.exports = function (User) { User.auth.getSessions = async function (uid, curSessionId) { await cleanExpiredSessions(uid); - const sids = await db.getSortedSetRevRange('uid:' + uid + ':sessions', 0, 19); + const sids = await db.getSortedSetRevRange(`uid:${uid}:sessions`, 0, 19); let sessions = await Promise.all(sids.map(sid => getSessionFromStore(sid))); sessions = sessions.map(function (sessObj, idx) { if (sessObj && sessObj.meta) { @@ -81,7 +81,7 @@ module.exports = function (User) { }; async function cleanExpiredSessions(uid) { - const uuidMapping = await db.getObject('uid:' + uid + ':sessionUUID:sessionId'); + const uuidMapping = await db.getObject(`uid:${uid}:sessionUUID:sessionId`); if (!uuidMapping) { return; } @@ -98,8 +98,8 @@ module.exports = function (User) { expiredSids.push(sid); } })); - await db.deleteObjectFields('uid:' + uid + ':sessionUUID:sessionId', expiredUUIDs); - await db.sortedSetRemove('uid:' + uid + ':sessions', expiredSids); + await db.deleteObjectFields(`uid:${uid}:sessionUUID:sessionId`, expiredUUIDs); + await db.sortedSetRemove(`uid:${uid}:sessions`, expiredSids); } User.auth.addSession = async function (uid, sessionId) { @@ -107,12 +107,12 @@ module.exports = function (User) { return; } await cleanExpiredSessions(uid); - await db.sortedSetAdd('uid:' + uid + ':sessions', Date.now(), sessionId); + await db.sortedSetAdd(`uid:${uid}:sessions`, Date.now(), sessionId); await revokeSessionsAboveThreshold(uid, meta.config.maxUserSessions); }; async function revokeSessionsAboveThreshold(uid, maxUserSessions) { - const activeSessions = await db.getSortedSetRange('uid:' + uid + ':sessions', 0, -1); + const activeSessions = await db.getSortedSetRange(`uid:${uid}:sessions`, 0, -1); if (activeSessions.length > maxUserSessions) { const sessionsToRevoke = activeSessions.slice(0, activeSessions.length - maxUserSessions); await Promise.all(sessionsToRevoke.map(sessionId => User.auth.revokeSession(sessionId, uid))); @@ -120,20 +120,20 @@ module.exports = function (User) { } User.auth.revokeSession = async function (sessionId, uid) { - winston.verbose('[user.auth] Revoking session ' + sessionId + ' for user ' + uid); + winston.verbose(`[user.auth] Revoking session ${sessionId} for user ${uid}`); const sessionObj = await getSessionFromStore(sessionId); if (sessionObj && sessionObj.meta && sessionObj.meta.uuid) { - await db.deleteObjectField('uid:' + uid + ':sessionUUID:sessionId', sessionObj.meta.uuid); + await db.deleteObjectField(`uid:${uid}:sessionUUID:sessionId`, sessionObj.meta.uuid); } await Promise.all([ - db.sortedSetRemove('uid:' + uid + ':sessions', sessionId), + db.sortedSetRemove(`uid:${uid}:sessions`, sessionId), sessionStoreDestroy(sessionId), ]); }; User.auth.revokeAllSessions = async function (uids) { uids = Array.isArray(uids) ? uids : [uids]; - const sids = await db.getSortedSetsMembers(uids.map(uid => 'uid:' + uid + ':sessions')); + const sids = await db.getSortedSetsMembers(uids.map(uid => `uid:${uid}:sessions`)); const promises = []; uids.forEach((uid, index) => { promises.push(sids[index].map(s => User.auth.revokeSession(s, uid))); @@ -143,8 +143,8 @@ module.exports = function (User) { User.auth.deleteAllSessions = async function () { await batch.processSortedSet('users:joindate', async function (uids) { - const sessionKeys = uids.map(uid => 'uid:' + uid + ':sessions'); - const sessionUUIDKeys = uids.map(uid => 'uid:' + uid + ':sessionUUID:sessionId'); + const sessionKeys = uids.map(uid => `uid:${uid}:sessions`); + const sessionUUIDKeys = uids.map(uid => `uid:${uid}:sessionUUID:sessionId`); const sids = _.flatten(await db.getSortedSetRange(sessionKeys, 0, -1)); await Promise.all([ diff --git a/src/user/bans.js b/src/user/bans.js index 40397fe7a8..eb443080d9 100644 --- a/src/user/bans.js +++ b/src/user/bans.js @@ -24,7 +24,7 @@ module.exports = function (User) { throw new Error('[[error:ban-expiry-missing]]'); } - const banKey = 'uid:' + uid + ':ban:' + now; + const banKey = `uid:${uid}:ban:${now}`; const banData = { uid: uid, timestamp: now, @@ -39,7 +39,7 @@ module.exports = function (User) { await groups.leave(systemGroups, uid); await groups.join(groups.BANNED_USERS, uid); await db.sortedSetAdd('users:banned', now, uid); - await db.sortedSetAdd('uid:' + uid + ':bans:timestamp', now, banKey); + await db.sortedSetAdd(`uid:${uid}:bans:timestamp`, now, banKey); await db.setObject(banKey, banData); await User.setUserField(uid, 'banned:expire', banData.expire); if (until > now) { @@ -53,12 +53,12 @@ module.exports = function (User) { const siteTitle = meta.config.title || 'NodeBB'; const data = { - subject: '[[email:banned.subject, ' + siteTitle + ']]', + subject: `[[email:banned.subject, ${siteTitle}]]`, username: username, until: until ? (new Date(until)).toUTCString().replace(/,/g, '\\,') : false, reason: reason, }; - await emailer.send('banned', uid, data).catch(err => winston.error('[emailer.send] ' + err.stack)); + await emailer.send('banned', uid, data).catch(err => winston.error(`[emailer.send] ${err.stack}`)); return banData; }; @@ -67,7 +67,7 @@ module.exports = function (User) { uids = Array.isArray(uids) ? uids : [uids]; const userData = await User.getUsersFields(uids, ['email:confirmed']); - await db.setObject(uids.map(uid => 'user:' + uid), { 'banned:expire': 0 }); + await db.setObject(uids.map(uid => `user:${uid}`), { 'banned:expire': 0 }); /* eslint-disable no-await-in-loop */ for (const user of userData) { @@ -133,7 +133,7 @@ module.exports = function (User) { if (parseInt(uid, 10) <= 0) { return ''; } - const keys = await db.getSortedSetRevRange('uid:' + uid + ':bans:timestamp', 0, 0); + const keys = await db.getSortedSetRevRange(`uid:${uid}:bans:timestamp`, 0, 0); if (!keys.length) { return ''; } diff --git a/src/user/blocks.js b/src/user/blocks.js index 494b440af7..7c805deda9 100644 --- a/src/user/blocks.js +++ b/src/user/blocks.js @@ -48,7 +48,7 @@ module.exports = function (User) { return User.blocks._cache.get(parseInt(uid, 10)); } - let blocked = await db.getSortedSetRange('uid:' + uid + ':blocked_uids', 0, -1); + let blocked = await db.getSortedSetRange(`uid:${uid}:blocked_uids`, 0, -1); blocked = blocked.map(uid => parseInt(uid, 10)).filter(Boolean); User.blocks._cache.set(parseInt(uid, 10), blocked); return blocked; @@ -60,7 +60,7 @@ module.exports = function (User) { User.blocks.add = async function (targetUid, uid) { await User.blocks.applyChecks('block', targetUid, uid); - await db.sortedSetAdd('uid:' + uid + ':blocked_uids', Date.now(), targetUid); + await db.sortedSetAdd(`uid:${uid}:blocked_uids`, Date.now(), targetUid); await User.incrementUserFieldBy(uid, 'blocksCount', 1); User.blocks._cache.del(parseInt(uid, 10)); pubsub.publish('user:blocks:cache:del', parseInt(uid, 10)); @@ -69,7 +69,7 @@ module.exports = function (User) { User.blocks.remove = async function (targetUid, uid) { await User.blocks.applyChecks('unblock', targetUid, uid); - await db.sortedSetRemove('uid:' + uid + ':blocked_uids', targetUid); + await db.sortedSetRemove(`uid:${uid}:blocked_uids`, targetUid); await User.decrementUserFieldBy(uid, 'blocksCount', 1); User.blocks._cache.del(parseInt(uid, 10)); pubsub.publish('user:blocks:cache:del', parseInt(uid, 10)); @@ -81,7 +81,7 @@ module.exports = function (User) { const isBlock = type === 'block'; const is = await User.blocks.is(targetUid, uid); if (is === isBlock) { - throw new Error('[[error:already-' + (isBlock ? 'blocked' : 'unblocked') + ']]'); + throw new Error(`[[error:already-${isBlock ? 'blocked' : 'unblocked'}]]`); } }; diff --git a/src/user/categories.js b/src/user/categories.js index eea9d6983a..29f56cbdda 100644 --- a/src/user/categories.js +++ b/src/user/categories.js @@ -19,7 +19,7 @@ module.exports = function (User) { if (exists.includes(false)) { throw new Error('[[error:no-category]]'); } - await db.sortedSetsAdd(cids.map(cid => 'cid:' + cid + ':uid:watch:state'), state, uid); + await db.sortedSetsAdd(cids.map(cid => `cid:${cid}:uid:watch:state`), state, uid); }; User.getCategoryWatchState = async function (uid) { diff --git a/src/user/create.js b/src/user/create.js index 690f7b7846..6f66812603 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -79,12 +79,12 @@ module.exports = function (User) { if (isFirstUser) { userData['email:confirmed'] = 1; } - await db.setObject('user:' + uid, userData); + await db.setObject(`user:${uid}`, userData); const bulkAdd = [ ['username:uid', userData.uid, userData.username], - ['user:' + userData.uid + ':usernames', timestamp, userData.username + ':' + timestamp], - ['username:sorted', 0, userData.username.toLowerCase() + ':' + userData.uid], + [`user:${userData.uid}:usernames`, timestamp, `${userData.username}:${timestamp}`], + ['username:sorted', 0, `${userData.username.toLowerCase()}:${userData.uid}`], ['userslug:uid', userData.uid, userData.userslug], ['users:joindate', timestamp, userData.uid], ['users:online', timestamp, userData.uid], @@ -94,12 +94,12 @@ module.exports = function (User) { if (userData.email) { bulkAdd.push(['email:uid', userData.uid, userData.email.toLowerCase()]); - bulkAdd.push(['email:sorted', 0, userData.email.toLowerCase() + ':' + userData.uid]); - bulkAdd.push(['user:' + userData.uid + ':emails', timestamp, userData.email + ':' + timestamp]); + bulkAdd.push(['email:sorted', 0, `${userData.email.toLowerCase()}:${userData.uid}`]); + bulkAdd.push([`user:${userData.uid}:emails`, timestamp, `${userData.email}:${timestamp}`]); } if (userData.fullname) { - bulkAdd.push(['fullname:sorted', 0, userData.fullname.toLowerCase() + ':' + userData.uid]); + bulkAdd.push(['fullname:sorted', 0, `${userData.fullname.toLowerCase()}:${userData.uid}`]); } const groupsToJoin = ['registered-users'].concat( @@ -118,7 +118,7 @@ module.exports = function (User) { if (userData.email && userData.uid > 1 && meta.config.requireEmailConfirmation) { User.email.sendValidationEmail(userData.uid, { email: userData.email, - }).catch(err => winston.error('[user.create] Validation email failed to send\n[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[user.create] Validation email failed to send\n[emailer.send] ${err.stack}`)); } if (userNameChanged) { await User.notifications.sendNameChangeNotification(userData.uid, userData.username); @@ -147,7 +147,7 @@ module.exports = function (User) { } if (!utils.isUserNameValid(userData.username) || !userData.userslug) { - throw new Error('[[error:invalid-username, ' + userData.username + ']]'); + throw new Error(`[[error:invalid-username, ${userData.username}]]`); } if (userData.password) { @@ -193,7 +193,7 @@ module.exports = function (User) { if (!exists) { return numTries ? username : null; } - username = userData.username + ' ' + numTries.toString(32); + username = `${userData.username} ${numTries.toString(32)}`; numTries += 1; } }; diff --git a/src/user/data.js b/src/user/data.js index dee2f5a7a0..59ec983635 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -70,7 +70,7 @@ module.exports = function (User) { fields = fields.filter(value => value !== 'password'); } - const users = await db.getObjectsFields(uniqueUids.map(uid => 'user:' + uid), fields); + const users = await db.getObjectsFields(uniqueUids.map(uid => `user:${uid}`), fields); const result = await plugins.hooks.fire('filter:user.getFields', { uids: uniqueUids, users: users, @@ -152,7 +152,7 @@ module.exports = function (User) { if (meta.config.showFullnameAsDisplayName) { const uids = users.map(user => user.uid); uidToSettings = _.zipObject(uids, await db.getObjectsFields( - uids.map(uid => 'user:' + uid + ':settings'), + uids.map(uid => `user:${uid}:settings`), ['showfullname'] )); } @@ -286,7 +286,7 @@ module.exports = function (User) { }; User.setUserFields = async function (uid, data) { - await db.setObject('user:' + uid, data); + await db.setObject(`user:${uid}`, data); for (const field in data) { if (data.hasOwnProperty(field)) { plugins.hooks.fire('action:user.set', { uid: uid, field: field, value: data[field], type: 'set' }); @@ -303,7 +303,7 @@ module.exports = function (User) { }; async function incrDecrUserFieldBy(uid, field, value, type) { - const newValue = await db.incrObjectFieldBy('user:' + uid, field, value); + const newValue = await db.incrObjectFieldBy(`user:${uid}`, field, value); plugins.hooks.fire('action:user.set', { uid: uid, field: field, value: newValue, type: type }); return newValue; } diff --git a/src/user/delete.js b/src/user/delete.js index 8168942244..d5285c199f 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -40,7 +40,7 @@ module.exports = function (User) { }; async function deletePosts(callerUid, uid) { - await batch.processSortedSet('uid:' + uid + ':posts', async function (ids) { + await batch.processSortedSet(`uid:${uid}:posts`, async function (ids) { await async.eachSeries(ids, async function (pid) { await posts.purge(pid, callerUid); }); @@ -48,7 +48,7 @@ module.exports = function (User) { } async function deleteTopics(callerUid, uid) { - await batch.processSortedSet('uid:' + uid + ':topics', async function (ids) { + await batch.processSortedSet(`uid:${uid}:topics`, async function (ids) { await async.eachSeries(ids, async function (tid) { await topics.purge(tid, callerUid); }); @@ -56,18 +56,18 @@ module.exports = function (User) { } async function deleteUploads(uid) { - await batch.processSortedSet('uid:' + uid + ':uploads', async function (uploadNames) { + await batch.processSortedSet(`uid:${uid}:uploads`, async function (uploadNames) { await async.each(uploadNames, async function (uploadName) { await file.delete(path.join(nconf.get('upload_path'), uploadName)); }); - await db.sortedSetRemove('uid:' + uid + ':uploads', uploadNames); + await db.sortedSetRemove(`uid:${uid}:uploads`, uploadNames); }, { alwaysStartAt: 0 }); } async function deleteQueued(uid) { let deleteIds = []; await batch.processSortedSet('post:queue', async function (ids) { - const data = await db.getObjects(ids.map(id => 'post:queue:' + id)); + const data = await db.getObjects(ids.map(id => `post:queue:${id}`)); const userQueuedIds = data.filter(d => parseInt(d.uid, 10) === parseInt(uid, 10)).map(d => d.id); deleteIds = deleteIds.concat(userQueuedIds); }, { batch: 500 }); @@ -96,7 +96,7 @@ module.exports = function (User) { deletesInProgress[uid] = 'user.deleteAccount'; await removeFromSortedSets(uid); - const userData = await db.getObject('user:' + uid); + const userData = await db.getObject(`user:${uid}`); if (!userData || !userData.username) { delete deletesInProgress[uid]; @@ -109,36 +109,36 @@ module.exports = function (User) { await User.auth.revokeAllSessions(uid); const keys = [ - 'uid:' + uid + ':notifications:read', - 'uid:' + uid + ':notifications:unread', - 'uid:' + uid + ':bookmarks', - 'uid:' + uid + ':followed_tids', - 'uid:' + uid + ':ignored_tids', - 'user:' + uid + ':settings', - 'user:' + uid + ':usernames', - 'user:' + uid + ':emails', - 'uid:' + uid + ':topics', 'uid:' + uid + ':posts', - 'uid:' + uid + ':chats', 'uid:' + uid + ':chats:unread', - 'uid:' + uid + ':chat:rooms', 'uid:' + uid + ':chat:rooms:unread', - 'uid:' + uid + ':upvote', 'uid:' + uid + ':downvote', - 'uid:' + uid + ':flag:pids', - 'uid:' + uid + ':sessions', 'uid:' + uid + ':sessionUUID:sessionId', - 'invitation:uid:' + uid, + `uid:${uid}:notifications:read`, + `uid:${uid}:notifications:unread`, + `uid:${uid}:bookmarks`, + `uid:${uid}:followed_tids`, + `uid:${uid}:ignored_tids`, + `user:${uid}:settings`, + `user:${uid}:usernames`, + `user:${uid}:emails`, + `uid:${uid}:topics`, `uid:${uid}:posts`, + `uid:${uid}:chats`, `uid:${uid}:chats:unread`, + `uid:${uid}:chat:rooms`, `uid:${uid}:chat:rooms:unread`, + `uid:${uid}:upvote`, `uid:${uid}:downvote`, + `uid:${uid}:flag:pids`, + `uid:${uid}:sessions`, `uid:${uid}:sessionUUID:sessionId`, + `invitation:uid:${uid}`, ]; const bulkRemove = [ ['username:uid', userData.username], - ['username:sorted', userData.username.toLowerCase() + ':' + uid], + ['username:sorted', `${userData.username.toLowerCase()}:${uid}`], ['userslug:uid', userData.userslug], ['fullname:uid', userData.fullname], ]; if (userData.email) { bulkRemove.push(['email:uid', userData.email.toLowerCase()]); - bulkRemove.push(['email:sorted', userData.email.toLowerCase() + ':' + uid]); + bulkRemove.push(['email:sorted', `${userData.email.toLowerCase()}:${uid}`]); } if (userData.fullname) { - bulkRemove.push(['fullname:sorted', userData.fullname.toLowerCase() + ':' + uid]); + bulkRemove.push(['fullname:sorted', `${userData.fullname.toLowerCase()}:${uid}`]); } await Promise.all([ @@ -154,15 +154,15 @@ module.exports = function (User) { flags.resolveFlag('user', uid, uid), User.reset.cleanByUid(uid), ]); - await db.deleteAll(['followers:' + uid, 'following:' + uid, 'user:' + uid]); + await db.deleteAll([`followers:${uid}`, `following:${uid}`, `user:${uid}`]); delete deletesInProgress[uid]; return userData; }; async function deleteVotes(uid) { const [upvotedPids, downvotedPids] = await Promise.all([ - db.getSortedSetRange('uid:' + uid + ':upvote', 0, -1), - db.getSortedSetRange('uid:' + uid + ':downvote', 0, -1), + db.getSortedSetRange(`uid:${uid}:upvote`, 0, -1), + db.getSortedSetRange(`uid:${uid}:downvote`, 0, -1), ]); const pids = _.uniq(upvotedPids.concat(downvotedPids).filter(Boolean)); await async.eachSeries(pids, async function (pid) { @@ -171,8 +171,8 @@ module.exports = function (User) { } async function deleteChats(uid) { - const roomIds = await db.getSortedSetRange('uid:' + uid + ':chat:rooms', 0, -1); - const userKeys = roomIds.map(roomId => 'uid:' + uid + ':chat:room:' + roomId + ':mids'); + const roomIds = await db.getSortedSetRange(`uid:${uid}:chat:rooms`, 0, -1); + const userKeys = roomIds.map(roomId => `uid:${uid}:chat:room:${roomId}:mids`); await Promise.all([ messaging.leaveRooms(uid, roomIds), @@ -181,33 +181,33 @@ module.exports = function (User) { } async function deleteUserIps(uid) { - const ips = await db.getSortedSetRange('uid:' + uid + ':ip', 0, -1); - await db.sortedSetsRemove(ips.map(ip => 'ip:' + ip + ':uid'), uid); - await db.delete('uid:' + uid + ':ip'); + const ips = await db.getSortedSetRange(`uid:${uid}:ip`, 0, -1); + await db.sortedSetsRemove(ips.map(ip => `ip:${ip}:uid`), uid); + await db.delete(`uid:${uid}:ip`); } async function deleteBans(uid) { - const bans = await db.getSortedSetRange('uid:' + uid + ':bans:timestamp', 0, -1); + const bans = await db.getSortedSetRange(`uid:${uid}:bans:timestamp`, 0, -1); await db.deleteAll(bans); - await db.delete('uid:' + uid + ':bans:timestamp'); + await db.delete(`uid:${uid}:bans:timestamp`); } async function deleteUserFromFollowers(uid) { const [followers, following] = await Promise.all([ - db.getSortedSetRange('followers:' + uid, 0, -1), - db.getSortedSetRange('following:' + uid, 0, -1), + db.getSortedSetRange(`followers:${uid}`, 0, -1), + db.getSortedSetRange(`following:${uid}`, 0, -1), ]); async function updateCount(uids, name, fieldName) { await async.each(uids, async function (uid) { let count = await db.sortedSetCard(name + uid); count = parseInt(count, 10) || 0; - await db.setObjectField('user:' + uid, fieldName, count); + await db.setObjectField(`user:${uid}`, fieldName, count); }); } - const followingSets = followers.map(uid => 'following:' + uid); - const followerSets = following.map(uid => 'followers:' + uid); + const followingSets = followers.map(uid => `following:${uid}`); + const followerSets = following.map(uid => `followers:${uid}`); await Promise.all([ db.sortedSetsRemove(followerSets.concat(followingSets), uid), @@ -220,8 +220,8 @@ module.exports = function (User) { const extensions = User.getAllowedProfileImageExtensions(); const folder = path.join(nconf.get('upload_path'), 'profile'); await Promise.all(extensions.map(async (ext) => { - await file.delete(path.join(folder, uid + '-profilecover.' + ext)); - await file.delete(path.join(folder, uid + '-profileavatar.' + ext)); + await file.delete(path.join(folder, `${uid}-profilecover.${ext}`)); + await file.delete(path.join(folder, `${uid}-profileavatar.${ext}`)); })); } }; diff --git a/src/user/digest.js b/src/user/digest.js index 4ae34abd14..c793cfce6e 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -18,7 +18,7 @@ const Digest = module.exports; Digest.execute = async function (payload) { const digestsDisabled = meta.config.disableEmailSubscriptions === 1; if (digestsDisabled) { - winston.info('[user/jobs] Did not send digests (' + payload.interval + ') because subscription system is disabled.'); + winston.info(`[user/jobs] Did not send digests (${payload.interval}) because subscription system is disabled.`); return; } let subscribers = payload.subscribers; @@ -29,14 +29,14 @@ Digest.execute = async function (payload) { return; } try { - winston.info('[user/jobs] Digest (' + payload.interval + ') scheduling completed. Sending emails; this may take some time...'); + winston.info(`[user/jobs] Digest (${payload.interval}) scheduling completed. Sending emails; this may take some time...`); await Digest.send({ interval: payload.interval, subscribers: subscribers, }); - winston.info('[user/jobs] Digest (' + payload.interval + ') complete.'); + winston.info(`[user/jobs] Digest (${payload.interval}) complete.`); } catch (err) { - winston.error('[user/jobs] Could not send digests (' + payload.interval + ')\n' + err.stack); + winston.error(`[user/jobs] Could not send digests (${payload.interval})\n${err.stack}`); throw err; } }; @@ -126,7 +126,7 @@ Digest.send = async function (data) { emailsSent += 1; const now = new Date(); await emailer.send('digest', userObj.uid, { - subject: '[[email:digest.subject, ' + (now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate()) + ']]', + subject: `[[email:digest.subject, ${now.getFullYear()}/${now.getMonth() + 1}/${now.getDate()}]]`, username: userObj.username, userslug: userObj.userslug, notifications: unreadNotifs, @@ -135,13 +135,13 @@ Digest.send = async function (data) { popularTopics: popularTopics, interval: data.interval, showUnsubscribe: true, - }).catch(err => winston.error('[user/jobs] Could not send digest email\n[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[user/jobs] Could not send digest email\n[emailer.send] ${err.stack}`)); if (data.interval !== 'alltime') { await db.sortedSetAdd('digest:delivery', now.getTime(), userObj.uid); } }); - winston.info('[user/jobs] Digest (' + data.interval + ') sending completed. ' + emailsSent + ' emails sent.'); + winston.info(`[user/jobs] Digest (${data.interval}) sending completed. ${emailsSent} emails sent.`); }; Digest.getDeliveryTimes = async (start, stop) => { @@ -187,7 +187,7 @@ async function getTermTopics(term, uid, start, stop, sort) { data.topics.forEach(function (topicObj) { if (topicObj) { if (topicObj.teaser && topicObj.teaser.content && topicObj.teaser.content.length > 255) { - topicObj.teaser.content = topicObj.teaser.content.slice(0, 255) + '...'; + topicObj.teaser.content = `${topicObj.teaser.content.slice(0, 255)}...`; } // Fix relative paths in topic data const user = topicObj.hasOwnProperty('teaser') && topicObj.teaser && topicObj.teaser.user ? diff --git a/src/user/email.js b/src/user/email.js index 887a1afd76..01f3e34b02 100644 --- a/src/user/email.js +++ b/src/user/email.js @@ -40,7 +40,7 @@ UserEmail.sendValidationEmail = async function (uid, options) { } let confirm_code = utils.generateUUID(); - const confirm_link = nconf.get('url') + '/confirm/' + confirm_code; + const confirm_link = `${nconf.get('url')}/confirm/${confirm_code}`; const emailInterval = meta.config.emailConfirmInterval; @@ -53,20 +53,20 @@ UserEmail.sendValidationEmail = async function (uid, options) { } let sent = false; if (!options.force) { - sent = await db.get('uid:' + uid + ':confirm:email:sent'); + sent = await db.get(`uid:${uid}:confirm:email:sent`); } if (sent) { - throw new Error('[[error:confirm-email-already-sent, ' + emailInterval + ']]'); + throw new Error(`[[error:confirm-email-already-sent, ${emailInterval}]]`); } - await db.set('uid:' + uid + ':confirm:email:sent', 1); - await db.pexpireAt('uid:' + uid + ':confirm:email:sent', Date.now() + (emailInterval * 60 * 1000)); + await db.set(`uid:${uid}:confirm:email:sent`, 1); + await db.pexpireAt(`uid:${uid}:confirm:email:sent`, Date.now() + (emailInterval * 60 * 1000)); confirm_code = await plugins.hooks.fire('filter:user.verify.code', confirm_code); - await db.setObject('confirm:' + confirm_code, { + await db.setObject(`confirm:${confirm_code}`, { email: options.email.toLowerCase(), uid: uid, }); - await db.expireAt('confirm:' + confirm_code, Math.floor((Date.now() / 1000) + (60 * 60 * 24))); + await db.expireAt(`confirm:${confirm_code}`, Math.floor((Date.now() / 1000) + (60 * 60 * 24))); const username = await user.getUserField(uid, 'username'); const data = { @@ -74,7 +74,7 @@ UserEmail.sendValidationEmail = async function (uid, options) { confirm_link: confirm_link, confirm_code: confirm_code, - subject: options.subject || '[[email:welcome-to, ' + (meta.config.title || meta.config.browserTitle || 'NodeBB') + ']]', + subject: options.subject || `[[email:welcome-to, ${meta.config.title || meta.config.browserTitle || 'NodeBB'}]]`, template: options.template || 'welcome', uid: uid, }; @@ -89,7 +89,7 @@ UserEmail.sendValidationEmail = async function (uid, options) { // confirm email by code sent by confirmation email UserEmail.confirmByCode = async function (code) { - const confirmObj = await db.getObject('confirm:' + code); + const confirmObj = await db.getObject(`confirm:${code}`); if (!confirmObj || !confirmObj.uid || !confirmObj.email) { throw new Error('[[error:invalid-data]]'); } @@ -98,7 +98,7 @@ UserEmail.confirmByCode = async function (code) { throw new Error('[[error:invalid-email]]'); } await UserEmail.confirmByUid(confirmObj.uid); - await db.delete('confirm:' + code); + await db.delete(`confirm:${code}`); }; // confirm uid's email @@ -114,7 +114,7 @@ UserEmail.confirmByUid = async function (uid) { user.setUserField(uid, 'email:confirmed', 1), groups.join('verified-users', uid), groups.leave('unverified-users', uid), - db.delete('uid:' + uid + ':confirm:email:sent'), + db.delete(`uid:${uid}:confirm:email:sent`), ]); await plugins.hooks.fire('action:user.email.confirmed', { uid: uid, email: currentEmail }); }; diff --git a/src/user/follow.js b/src/user/follow.js index 8231f8300d..3c152219fd 100644 --- a/src/user/follow.js +++ b/src/user/follow.js @@ -33,8 +33,8 @@ module.exports = function (User) { const now = Date.now(); await Promise.all([ db.sortedSetAddBulk([ - ['following:' + uid, now, theiruid], - ['followers:' + theiruid, now, uid], + [`following:${uid}`, now, theiruid], + [`followers:${theiruid}`, now, uid], ]), ]); } else { @@ -43,15 +43,15 @@ module.exports = function (User) { } await Promise.all([ db.sortedSetRemoveBulk([ - ['following:' + uid, theiruid], - ['followers:' + theiruid, uid], + [`following:${uid}`, theiruid], + [`followers:${theiruid}`, uid], ]), ]); } const [followingCount, followerCount] = await Promise.all([ - db.sortedSetCard('following:' + uid), - db.sortedSetCard('followers:' + theiruid), + db.sortedSetCard(`following:${uid}`), + db.sortedSetCard(`followers:${theiruid}`), ]); await Promise.all([ User.setUserField(uid, 'followingCount', followingCount), @@ -71,8 +71,8 @@ module.exports = function (User) { if (parseInt(uid, 10) <= 0) { return []; } - const uids = await db.getSortedSetRevRange(type + ':' + uid, start, stop); - const data = await plugins.hooks.fire('filter:user.' + type, { + const uids = await db.getSortedSetRevRange(`${type}:${uid}`, start, stop); + const data = await plugins.hooks.fire(`filter:user.${type}`, { uids: uids, uid: uid, start: start, @@ -85,6 +85,6 @@ module.exports = function (User) { if (parseInt(uid, 10) <= 0 || parseInt(theirid, 10) <= 0) { return false; } - return await db.isSortedSetMember('following:' + uid, theirid); + return await db.isSortedSetMember(`following:${uid}`, theirid); }; }; diff --git a/src/user/index.js b/src/user/index.js index 9ff484905f..0b1131bb0b 100644 --- a/src/user/index.js +++ b/src/user/index.js @@ -232,7 +232,7 @@ User.addInterstitials = function (callback) { } if (data.userData.uid) { - const consented = await db.getObjectField('user:' + data.userData.uid, 'gdpr_consent'); + const consented = await db.getObjectField(`user:${data.userData.uid}`, 'gdpr_consent'); if (parseInt(consented, 10)) { return data; } @@ -266,7 +266,7 @@ User.addInterstitials = function (callback) { } if (data.userData.uid) { - const accepted = await db.getObjectField('user:' + data.userData.uid, 'acceptTos'); + const accepted = await db.getObjectField(`user:${data.userData.uid}`, 'acceptTos'); if (parseInt(accepted, 10)) { return data; } diff --git a/src/user/info.js b/src/user/info.js index 61de33f512..946bb46c17 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -11,7 +11,7 @@ var utils = require('../../public/src/utils'); module.exports = function (User) { User.getLatestBanInfo = async function (uid) { // Simply retrieves the last record of the user's ban, even if they've been unbanned since then. - const record = await db.getSortedSetRevRange('uid:' + uid + ':bans:timestamp', 0, 0); + const record = await db.getSortedSetRevRange(`uid:${uid}:bans:timestamp`, 0, 0); if (!record.length) { throw new Error('no-ban-info'); } @@ -31,12 +31,12 @@ module.exports = function (User) { User.getModerationHistory = async function (uid) { let [flags, bans] = await Promise.all([ - db.getSortedSetRevRangeWithScores('flags:byTargetUid:' + uid, 0, 19), - db.getSortedSetRevRange('uid:' + uid + ':bans:timestamp', 0, 19), + db.getSortedSetRevRangeWithScores(`flags:byTargetUid:${uid}`, 0, 19), + db.getSortedSetRevRange(`uid:${uid}:bans:timestamp`, 0, 19), ]); // Get pids from flag objects - const keys = flags.map(flagObj => 'flag:' + flagObj.value); + const keys = flags.map(flagObj => `flag:${flagObj.value}`); const payload = await db.getObjectsFields(keys, ['type', 'targetId']); // Only pass on flag ids from posts @@ -111,8 +111,8 @@ module.exports = function (User) { } User.getModerationNotes = async function (uid, start, stop) { - const noteIds = await db.getSortedSetRevRange('uid:' + uid + ':moderation:notes', start, stop); - const keys = noteIds.map(id => 'uid:' + uid + ':moderation:note:' + id); + const noteIds = await db.getSortedSetRevRange(`uid:${uid}:moderation:notes`, start, stop); + const keys = noteIds.map(id => `uid:${uid}:moderation:note:${id}`); const notes = await db.getObjects(keys); const uids = []; @@ -135,7 +135,7 @@ module.exports = function (User) { }; User.appendModerationNote = async ({ uid, noteData }) => { - await db.sortedSetAdd('uid:' + uid + ':moderation:notes', noteData.timestamp, noteData.timestamp); - await db.setObject('uid:' + uid + ':moderation:note:' + noteData.timestamp, noteData); + await db.sortedSetAdd(`uid:${uid}:moderation:notes`, noteData.timestamp, noteData.timestamp); + await db.setObject(`uid:${uid}:moderation:note:${noteData.timestamp}`, noteData); }; }; diff --git a/src/user/invite.js b/src/user/invite.js index 8b7087996d..86ae825dbc 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -14,12 +14,12 @@ var utils = require('../utils'); module.exports = function (User) { User.getInvites = async function (uid) { - const emails = await db.getSetMembers('invitation:uid:' + uid); + const emails = await db.getSetMembers(`invitation:uid:${uid}`); return emails.map(email => validator.escape(String(email))); }; User.getInvitesNumber = async function (uid) { - return await db.setCount('invitation:uid:' + uid); + return await db.setCount(`invitation:uid:${uid}`); }; User.getInvitingUsers = async function () { @@ -47,7 +47,7 @@ module.exports = function (User) { throw new Error('[[error:email-taken]]'); } - const invitation_exists = await db.exists('invitation:email:' + email); + const invitation_exists = await db.exists(`invitation:email:${email}`); if (invitation_exists) { throw new Error('[[error:email-invited]]'); } @@ -64,14 +64,14 @@ module.exports = function (User) { throw new Error('[[register:invite.error-invite-only]]'); } } - const token = await db.getObjectField('invitation:email:' + query.email, 'token'); + const token = await db.getObjectField(`invitation:email:${query.email}`, 'token'); if (!token || token !== query.token) { throw new Error('[[register:invite.error-invalid-data]]'); } }; User.joinGroupsFromInvitation = async function (uid, email) { - let groupsToJoin = await db.getObjectField('invitation:email:' + email, 'groupsToJoin'); + let groupsToJoin = await db.getObjectField(`invitation:email:${email}`, 'groupsToJoin'); try { groupsToJoin = JSON.parse(groupsToJoin); @@ -93,19 +93,19 @@ module.exports = function (User) { } await Promise.all([ deleteFromReferenceList(invitedByUid, email), - db.delete('invitation:email:' + email), + db.delete(`invitation:email:${email}`), ]); }; User.deleteInvitationKey = async function (email) { const uids = await User.getInvitingUsers(); await Promise.all(uids.map(uid => deleteFromReferenceList(uid, email))); - await db.delete('invitation:email:' + email); + await db.delete(`invitation:email:${email}`); }; async function deleteFromReferenceList(uid, email) { - await db.setRemove('invitation:uid:' + uid, email); - const count = await db.setCount('invitation:uid:' + uid); + await db.setRemove(`invitation:uid:${uid}`, email); + const count = await db.setCount(`invitation:uid:${uid}`); if (count === 0) { await db.setRemove('invitation:uids', uid); } @@ -118,22 +118,22 @@ module.exports = function (User) { } const token = utils.generateUUID(); - const registerLink = nconf.get('url') + '/register?token=' + token + '&email=' + encodeURIComponent(email); + const registerLink = `${nconf.get('url')}/register?token=${token}&email=${encodeURIComponent(email)}`; const expireDays = meta.config.inviteExpiration; const expireIn = expireDays * 86400000; - await db.setAdd('invitation:uid:' + uid, email); + await db.setAdd(`invitation:uid:${uid}`, email); await db.setAdd('invitation:uids', uid); - await db.setObject('invitation:email:' + email, { + await db.setObject(`invitation:email:${email}`, { token, groupsToJoin: JSON.stringify(groupsToJoin), }); - await db.pexpireAt('invitation:email:' + email, Date.now() + expireIn); + await db.pexpireAt(`invitation:email:${email}`, Date.now() + expireIn); const username = await User.getUserField(uid, 'username'); const title = meta.config.title || meta.config.browserTitle || 'NodeBB'; - const subject = await translator.translate('[[email:invite, ' + title + ']]', meta.config.defaultLang); + const subject = await translator.translate(`[[email:invite, ${title}]]`, meta.config.defaultLang); return { ...emailer._defaultPayload, // Append default data to this email payload diff --git a/src/user/jobs.js b/src/user/jobs.js index d170bfec31..b9a86c06f9 100644 --- a/src/user/jobs.js +++ b/src/user/jobs.js @@ -23,24 +23,24 @@ module.exports = function (User) { User.stopJobs(); - startDigestJob('digest.daily', '0 ' + digestHour + ' * * *', 'day'); - startDigestJob('digest.weekly', '0 ' + digestHour + ' * * 0', 'week'); - startDigestJob('digest.monthly', '0 ' + digestHour + ' 1 * *', 'month'); + startDigestJob('digest.daily', `0 ${digestHour} * * *`, 'day'); + startDigestJob('digest.weekly', `0 ${digestHour} * * 0`, 'week'); + startDigestJob('digest.monthly', `0 ${digestHour} 1 * *`, 'month'); started += 3; jobs['reset.clean'] = new cronJob('0 0 * * *', User.reset.clean, null, true); winston.verbose('[user/jobs] Starting job (reset.clean)'); started += 1; - winston.verbose('[user/jobs] ' + started + ' jobs started'); + winston.verbose(`[user/jobs] ${started} jobs started`); }; function startDigestJob(name, cronString, term) { jobs[name] = new cronJob(cronString, function () { - winston.verbose('[user/jobs] Digest job (' + name + ') started.'); + winston.verbose(`[user/jobs] Digest job (${name}) started.`); User.digest.execute({ interval: term }); }, null, true); - winston.verbose('[user/jobs] Starting job (' + name + ')'); + winston.verbose(`[user/jobs] Starting job (${name})`); } User.stopJobs = function () { @@ -48,14 +48,14 @@ module.exports = function (User) { // Terminate any active cron jobs for (var jobId in jobs) { if (jobs.hasOwnProperty(jobId)) { - winston.verbose('[user/jobs] Terminating job (' + jobId + ')'); + winston.verbose(`[user/jobs] Terminating job (${jobId})`); jobs[jobId].stop(); delete jobs[jobId]; terminated += 1; } } if (terminated > 0) { - winston.verbose('[user/jobs] ' + terminated + ' jobs terminated'); + winston.verbose(`[user/jobs] ${terminated} jobs terminated`); } }; }; diff --git a/src/user/jobs/export-posts.js b/src/user/jobs/export-posts.js index 72f35464cd..1acaeaeeac 100644 --- a/src/user/jobs/export-posts.js +++ b/src/user/jobs/export-posts.js @@ -27,16 +27,16 @@ process.on('message', async function (msg) { await db.init(); const targetUid = msg.uid; - const filePath = path.join(__dirname, '../../../build/export', targetUid + '_posts.csv'); + const filePath = path.join(__dirname, '../../../build/export', `${targetUid}_posts.csv`); const posts = require('../../posts'); let payload = []; - await batch.processSortedSet('uid:' + targetUid + ':posts', async function (pids) { + await batch.processSortedSet(`uid:${targetUid}:posts`, async function (pids) { let postData = await posts.getPostsData(pids); // Remove empty post references and convert newlines in content postData = postData.filter(Boolean).map(function (post) { - post.content = '"' + String(post.content || '').replace(/\n/g, '\\n').replace(/"/g, '\\"') + '"'; + post.content = `"${String(post.content || '').replace(/\n/g, '\\n').replace(/"/g, '\\"')}"`; return post; }); payload = payload.concat(postData); diff --git a/src/user/jobs/export-profile.js b/src/user/jobs/export-profile.js index c934024fa9..22a6cb95cc 100644 --- a/src/user/jobs/export-profile.js +++ b/src/user/jobs/export-profile.js @@ -29,27 +29,27 @@ process.on('message', async function (msg) { const targetUid = msg.uid; - const profileFile = targetUid + '_profile.json'; + const profileFile = `${targetUid}_profile.json`; const profilePath = path.join(__dirname, '../../../build/export', profileFile); const user = require('../index'); const [userData, userSettings, ips, sessions, usernames, emails, bookmarks, watchedTopics, upvoted, downvoted, following] = await Promise.all([ - db.getObject('user:' + targetUid), - db.getObject('user:' + targetUid + ':settings'), + db.getObject(`user:${targetUid}`), + db.getObject(`user:${targetUid}:settings`), user.getIPs(targetUid, 9), user.auth.getSessions(targetUid), - user.getHistory('user:' + targetUid + ':usernames'), - user.getHistory('user:' + targetUid + ':emails'), - getSetData('uid:' + targetUid + ':bookmarks', 'post:', targetUid), - getSetData('uid:' + targetUid + ':followed_tids', 'topic:', targetUid), - getSetData('uid:' + targetUid + ':upvote', 'post:', targetUid), - getSetData('uid:' + targetUid + ':downvote', 'post:', targetUid), - getSetData('following:' + targetUid, 'user:', targetUid), + user.getHistory(`user:${targetUid}:usernames`), + user.getHistory(`user:${targetUid}:emails`), + getSetData(`uid:${targetUid}:bookmarks`, 'post:', targetUid), + getSetData(`uid:${targetUid}:followed_tids`, 'topic:', targetUid), + getSetData(`uid:${targetUid}:upvote`, 'post:', targetUid), + getSetData(`uid:${targetUid}:downvote`, 'post:', targetUid), + getSetData(`following:${targetUid}`, 'user:', targetUid), ]); delete userData.password; let chatData = []; - await batch.processSortedSet('uid:' + targetUid + ':chat:rooms', async (roomIds) => { + await batch.processSortedSet(`uid:${targetUid}:chat:rooms`, async (roomIds) => { var result = await Promise.all(roomIds.map(roomId => getRoomMessages(targetUid, roomId))); chatData = chatData.concat(_.flatten(result)); }, { batch: 100, interval: 1000 }); @@ -77,8 +77,8 @@ process.on('message', async function (msg) { async function getRoomMessages(uid, roomId) { const batch = require('../../batch'); let data = []; - await batch.processSortedSet('uid:' + uid + ':chat:room:' + roomId + ':mids', async (mids) => { - const messageData = await db.getObjects(mids.map(mid => 'message:' + mid)); + await batch.processSortedSet(`uid:${uid}:chat:room:${roomId}:mids`, async (mids) => { + const messageData = await db.getObjects(mids.map(mid => `message:${mid}`)); data = data.concat(messageData.filter(m => m && m.fromuid === uid && !m.system) .map(m => ({ content: m.content, timestamp: m.timestamp })) ); diff --git a/src/user/jobs/export-uploads.js b/src/user/jobs/export-uploads.js index 4cba80cd25..b6d8cd5a4f 100644 --- a/src/user/jobs/export-uploads.js +++ b/src/user/jobs/export-uploads.js @@ -28,7 +28,7 @@ process.on('message', async function (msg) { const targetUid = msg.uid; - const archivePath = path.join(__dirname, '../../../build/export', targetUid + '_uploads.zip'); + const archivePath = path.join(__dirname, '../../../build/export', `${targetUid}_uploads.zip`); const rootDirectory = path.join(__dirname, '../../../public/uploads/'); const user = require('../index'); @@ -40,11 +40,11 @@ process.on('message', async function (msg) { archive.on('warning', function (err) { switch (err.code) { case 'ENOENT': - winston.warn('[user/export/uploads] File not found: ' + err.path); + winston.warn(`[user/export/uploads] File not found: ${err.path}`); break; default: - winston.warn('[user/export/uploads] Unexpected warning: ' + err.message); + winston.warn(`[user/export/uploads] Unexpected warning: ${err.message}`); break; } }); @@ -55,11 +55,11 @@ process.on('message', async function (msg) { }; switch (err.code) { case 'EACCES': - winston.error('[user/export/uploads] File inaccessible: ' + trimPath(err.path)); + winston.error(`[user/export/uploads] File inaccessible: ${trimPath(err.path)}`); break; default: - winston.error('[user/export/uploads] Unable to construct archive: ' + err.message); + winston.error(`[user/export/uploads] Unable to construct archive: ${err.message}`); break; } }); @@ -71,7 +71,7 @@ process.on('message', async function (msg) { }); archive.pipe(output); - winston.verbose('[user/export/uploads] Collating uploads for uid ' + targetUid); + winston.verbose(`[user/export/uploads] Collating uploads for uid ${targetUid}`); await user.collateUploads(targetUid, archive); const uploadedPicture = await user.getUserField(targetUid, 'uploadedpicture'); diff --git a/src/user/notifications.js b/src/user/notifications.js index 518d78a4c0..b6be13f384 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -18,11 +18,11 @@ UserNotifications.get = async function (uid) { return { read: [], unread: [] }; } - let unread = await getNotificationsFromSet('uid:' + uid + ':notifications:unread', uid, 0, 29); + let unread = await getNotificationsFromSet(`uid:${uid}:notifications:unread`, uid, 0, 29); unread = unread.filter(Boolean); let read = []; if (unread.length < 30) { - read = await getNotificationsFromSet('uid:' + uid + ':notifications:read', uid, 0, 29 - unread.length); + read = await getNotificationsFromSet(`uid:${uid}:notifications:read`, uid, 0, 29 - unread.length); } return { read: read.filter(Boolean), @@ -34,15 +34,15 @@ async function filterNotifications(nids, filter) { if (!filter) { return nids; } - const keys = nids.map(nid => 'notifications:' + nid); + const keys = nids.map(nid => `notifications:${nid}`); const notifications = await db.getObjectsFields(keys, ['nid', 'type']); return notifications.filter(n => n && n.nid && n.type === filter).map(n => n.nid); } UserNotifications.getAll = async function (uid, filter) { let nids = await db.getSortedSetRevRange([ - 'uid:' + uid + ':notifications:unread', - 'uid:' + uid + ':notifications:read', + `uid:${uid}:notifications:unread`, + `uid:${uid}:notifications:read`, ], 0, -1); nids = _.uniq(nids); const exists = await db.isSortedSetMembers('notifications', nids); @@ -61,8 +61,8 @@ UserNotifications.getAll = async function (uid, filter) { async function deleteUserNids(nids, uid) { await db.sortedSetRemove([ - 'uid:' + uid + ':notifications:read', - 'uid:' + uid + ':notifications:unread', + `uid:${uid}:notifications:read`, + `uid:${uid}:notifications:unread`, ], nids); } @@ -78,7 +78,7 @@ UserNotifications.getNotifications = async function (nids, uid) { const [notifObjs, hasRead] = await Promise.all([ notifications.getMultiple(nids), - db.isSortedSetMembers('uid:' + uid + ':notifications:read', nids), + db.isSortedSetMembers(`uid:${uid}:notifications:read`, nids), ]); const deletedNids = []; @@ -114,7 +114,7 @@ UserNotifications.getUnreadInterval = async function (uid, interval) { return []; } const min = Date.now() - times[interval]; - const nids = await db.getSortedSetRevRangeByScore('uid:' + uid + ':notifications:unread', 0, 20, '+inf', min); + const nids = await db.getSortedSetRevRangeByScore(`uid:${uid}:notifications:unread`, 0, 20, '+inf', min); return await UserNotifications.getNotifications(nids, uid); }; @@ -126,9 +126,9 @@ UserNotifications.getUnreadCount = async function (uid) { if (parseInt(uid, 10) <= 0) { return 0; } - let nids = await db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99); + let nids = await db.getSortedSetRevRange(`uid:${uid}:notifications:unread`, 0, 99); nids = await notifications.filterExists(nids); - const keys = nids.map(nid => 'notifications:' + nid); + const keys = nids.map(nid => `notifications:${nid}`); const notifData = await db.getObjectsFields(keys, ['mergeId']); const mergeIds = notifData.map(n => n.mergeId); @@ -144,11 +144,11 @@ UserNotifications.getUnreadCount = async function (uid) { }; UserNotifications.getUnreadByField = async function (uid, field, values) { - const nids = await db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99); + const nids = await db.getSortedSetRevRange(`uid:${uid}:notifications:unread`, 0, 99); if (!nids.length) { return []; } - const keys = nids.map(nid => 'notifications:' + nid); + const keys = nids.map(nid => `notifications:${nid}`); const notifData = await db.getObjectsFields(keys, ['nid', field]); const valuesSet = new Set(values.map(value => String(value))); return notifData.filter(n => n && n[field] && valuesSet.has(String(n[field]))).map(n => n.nid); @@ -159,14 +159,14 @@ UserNotifications.deleteAll = async function (uid) { return; } await db.deleteAll([ - 'uid:' + uid + ':notifications:unread', - 'uid:' + uid + ':notifications:read', + `uid:${uid}:notifications:unread`, + `uid:${uid}:notifications:read`, ]); }; UserNotifications.sendTopicNotificationToFollowers = async function (uid, topicData, postData) { try { - let followers = await db.getSortedSetRange('followers:' + uid, 0, -1); + let followers = await db.getSortedSetRange(`followers:${uid}`, 0, -1); followers = await privileges.categories.filterUids('read', topicData.cid, followers); if (!followers.length) { return; @@ -179,11 +179,11 @@ UserNotifications.sendTopicNotificationToFollowers = async function (uid, topicD const notifObj = await notifications.create({ type: 'new-topic', - bodyShort: '[[notifications:user_posted_topic, ' + postData.user.username + ', ' + title + ']]', + bodyShort: `[[notifications:user_posted_topic, ${postData.user.username}, ${title}]]`, bodyLong: postData.content, pid: postData.pid, - path: '/post/' + postData.pid, - nid: 'tid:' + postData.tid + ':uid:' + uid, + path: `/post/${postData.pid}`, + nid: `tid:${postData.tid}:uid:${uid}`, tid: postData.tid, from: uid, }); @@ -203,7 +203,7 @@ UserNotifications.sendWelcomeNotification = async function (uid) { const notifObj = await notifications.create({ bodyShort: meta.config.welcomeNotification, path: path, - nid: 'welcome_' + uid, + nid: `welcome_${uid}`, from: meta.config.welcomeUid ? meta.config.welcomeUid : null, }); @@ -212,9 +212,9 @@ UserNotifications.sendWelcomeNotification = async function (uid) { UserNotifications.sendNameChangeNotification = async function (uid, username) { const notifObj = await notifications.create({ - bodyShort: '[[user:username_taken_workaround, ' + username + ']]', + bodyShort: `[[user:username_taken_workaround, ${username}]]`, image: 'brand:logo', - nid: 'username_taken:' + uid, + nid: `username_taken:${uid}`, datetime: Date.now(), }); @@ -224,5 +224,5 @@ UserNotifications.sendNameChangeNotification = async function (uid, username) { UserNotifications.pushCount = async function (uid) { const websockets = require('../socket.io'); const count = await UserNotifications.getUnreadCount(uid); - websockets.in('uid_' + uid).emit('event:notifications.updateCount', count); + websockets.in(`uid_${uid}`).emit('event:notifications.updateCount', count); }; diff --git a/src/user/online.js b/src/user/online.js index fd144cad05..ea4c3aea84 100644 --- a/src/user/online.js +++ b/src/user/online.js @@ -10,7 +10,7 @@ module.exports = function (User) { if (!(parseInt(uid, 10) > 0)) { return; } - const userData = await db.getObjectFields('user:' + uid, ['status', 'lastonline']); + const userData = await db.getObjectFields(`user:${uid}`, ['status', 'lastonline']); const now = Date.now(); if (userData.status === 'offline' || now - parseInt(userData.lastonline, 10) < 300000) { return; diff --git a/src/user/password.js b/src/user/password.js index 23a2816fd8..584533d68f 100644 --- a/src/user/password.js +++ b/src/user/password.js @@ -20,7 +20,7 @@ module.exports = function (User) { var { password: hashedPassword, 'password:shaWrapped': shaWrapped, - } = await db.getObjectFields('user:' + uid, ['password', 'password:shaWrapped']); + } = await db.getObjectFields(`user:${uid}`, ['password', 'password:shaWrapped']); if (!hashedPassword) { // Non-existant user, submit fake hash for comparison hashedPassword = ''; @@ -36,7 +36,7 @@ module.exports = function (User) { }; User.hasPassword = async function (uid) { - const hashedPassword = await db.getObjectField('user:' + uid, 'password'); + const hashedPassword = await db.getObjectField(`user:${uid}`, 'password'); return !!hashedPassword; }; }; diff --git a/src/user/picture.js b/src/user/picture.js index 23a1afe820..8e42405235 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -31,7 +31,7 @@ module.exports = function (User) { User.updateCoverPosition = async function (uid, position) { // Reject anything that isn't two percentages if (!/^[\d.]+%\s[\d.]+%$/.test(position)) { - winston.warn('[user/updateCoverPosition] Invalid position received: ' + position); + winston.warn(`[user/updateCoverPosition] Invalid position received: ${position}`); throw new Error('[[error:invalid-data]]'); } @@ -54,7 +54,7 @@ module.exports = function (User) { picture.path = await image.writeImageDataToTempFile(data.imageData); const extension = file.typeToExtension(image.mimeFromBase64(data.imageData)); - const filename = data.uid + '-profilecover-' + Date.now() + extension; + const filename = `${data.uid}-profilecover-${Date.now()}${extension}`; const uploadData = await image.uploadImage(filename, 'profile', picture); await deleteCurrentPicture(data.uid, 'cover:url'); @@ -80,7 +80,7 @@ module.exports = function (User) { } if (userPhoto.size > meta.config.maximumProfileImageSize * 1024) { - throw new Error('[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]'); + throw new Error(`[[error:file-too-big, ${meta.config.maximumProfileImageSize}]]`); } if (!userPhoto.type || !User.getAllowedImageTypes().includes(userPhoto.type)) { @@ -175,7 +175,7 @@ module.exports = function (User) { } const size = image.sizeFromBase64(data.imageData); if (size > maxSize * 1024) { - throw new Error('[[error:file-too-big, ' + maxSize + ']]'); + throw new Error(`[[error:file-too-big, ${maxSize}]]`); } const type = image.mimeFromBase64(data.imageData); @@ -196,10 +196,10 @@ module.exports = function (User) { function generateProfileImageFilename(uid, extension) { const convertToPNG = meta.config['profile:convertProfileImageToPNG'] === 1; - return uid + '-profileavatar-' + Date.now() + (convertToPNG ? '.png' : extension); + return `${uid}-profileavatar-${Date.now()}${convertToPNG ? '.png' : extension}`; } User.removeCoverPicture = async function (data) { - await db.deleteObjectFields('user:' + data.uid, ['cover:url', 'cover:position']); + await db.deleteObjectFields(`user:${data.uid}`, ['cover:url', 'cover:position']); }; }; diff --git a/src/user/posts.js b/src/user/posts.js index 9f85b3456a..b0d1b6d5cc 100644 --- a/src/user/posts.js +++ b/src/user/posts.js @@ -36,15 +36,15 @@ module.exports = function (User) { const now = Date.now(); if (now - userData.joindate < meta.config.initialPostDelay * 1000) { - throw new Error('[[error:user-too-new, ' + meta.config.initialPostDelay + ']]'); + throw new Error(`[[error:user-too-new, ${meta.config.initialPostDelay}]]`); } const lasttime = userData[field] || 0; if (meta.config.newbiePostDelay > 0 && meta.config.newbiePostDelayThreshold > userData.reputation && now - lasttime < meta.config.newbiePostDelay * 1000) { - throw new Error('[[error:too-many-posts-newbie, ' + meta.config.newbiePostDelay + ', ' + meta.config.newbiePostDelayThreshold + ']]'); + throw new Error(`[[error:too-many-posts-newbie, ${meta.config.newbiePostDelay}, ${meta.config.newbiePostDelayThreshold}]]`); } else if (now - lasttime < meta.config.postDelay * 1000) { - throw new Error('[[error:too-many-posts, ' + meta.config.postDelay + ']]'); + throw new Error(`[[error:too-many-posts, ${meta.config.postDelay}]]`); } } @@ -57,8 +57,8 @@ module.exports = function (User) { User.addPostIdToUser = async function (postData) { await db.sortedSetsAdd([ - 'uid:' + postData.uid + ':posts', - 'cid:' + postData.cid + ':uid:' + postData.uid + ':pids', + `uid:${postData.uid}:posts`, + `cid:${postData.cid}:uid:${postData.uid}:pids`, ], postData.timestamp, postData.pid); }; @@ -89,7 +89,7 @@ module.exports = function (User) { } User.getPostIds = async function (uid, start, stop) { - const pids = await db.getSortedSetRevRange('uid:' + uid + ':posts', start, stop); + const pids = await db.getSortedSetRevRange(`uid:${uid}:posts`, start, stop); return Array.isArray(pids) ? pids : []; }; }; diff --git a/src/user/profile.js b/src/user/profile.js index fee66f7fe2..bce17ad442 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -144,7 +144,7 @@ module.exports = function (User) { return; } if (data.aboutme !== undefined && data.aboutme.length > meta.config.maximumAboutMeLength) { - throw new Error('[[error:about-me-too-long, ' + meta.config.maximumAboutMeLength + ']]'); + throw new Error(`[[error:about-me-too-long, ${meta.config.maximumAboutMeLength}]]`); } await User.checkMinReputation(callerUid, data.uid, 'min:rep:aboutme'); @@ -155,7 +155,7 @@ module.exports = function (User) { return; } if (data.signature !== undefined && data.signature.length > meta.config.maximumSignatureLength) { - throw new Error('[[error:signature-too-long, ' + meta.config.maximumSignatureLength + ']]'); + throw new Error(`[[error:signature-too-long, ${meta.config.maximumSignatureLength}]]`); } await User.checkMinReputation(callerUid, data.uid, 'min:rep:signature'); } @@ -215,7 +215,7 @@ module.exports = function (User) { } const reputation = await User.getUserField(uid, 'reputation'); if (reputation < meta.config[setting]) { - throw new Error('[[error:not-enough-reputation-' + setting.replace(/:/g, '-') + ']]'); + throw new Error(`[[error:not-enough-reputation-${setting.replace(/:/g, '-')}]]`); } }; @@ -227,14 +227,14 @@ module.exports = function (User) { } await db.sortedSetRemove('email:uid', oldEmail.toLowerCase()); - await db.sortedSetRemove('email:sorted', oldEmail.toLowerCase() + ':' + uid); + await db.sortedSetRemove('email:sorted', `${oldEmail.toLowerCase()}:${uid}`); await User.auth.revokeAllSessions(uid); await Promise.all([ db.sortedSetAddBulk([ ['email:uid', uid, newEmail.toLowerCase()], - ['email:sorted', 0, newEmail.toLowerCase() + ':' + uid], - ['user:' + uid + ':emails', Date.now(), newEmail + ':' + Date.now()], + ['email:sorted', 0, `${newEmail.toLowerCase()}:${uid}`], + [`user:${uid}:emails`, Date.now(), `${newEmail}:${Date.now()}`], ]), User.setUserFields(uid, { email: newEmail, 'email:confirmed': 0 }), groups.leave('verified-users', uid), @@ -247,7 +247,7 @@ module.exports = function (User) { email: newEmail, subject: '[[email:email.verify-your-email.subject]]', template: 'verify_email', - }).catch(err => winston.error('[user.create] Validation email failed to send\n[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[user.create] Validation email failed to send\n[emailer.send] ${err.stack}`)); } } @@ -264,20 +264,20 @@ module.exports = function (User) { await Promise.all([ updateUidMapping('username', uid, newUsername, userData.username), updateUidMapping('userslug', uid, newUserslug, userData.userslug), - db.sortedSetAdd('user:' + uid + ':usernames', now, newUsername + ':' + now), + db.sortedSetAdd(`user:${uid}:usernames`, now, `${newUsername}:${now}`), ]); - await db.sortedSetRemove('username:sorted', userData.username.toLowerCase() + ':' + uid); - await db.sortedSetAdd('username:sorted', 0, newUsername.toLowerCase() + ':' + uid); + await db.sortedSetRemove('username:sorted', `${userData.username.toLowerCase()}:${uid}`); + await db.sortedSetAdd('username:sorted', 0, `${newUsername.toLowerCase()}:${uid}`); } async function updateUidMapping(field, uid, value, oldValue) { if (value === oldValue) { return; } - await db.sortedSetRemove(field + ':uid', oldValue); + await db.sortedSetRemove(`${field}:uid`, oldValue); await User.setUserField(uid, field, value); if (value) { - await db.sortedSetAdd(field + ':uid', uid, value); + await db.sortedSetAdd(`${field}:uid`, uid, value); } } @@ -286,10 +286,10 @@ module.exports = function (User) { await updateUidMapping('fullname', uid, newFullname, fullname); if (newFullname !== fullname) { if (fullname) { - await db.sortedSetRemove('fullname:sorted', fullname.toLowerCase() + ':' + uid); + await db.sortedSetRemove('fullname:sorted', `${fullname.toLowerCase()}:${uid}`); } if (newFullname) { - await db.sortedSetAdd('fullname:sorted', 0, newFullname.toLowerCase() + ':' + uid); + await db.sortedSetAdd('fullname:sorted', 0, `${newFullname.toLowerCase()}:${uid}`); } } } diff --git a/src/user/reset.js b/src/user/reset.js index 24a3869438..be3c0d3527 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -51,11 +51,11 @@ UserReset.send = async function (email) { await db.sortedSetAdd('reset:issueDate:uid', Date.now(), uid); const code = await UserReset.generate(uid); await emailer.send('reset', uid, { - reset_link: nconf.get('url') + '/reset/' + code, + reset_link: `${nconf.get('url')}/reset/${code}`, subject: '[[email:password-reset-requested]]', template: 'reset', uid: uid, - }).catch(err => winston.error('[emailer.send] ' + err.stack)); + }).catch(err => winston.error(`[emailer.send] ${err.stack}`)); }; UserReset.commit = async function (code, password) { @@ -69,7 +69,7 @@ UserReset.commit = async function (code, password) { throw new Error('[[error:reset-code-not-valid]]'); } const userData = await db.getObjectFields( - 'user:' + uid, + `user:${uid}`, ['password', 'passwordExpiry', 'password:shaWrapped'] ); const ok = await Password.compare(password, userData.password, !!parseInt(userData['password:shaWrapped'], 10)); @@ -97,7 +97,7 @@ UserReset.commit = async function (code, password) { ]); await user.reset.updateExpiry(uid); await user.auth.resetLockout(uid); - await db.delete('uid:' + uid + ':confirm:email:sent'); + await db.delete(`uid:${uid}:confirm:email:sent`); await UserReset.cleanByUid(uid); }; @@ -108,7 +108,7 @@ UserReset.updateExpiry = async function (uid) { const expiry = Date.now() + (oneDay * expireDays); await user.setUserField(uid, 'passwordExpiry', expiry); } else { - await db.deleteObjectField('user:' + uid, 'passwordExpiry'); + await db.deleteObjectField(`user:${uid}`, 'passwordExpiry'); } }; @@ -121,7 +121,7 @@ UserReset.clean = async function () { return; } - winston.verbose('[UserReset.clean] Removing ' + tokens.length + ' reset tokens from database'); + winston.verbose(`[UserReset.clean] Removing ${tokens.length} reset tokens from database`); await cleanTokensAndUids(tokens, uids); }; @@ -139,11 +139,11 @@ UserReset.cleanByUid = async function (uid) { }, { batch: 500 }); if (!tokensToClean.length) { - winston.verbose('[UserReset.cleanByUid] No tokens found for uid (' + uid + ').'); + winston.verbose(`[UserReset.cleanByUid] No tokens found for uid (${uid}).`); return; } - winston.verbose('[UserReset.cleanByUid] Found ' + tokensToClean.length + ' token(s), removing...'); + winston.verbose(`[UserReset.cleanByUid] Found ${tokensToClean.length} token(s), removing...`); await cleanTokensAndUids(tokensToClean, uid); }; diff --git a/src/user/search.js b/src/user/search.js index 2201e204ca..317c3ebfd7 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -77,7 +77,7 @@ module.exports = function (User) { const resultsPerPage = meta.config.userSearchResultsPerPage; hardCap = hardCap || resultsPerPage * 10; - const data = await db.getSortedSetRangeByLex(searchBy + ':sorted', min, max, 0, hardCap); + const data = await db.getSortedSetRangeByLex(`${searchBy}:sorted`, min, max, 0, hardCap); const uids = data.map(data => data.split(':').pop()); return uids; } @@ -152,7 +152,7 @@ module.exports = function (User) { } async function searchByIP(ip) { - const ipKeys = await db.scan({ match: 'ip:' + ip + '*' }); + const ipKeys = await db.scan({ match: `ip:${ip}*` }); const uids = await db.getSortedSetRevRange(ipKeys, 0, -1); return _.uniq(uids); } diff --git a/src/user/settings.js b/src/user/settings.js index 0128ee6a22..bad45000e0 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -14,7 +14,7 @@ module.exports = function (User) { if (parseInt(uid, 10) <= 0) { return await onSettingsLoaded(0, {}); } - let settings = await db.getObject('user:' + uid + ':settings'); + let settings = await db.getObject(`user:${uid}:settings`); settings = settings || {}; settings.uid = uid; return await onSettingsLoaded(uid, settings); @@ -25,7 +25,7 @@ module.exports = function (User) { return []; } - const keys = uids.map(uid => 'user:' + uid + ':settings'); + const keys = uids.map(uid => `user:${uid}:settings`); let settings = await db.getObjects(keys); settings = settings.map(function (userSettings, index) { userSettings = userSettings || {}; @@ -92,12 +92,12 @@ module.exports = function (User) { User.saveSettings = async function (uid, data) { const maxPostsPerPage = meta.config.maxPostsPerPage || 20; if (!data.postsPerPage || parseInt(data.postsPerPage, 10) <= 1 || parseInt(data.postsPerPage, 10) > maxPostsPerPage) { - throw new Error('[[error:invalid-pagination-value, 2, ' + maxPostsPerPage + ']]'); + throw new Error(`[[error:invalid-pagination-value, 2, ${maxPostsPerPage}]]`); } const maxTopicsPerPage = meta.config.maxTopicsPerPage || 20; if (!data.topicsPerPage || parseInt(data.topicsPerPage, 10) <= 1 || parseInt(data.topicsPerPage, 10) > maxTopicsPerPage) { - throw new Error('[[error:invalid-pagination-value, 2, ' + maxTopicsPerPage + ']]'); + throw new Error(`[[error:invalid-pagination-value, 2, ${maxTopicsPerPage}]]`); } const languageCodes = await languages.listCodes(); @@ -141,7 +141,7 @@ module.exports = function (User) { } }); const result = await plugins.hooks.fire('filter:user.saveSettings', { settings: settings, data: data }); - await db.setObject('user:' + uid + ':settings', result.settings); + await db.setObject(`user:${uid}:settings`, result.settings); await User.updateDigestSetting(uid, data.dailyDigestFreq); return await User.getSettings(uid); }; @@ -149,7 +149,7 @@ module.exports = function (User) { User.updateDigestSetting = async function (uid, dailyDigestFreq) { await db.sortedSetsRemove(['digest:day:uids', 'digest:week:uids', 'digest:month:uids'], uid); if (['day', 'week', 'month'].includes(dailyDigestFreq)) { - await db.sortedSetAdd('digest:' + dailyDigestFreq + ':uids', Date.now(), uid); + await db.sortedSetAdd(`digest:${dailyDigestFreq}:uids`, Date.now(), uid); } }; @@ -158,6 +158,6 @@ module.exports = function (User) { return; } - await db.setObjectField('user:' + uid + ':settings', key, value); + await db.setObjectField(`user:${uid}:settings`, key, value); }; }; diff --git a/src/user/topics.js b/src/user/topics.js index 470a01a477..79d329cbc5 100644 --- a/src/user/topics.js +++ b/src/user/topics.js @@ -4,12 +4,12 @@ const db = require('../database'); module.exports = function (User) { User.getIgnoredTids = async function (uid, start, stop) { - return await db.getSortedSetRevRange('uid:' + uid + ':ignored_tids', start, stop); + return await db.getSortedSetRevRange(`uid:${uid}:ignored_tids`, start, stop); }; User.addTopicIdToUser = async function (uid, tid, timestamp) { await Promise.all([ - db.sortedSetAdd('uid:' + uid + ':topics', timestamp, tid), + db.sortedSetAdd(`uid:${uid}:topics`, timestamp, tid), User.incrementUserFieldBy(uid, 'topiccount', 1), ]); }; diff --git a/src/user/uploads.js b/src/user/uploads.js index aa77df6e9d..4bc4027d13 100644 --- a/src/user/uploads.js +++ b/src/user/uploads.js @@ -11,7 +11,7 @@ const batch = require('../batch'); module.exports = function (User) { User.deleteUpload = async function (callerUid, uid, uploadName) { const [isUsersUpload, isAdminOrGlobalMod] = await Promise.all([ - db.isSortedSetMember('uid:' + callerUid + ':uploads', uploadName), + db.isSortedSetMember(`uid:${callerUid}:uploads`, uploadName), User.isAdminOrGlobalMod(callerUid), ]); if (!isAdminOrGlobalMod && !isUsersUpload) { @@ -22,16 +22,16 @@ module.exports = function (User) { if (!finalPath.startsWith(nconf.get('upload_path'))) { throw new Error('[[error:invalid-path]]'); } - winston.verbose('[user/deleteUpload] Deleting ' + uploadName); + winston.verbose(`[user/deleteUpload] Deleting ${uploadName}`); await Promise.all([ file.delete(finalPath), file.delete(file.appendToFileName(finalPath, '-resized')), ]); - await db.sortedSetRemove('uid:' + uid + ':uploads', uploadName); + await db.sortedSetRemove(`uid:${uid}:uploads`, uploadName); }; User.collateUploads = async function (uid, archive) { - await batch.processSortedSet('uid:' + uid + ':uploads', function (files, next) { + await batch.processSortedSet(`uid:${uid}:uploads`, function (files, next) { files.forEach(function (file) { archive.file(path.join(nconf.get('upload_path'), file), { name: path.basename(file), diff --git a/src/webserver.js b/src/webserver.js index 63254a08ed..fa8628202e 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -50,7 +50,7 @@ module.exports.app = app; server.on('error', function (err) { if (err.code === 'EADDRINUSE') { - winston.error('NodeBB address in use, exiting...\n' + err.stack); + winston.error(`NodeBB address in use, exiting...\n${err.stack}`); } else { winston.error(err.stack); } @@ -61,7 +61,7 @@ server.on('error', function (err) { // see https://github.com/isaacs/server-destroy/blob/master/index.js var connections = {}; server.on('connection', function (conn) { - var key = conn.remoteAddress + ':' + conn.remotePort; + var key = `${conn.remoteAddress}:${conn.remotePort}`; connections[key] = conn; conn.on('close', function () { delete connections[key]; @@ -139,12 +139,12 @@ function setupExpressApp(app) { app.use(compression()); } - app.get(relativePath + '/ping', pingController.ping); - app.get(relativePath + '/sping', pingController.ping); + app.get(`${relativePath}/ping`, pingController.ping); + app.get(`${relativePath}/sping`, pingController.ping); setupFavicon(app); - app.use(relativePath + '/apple-touch-icon', middleware.routeTouchIcon); + app.use(`${relativePath}/apple-touch-icon`, middleware.routeTouchIcon); configureBodyParser(app); @@ -240,7 +240,7 @@ function listen(callback) { } winston.warn('[startup] If you want to start nodebb on multiple ports please use loader.js'); - winston.warn('[startup] Defaulting to first port in array, ' + port[0]); + winston.warn(`[startup] Defaulting to first port in array, ${port[0]}`); port = port[0]; if (!port) { winston.error('[startup] Invalid port, exiting'); @@ -263,11 +263,11 @@ function listen(callback) { args.push(function (err) { if (err) { - winston.info('[startup] NodeBB was unable to listen on: ' + bind_address + ':' + port); + winston.info(`[startup] NodeBB was unable to listen on: ${bind_address}:${port}`); process.exit(); } - winston.info('NodeBB is now listening on: ' + (isSocket ? socketPath : bind_address + ':' + port)); + winston.info(`NodeBB is now listening on: ${isSocket ? socketPath : `${bind_address}:${port}`}`); if (oldUmask) { process.umask(oldUmask); } @@ -279,7 +279,7 @@ function listen(callback) { oldUmask = process.umask('0000'); module.exports.testSocket(socketPath, function (err) { if (err) { - winston.error('[startup] NodeBB was unable to secure domain socket access (' + socketPath + ')\n' + err.stack); + winston.error(`[startup] NodeBB was unable to secure domain socket access (${socketPath})\n${err.stack}`); throw err; } @@ -292,7 +292,7 @@ function listen(callback) { exports.testSocket = function (socketPath, callback) { if (typeof socketPath !== 'string') { - return callback(new Error('invalid socket path : ' + socketPath)); + return callback(new Error(`invalid socket path : ${socketPath}`)); } var net = require('net'); var file = require('./file'); diff --git a/src/widgets/index.js b/src/widgets/index.js index 9d0ddbd856..9a6f492786 100644 --- a/src/widgets/index.js +++ b/src/widgets/index.js @@ -62,7 +62,7 @@ async function renderWidget(widget, uid, options) { const userLang = config.userLang || meta.config.defaultLang || 'en-GB'; const templateData = _.assign({ }, options.templateData, { config: config }); - const data = await plugins.hooks.fire('filter:widget.render:' + widget.widget, { + const data = await plugins.hooks.fire(`filter:widget.render:${widget.widget}`, { uid: uid, area: options, templateData: templateData, @@ -105,7 +105,7 @@ async function checkVisibility(widget, uid) { } widgets.getWidgetDataForTemplates = async function (templates) { - const keys = templates.map(tpl => 'widgets:' + tpl); + const keys = templates.map(tpl => `widgets:${tpl}`); const data = await db.getObjects(keys); const returnData = {}; @@ -121,7 +121,7 @@ widgets.getWidgetDataForTemplates = async function (templates) { try { returnData[template][location] = parseWidgetData(templateWidgetData[location]); } catch (err) { - winston.error('can not parse widget data. template: ' + template + ' location: ' + location); + winston.error(`can not parse widget data. template: ${template} location: ${location}`); returnData[template][location] = []; } } else { @@ -134,7 +134,7 @@ widgets.getWidgetDataForTemplates = async function (templates) { }; widgets.getArea = async function (template, location) { - const result = await db.getObjectField('widgets:' + template, location); + const result = await db.getObjectField(`widgets:${template}`, location); if (!result) { return []; } @@ -164,7 +164,7 @@ widgets.setArea = async function (area) { throw new Error('Missing location and template data'); } - await db.setObjectField('widgets:' + area.template, area.location, JSON.stringify(area.widgets)); + await db.setObjectField(`widgets:${area.template}`, area.location, JSON.stringify(area.widgets)); }; widgets.reset = async function () { @@ -197,13 +197,13 @@ widgets.reset = async function () { widgets.resetTemplate = async function (template) { let toBeDrafted = []; - const area = await db.getObject('widgets:' + template + '.tpl'); + const area = await db.getObject(`widgets:${template}.tpl`); for (var location in area) { if (area.hasOwnProperty(location)) { toBeDrafted = toBeDrafted.concat(JSON.parse(area[location])); } } - await db.delete('widgets:' + template + '.tpl'); + await db.delete(`widgets:${template}.tpl`); let draftWidgets = await db.getObjectField('widgets:global', 'drafts'); draftWidgets = JSON.parse(draftWidgets).concat(toBeDrafted); await db.setObjectField('widgets:global', 'drafts', JSON.stringify(draftWidgets)); diff --git a/test/api.js b/test/api.js index 67d6bcf00d..0bf95e8fff 100644 --- a/test/api.js +++ b/test/api.js @@ -201,7 +201,7 @@ describe('API', async () => { // Retrieve CSRF token using cookie, to test Write API const config = await request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }); @@ -329,7 +329,7 @@ describe('API', async () => { switch (param.in) { case 'path': - testPath = testPath.replace('{' + param.name + '}', param.example); + testPath = testPath.replace(`{${param.name}}`, param.example); break; case 'header': headers[param.name] = param.example; @@ -456,7 +456,7 @@ describe('API', async () => { // Retrieve CSRF token using cookie, to test Write API const config = await request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }); @@ -503,7 +503,7 @@ describe('API', async () => { // Compare the schema to the response required.forEach((prop) => { if (schema.hasOwnProperty(prop)) { - assert(response.hasOwnProperty(prop), '"' + prop + '" is a required property (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert(response.hasOwnProperty(prop), `"${prop}" is a required property (path: ${method} ${path}, context: ${context})`); // Don't proceed with type-check if the value could possibly be unset (nullable: true, in spec) if (response[prop] === null && schema[prop].nullable === true) { @@ -511,25 +511,25 @@ describe('API', async () => { } // Therefore, if the value is actually null, that's a problem (nullable is probably missing) - assert(response[prop] !== null, '"' + prop + '" was null, but schema does not specify it to be a nullable property (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert(response[prop] !== null, `"${prop}" was null, but schema does not specify it to be a nullable property (path: ${method} ${path}, context: ${context})`); switch (schema[prop].type) { case 'string': - assert.strictEqual(typeof response[prop], 'string', '"' + prop + '" was expected to be a string, but was ' + typeof response[prop] + ' instead (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert.strictEqual(typeof response[prop], 'string', `"${prop}" was expected to be a string, but was ${typeof response[prop]} instead (path: ${method} ${path}, context: ${context})`); break; case 'boolean': - assert.strictEqual(typeof response[prop], 'boolean', '"' + prop + '" was expected to be a boolean, but was ' + typeof response[prop] + ' instead (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert.strictEqual(typeof response[prop], 'boolean', `"${prop}" was expected to be a boolean, but was ${typeof response[prop]} instead (path: ${method} ${path}, context: ${context})`); break; case 'object': - assert.strictEqual(typeof response[prop], 'object', '"' + prop + '" was expected to be an object, but was ' + typeof response[prop] + ' instead (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert.strictEqual(typeof response[prop], 'object', `"${prop}" was expected to be an object, but was ${typeof response[prop]} instead (path: ${method} ${path}, context: ${context})`); compare(schema[prop], response[prop], method, path, context ? [context, prop].join('.') : prop); break; case 'array': - assert.strictEqual(Array.isArray(response[prop]), true, '"' + prop + '" was expected to be an array, but was ' + typeof response[prop] + ' instead (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert.strictEqual(Array.isArray(response[prop]), true, `"${prop}" was expected to be an array, but was ${typeof response[prop]} instead (path: ${method} ${path}, context: ${context})`); if (schema[prop].items) { // Ensure the array items have a schema defined - assert(schema[prop].items.type || schema[prop].items.allOf, '"' + prop + '" is defined to be an array, but its items have no schema defined (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert(schema[prop].items.type || schema[prop].items.allOf, `"${prop}" is defined to be an array, but its items have no schema defined (path: ${method} ${path}, context: ${context})`); // Compare types if (schema[prop].items.type === 'object' || Array.isArray(schema[prop].items.allOf)) { @@ -538,7 +538,7 @@ describe('API', async () => { }); } else if (response[prop].length) { // for now response[prop].forEach((item) => { - assert.strictEqual(typeof item, schema[prop].items.type, '"' + prop + '" should have ' + schema[prop].items.type + ' items, but found ' + typeof items + ' instead (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert.strictEqual(typeof item, schema[prop].items.type, `"${prop}" should have ${schema[prop].items.type} items, but found ${typeof items} instead (path: ${method} ${path}, context: ${context})`); }); } } @@ -553,7 +553,7 @@ describe('API', async () => { return; } - assert(schema[prop], '"' + prop + '" was found in response, but is not defined in schema (path: ' + method + ' ' + path + ', context: ' + context + ')'); + assert(schema[prop], `"${prop}" was found in response, but is not defined in schema (path: ${method} ${path}, context: ${context})`); }); } }); diff --git a/test/authentication.js b/test/authentication.js index 4698cb2bcd..6b299f6254 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -18,7 +18,7 @@ describe('authentication', function () { function loginUser(username, password, callback) { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -26,7 +26,7 @@ describe('authentication', function () { return callback(err); } - request.post(nconf.get('url') + '/login', { + request.post(`${nconf.get('url')}/login`, { form: { username: username, password: password, @@ -46,7 +46,7 @@ describe('authentication', function () { function registerUser(email, username, password, callback) { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -54,7 +54,7 @@ describe('authentication', function () { return callback(err); } - request.post(nconf.get('url') + '/register', { + request.post(`${nconf.get('url')}/register`, { form: { email: email, username: username, @@ -142,13 +142,13 @@ describe('authentication', function () { it('should register and login a user', function (done) { request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { assert.ifError(err); - request.post(nconf.get('url') + '/register', { + request.post(`${nconf.get('url')}/register`, { form: { email: 'admin@nodebb.org', username: 'admin', @@ -167,7 +167,7 @@ describe('authentication', function () { assert(body); request({ - url: nconf.get('url') + '/api/self', + url: `${nconf.get('url')}/api/self`, json: true, jar: jar, }, function (err, response, body) { @@ -189,7 +189,7 @@ describe('authentication', function () { helpers.logoutUser(jar, function (err) { assert.ifError(err); request({ - url: nconf.get('url') + '/api/me', + url: `${nconf.get('url')}/api/me`, json: true, jar: jar, }, function (err, res, body) { @@ -206,7 +206,7 @@ describe('authentication', function () { assert.ifError(err); assert(body); request({ - url: nconf.get('url') + '/api/self', + url: `${nconf.get('url')}/api/self`, json: true, jar: jar, }, function (err, response, body) { @@ -214,7 +214,7 @@ describe('authentication', function () { assert(body); assert.equal(body.username, 'regular'); assert.equal(body.email, 'regular@nodebb.org'); - db.getObject('uid:' + regularUid + ':sessionUUID:sessionId', function (err, sessions) { + db.getObject(`uid:${regularUid}:sessionUUID:sessionId`, function (err, sessions) { assert.ifError(err); assert(sessions); assert(Object.keys(sessions).length > 0); @@ -226,12 +226,12 @@ describe('authentication', function () { it('should revoke all sessions', function (done) { var socketAdmin = require('../src/socket.io/admin'); - db.sortedSetCard('uid:' + regularUid + ':sessions', function (err, count) { + db.sortedSetCard(`uid:${regularUid}:sessions`, function (err, count) { assert.ifError(err); assert(count); socketAdmin.deleteAllSessions({ uid: 1 }, {}, function (err) { assert.ifError(err); - db.sortedSetCard('uid:' + regularUid + ':sessions', function (err, count) { + db.sortedSetCard(`uid:${regularUid}:sessions`, function (err, count) { assert.ifError(err); assert(!count); done(); @@ -243,7 +243,7 @@ describe('authentication', function () { it('should fail to login if ip address is invalid', function (done) { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -251,7 +251,7 @@ describe('authentication', function () { return done(err); } - request.post(nconf.get('url') + '/login', { + request.post(`${nconf.get('url')}/login`, { form: { username: 'regular', password: 'regularpwd', @@ -433,13 +433,13 @@ describe('authentication', function () { it('should send 200 if not logged in', function (done) { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { assert.ifError(err); - request.post(nconf.get('url') + '/logout', { + request.post(`${nconf.get('url')}/logout`, { form: {}, json: true, jar: jar, @@ -481,7 +481,7 @@ describe('authentication', function () { loginUser(bannedUser.username, bannedUser.pw, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 403); - assert.equal(body, '[[error:user-banned-reason-until, ' + utils.toISOString(expiry) + ', No reason given.]]'); + assert.equal(body, `[[error:user-banned-reason-until, ${utils.toISOString(expiry)}, No reason given.]]`); done(); }); }); @@ -533,7 +533,7 @@ describe('authentication', function () { function (res, body, jar, next) { assert.equal(res.statusCode, 403); assert.equal(body, '[[error:account-locked]]'); - db.exists('lockout:' + uid, next); + db.exists(`lockout:${uid}`, next); }, function (locked, next) { assert(locked); diff --git a/test/batch.js b/test/batch.js index 4c98302439..23bc4cb9a5 100644 --- a/test/batch.js +++ b/test/batch.js @@ -13,7 +13,7 @@ describe('batch', function () { before(function (done) { for (let i = 0; i < 100; i++) { scores.push(i); - values.push('val' + i); + values.push(`val${i}`); } db.sortedSetAdd('processMe', scores, values, done); }); diff --git a/test/categories.js b/test/categories.js index de01068137..ae08a7fb51 100644 --- a/test/categories.js +++ b/test/categories.js @@ -89,7 +89,7 @@ describe('Categories', function () { }); it('should load a category route', function (done) { - request(nconf.get('url') + '/api/category/' + categoryObj.cid + '/test-category', { json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/category/${categoryObj.cid}/test-category`, { json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert.equal(body.name, 'Test Category & NodeBB'); @@ -102,7 +102,7 @@ describe('Categories', function () { it('should not throw', function (done) { Categories.getCategoryById({ cid: categoryObj.cid, - set: 'cid:' + categoryObj.cid + ':tids', + set: `cid:${categoryObj.cid}:tids`, reverse: true, start: 0, stop: -1, @@ -191,10 +191,10 @@ describe('Categories', function () { it('should move posts from one category to another', function (done) { Categories.moveRecentReplies(moveTid, categoryObj.cid, moveCid, function (err) { assert.ifError(err); - db.getSortedSetRange('cid:' + categoryObj.cid + ':pids', 0, -1, function (err, pids) { + db.getSortedSetRange(`cid:${categoryObj.cid}:pids`, 0, -1, function (err, pids) { assert.ifError(err); assert.equal(pids.length, 0); - db.getSortedSetRange('cid:' + moveCid + ':pids', 0, -1, function (err, pids) { + db.getSortedSetRange(`cid:${moveCid}:pids`, 0, -1, function (err, pids) { assert.ifError(err); assert.equal(pids.length, 2); done(); @@ -674,7 +674,7 @@ describe('Categories', function () { }; Categories.update(data, function (err) { assert.ifError(err); - db.getSortedSetRange('cid:' + cid + ':tag:whitelist', 0, -1, function (err, tagWhitelist) { + db.getSortedSetRange(`cid:${cid}:tag:whitelist`, 0, -1, function (err, tagWhitelist) { assert.ifError(err); assert.deepEqual(['nodebb', 'jquery', 'javascript'], tagWhitelist); done(); diff --git a/test/controllers-admin.js b/test/controllers-admin.js index 32324df82c..2559fbf21e 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -69,7 +69,7 @@ describe('Admin Controllers', function () { helpers.loginUser('admin', 'barbar', function (err, _jar) { assert.ifError(err); jar = _jar; - request(nconf.get('url') + '/admin', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 403); assert(body); @@ -81,7 +81,7 @@ describe('Admin Controllers', function () { it('should load admin dashboard', function (done) { groups.join('administrators', adminUid, function (err) { assert.ifError(err); - request(nconf.get('url') + '/admin', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -91,7 +91,7 @@ describe('Admin Controllers', function () { }); it('should load groups page', function (done) { - request(nconf.get('url') + '/admin/manage/groups', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/manage/groups`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -100,7 +100,7 @@ describe('Admin Controllers', function () { }); it('should load groups detail page', function (done) { - request(nconf.get('url') + '/admin/manage/groups/administrators', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/manage/groups/administrators`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -109,7 +109,7 @@ describe('Admin Controllers', function () { }); it('should load global privileges page', function (done) { - request(nconf.get('url') + '/admin/manage/privileges', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/manage/privileges`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -118,7 +118,7 @@ describe('Admin Controllers', function () { }); it('should load privileges page for category 1', function (done) { - request(nconf.get('url') + '/admin/manage/privileges/1', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/manage/privileges/1`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -127,7 +127,7 @@ describe('Admin Controllers', function () { }); it('should load manage uploads', function (done) { - request(nconf.get('url') + '/admin/manage/uploads', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/manage/uploads`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -136,7 +136,7 @@ describe('Admin Controllers', function () { }); it('should load general settings page', function (done) { - request(nconf.get('url') + '/admin/settings', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/settings`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -145,7 +145,7 @@ describe('Admin Controllers', function () { }); it('should load email settings page', function (done) { - request(nconf.get('url') + '/admin/settings/email', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/settings/email`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -154,7 +154,7 @@ describe('Admin Controllers', function () { }); it('should load user settings page', function (done) { - request(nconf.get('url') + '/admin/settings/user', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin/settings/user`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -163,7 +163,7 @@ describe('Admin Controllers', function () { }); it('should load info page for a user', function (done) { - request(nconf.get('url') + '/api/user/regular/info', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/regular/info`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.history); @@ -175,7 +175,7 @@ describe('Admin Controllers', function () { }); it('should 404 for edit/email page if user does not exist', function (done) { - request(nconf.get('url') + '/api/user/doesnotexist/edit/email', { jar: jar, json: true }, function (err, res) { + request(`${nconf.get('url')}/api/user/doesnotexist/edit/email`, { jar: jar, json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -183,7 +183,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/settings/homepage', function (done) { - request(nconf.get('url') + '/api/admin/settings/homepage', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/settings/homepage`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.routes); @@ -192,7 +192,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/advanced/database', function (done) { - request(nconf.get('url') + '/api/admin/advanced/database', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/database`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); @@ -208,7 +208,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/extend/plugins', function (done) { - request(nconf.get('url') + '/api/admin/extend/plugins', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/extend/plugins`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert(body.hasOwnProperty('installed')); assert(body.hasOwnProperty('upgradeCount')); @@ -219,7 +219,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/users', function (done) { - request(nconf.get('url') + '/api/admin/manage/users', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/users`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -228,7 +228,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/registration', function (done) { - request(nconf.get('url') + '/api/admin/manage/registration', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/registration`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -237,7 +237,7 @@ describe('Admin Controllers', function () { }); it('should 404 if users is not privileged', function (done) { - request(nconf.get('url') + '/api/registration-queue', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/registration-queue`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -246,7 +246,7 @@ describe('Admin Controllers', function () { }); it('should load /api/registration-queue', function (done) { - request(nconf.get('url') + '/api/registration-queue', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/registration-queue`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -255,7 +255,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/admins-mods', function (done) { - request(nconf.get('url') + '/api/admin/manage/admins-mods', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/admins-mods`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -268,10 +268,10 @@ describe('Admin Controllers', function () { socketAdmin.user.exportUsersCSV({ uid: adminUid }, {}, function (err) { assert.ifError(err); setTimeout(function () { - request(nconf.get('url') + '/api/admin/users/csv', { + request(`${nconf.get('url')}/api/admin/users/csv`, { jar: jar, headers: { - referer: nconf.get('url') + '/admin/manage/users', + referer: `${nconf.get('url')}/admin/manage/users`, }, }, function (err, res, body) { assert.ifError(err); @@ -284,7 +284,7 @@ describe('Admin Controllers', function () { }); it('should return 403 if no referer', function (done) { - request(nconf.get('url') + '/api/admin/groups/administrators/csv', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/groups/administrators/csv`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 403); assert.equal(body, '[[error:invalid-origin]]'); @@ -293,7 +293,7 @@ describe('Admin Controllers', function () { }); it('should return 403 if referer is not /api/admin/groups/administrators/csv', function (done) { - request(nconf.get('url') + '/api/admin/groups/administrators/csv', { + request(`${nconf.get('url')}/api/admin/groups/administrators/csv`, { jar: jar, headers: { referer: '/topic/1/test', @@ -307,10 +307,10 @@ describe('Admin Controllers', function () { }); it('should load /api/admin/groups/administrators/csv', function (done) { - request(nconf.get('url') + '/api/admin/groups/administrators/csv', { + request(`${nconf.get('url')}/api/admin/groups/administrators/csv`, { jar: jar, headers: { - referer: nconf.get('url') + '/admin/manage/groups', + referer: `${nconf.get('url')}/admin/manage/groups`, }, }, function (err, res, body) { assert.ifError(err); @@ -321,7 +321,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/advanced/hooks', function (done) { - request(nconf.get('url') + '/api/admin/advanced/hooks', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/hooks`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -330,7 +330,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/advanced/cache', function (done) { - request(nconf.get('url') + '/api/admin/advanced/cache', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/cache`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -339,7 +339,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/advanced/errors', function (done) { - request(nconf.get('url') + '/api/admin/advanced/errors', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/errors`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -350,7 +350,7 @@ describe('Admin Controllers', function () { it('should load /admin/advanced/errors/export', function (done) { meta.errors.clear(function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/admin/advanced/errors/export', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/errors/export`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.strictEqual(body, ''); @@ -363,7 +363,7 @@ describe('Admin Controllers', function () { var fs = require('fs'); fs.appendFile(meta.logs.path, 'dummy log', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/admin/advanced/logs', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/logs`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -378,7 +378,7 @@ describe('Admin Controllers', function () { navigation.save(data, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/admin/settings/navigation', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/settings/navigation`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert(body); assert(body.available); @@ -389,7 +389,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/development/info', function (done) { - request(nconf.get('url') + '/api/admin/development/info', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/development/info`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -398,7 +398,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/development/logger', function (done) { - request(nconf.get('url') + '/api/admin/development/logger', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/development/logger`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -407,7 +407,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/advanced/events', function (done) { - request(nconf.get('url') + '/api/admin/advanced/events', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/advanced/events`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -416,7 +416,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/categories', function (done) { - request(nconf.get('url') + '/api/admin/manage/categories', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/categories`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -425,7 +425,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/categories/1', function (done) { - request(nconf.get('url') + '/api/admin/manage/categories/1', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/categories/1`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -434,7 +434,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/categories/1/analytics', function (done) { - request(nconf.get('url') + '/api/admin/manage/categories/1/analytics', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/categories/1/analytics`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -443,7 +443,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/extend/rewards', function (done) { - request(nconf.get('url') + '/api/admin/extend/rewards', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/extend/rewards`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -452,7 +452,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/extend/widgets', function (done) { - request(nconf.get('url') + '/api/admin/extend/widgets', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/extend/widgets`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -461,7 +461,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/settings/languages', function (done) { - request(nconf.get('url') + '/api/admin/settings/languages', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/settings/languages`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -473,7 +473,7 @@ describe('Admin Controllers', function () { var socketAdmin = require('../src/socket.io/admin'); socketAdmin.social.savePostSharingNetworks({ uid: adminUid }, ['facebook', 'twitter'], function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/admin/settings/social', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/settings/social`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert(body); body = body.posts.map(function (network) { @@ -487,7 +487,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/manage/tags', function (done) { - request(nconf.get('url') + '/api/admin/manage/tags', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/tags`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -496,7 +496,7 @@ describe('Admin Controllers', function () { }); it('/post-queue should 404 for regular user', function (done) { - request(nconf.get('url') + '/api/post-queue', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post-queue`, { json: true }, function (err, res, body) { assert.ifError(err); assert(body); assert.equal(res.statusCode, 404); @@ -505,7 +505,7 @@ describe('Admin Controllers', function () { }); it('should load /post-queue', function (done) { - request(nconf.get('url') + '/api/post-queue', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post-queue`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -514,7 +514,7 @@ describe('Admin Controllers', function () { }); it('/ip-blacklist should 404 for regular user', function (done) { - request(nconf.get('url') + '/api/ip-blacklist', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/ip-blacklist`, { json: true }, function (err, res, body) { assert.ifError(err); assert(body); assert.equal(res.statusCode, 404); @@ -523,7 +523,7 @@ describe('Admin Controllers', function () { }); it('should load /ip-blacklist', function (done) { - request(nconf.get('url') + '/api/ip-blacklist', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/ip-blacklist`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -532,7 +532,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/appearance/themes', function (done) { - request(nconf.get('url') + '/api/admin/appearance/themes', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/appearance/themes`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -541,7 +541,7 @@ describe('Admin Controllers', function () { }); it('should load /admin/appearance/customise', function (done) { - request(nconf.get('url') + '/api/admin/appearance/customise', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/appearance/customise`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -551,7 +551,7 @@ describe('Admin Controllers', function () { it('should load /recent in maintenance mode', function (done) { meta.config.maintenanceMode = 1; - request(nconf.get('url') + '/api/recent', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/recent`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -568,12 +568,12 @@ describe('Admin Controllers', function () { assert.ifError(err); moderatorJar = _jar; - groups.join('cid:' + cid + ':privileges:moderate', moderatorUid, done); + groups.join(`cid:${cid}:privileges:moderate`, moderatorUid, done); }); }); it('should error with no privileges', function (done) { - request(nconf.get('url') + '/api/flags', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/flags`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.error, '[[error:no-privileges]]'); done(); @@ -581,7 +581,7 @@ describe('Admin Controllers', function () { }); it('should load flags page data', function (done) { - request(nconf.get('url') + '/api/flags', { jar: moderatorJar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/flags`, { jar: moderatorJar, json: true }, function (err, res, body) { assert.ifError(err); assert(body); assert(body.flags); @@ -592,7 +592,7 @@ describe('Admin Controllers', function () { }); it('should return invalid data if flag does not exist', function (done) { - request(nconf.get('url') + '/api/flags/123123123', { jar: moderatorJar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/flags/123123123`, { jar: moderatorJar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.error, '[[error:invalid-data]]'); done(); @@ -627,7 +627,7 @@ describe('Admin Controllers', function () { socketFlags.create({ uid: regularUid }, { id: regularPid, type: 'post', reason: 'spam' }, function (err, flagId) { meta.config['min:rep:flag'] = oldValue; assert.ifError(err); - request(nconf.get('url') + '/api/flags/' + flagId, { jar: moderatorJar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/flags/${flagId}`, { jar: moderatorJar, json: true }, function (err, res, body) { assert.ifError(err); assert(body); assert(body.reports); @@ -648,7 +648,7 @@ describe('Admin Controllers', function () { callback(null, config); } plugins.hooks.register('somePlugin', { hook: 'filter:config.get', method: onConfigGet }); - request(nconf.get('url') + '/admin', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/admin`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); diff --git a/test/controllers.js b/test/controllers.js index 9ee7b93695..a2cd20c509 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -62,7 +62,7 @@ describe('Controllers', function () { it('should load /config with csrf_token', function (done) { request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, }, function (err, response, body) { assert.ifError(err); @@ -74,7 +74,7 @@ describe('Controllers', function () { it('should load /config with no csrf_token as spider', function (done) { request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, headers: { 'user-agent': 'yandex', @@ -188,7 +188,7 @@ describe('Controllers', function () { }); it('should not load breadcrumbs on home page route', function (done) { - request(nconf.get('url') + '/api', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -227,7 +227,7 @@ describe('Controllers', function () { meta.configs.set('homePageRoute', 'mycustompage', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.works, true); @@ -262,7 +262,7 @@ describe('Controllers', function () { }); it('should load /reset without code', function (done) { - request(nconf.get('url') + '/reset', function (err, res, body) { + request(`${nconf.get('url')}/reset`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -271,7 +271,7 @@ describe('Controllers', function () { }); it('should load /reset with invalid code', function (done) { - request(nconf.get('url') + '/reset/123123', function (err, res, body) { + request(`${nconf.get('url')}/reset/123123`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -280,7 +280,7 @@ describe('Controllers', function () { }); it('should load /login', function (done) { - request(nconf.get('url') + '/login', function (err, res, body) { + request(`${nconf.get('url')}/login`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -289,7 +289,7 @@ describe('Controllers', function () { }); it('should load /register', function (done) { - request(nconf.get('url') + '/register', function (err, res, body) { + request(`${nconf.get('url')}/register`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -317,13 +317,13 @@ describe('Controllers', function () { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { assert.ifError(err); - request.post(nconf.get('url') + '/register', { + request.post(`${nconf.get('url')}/register`, { form: data, json: true, jar: jar, @@ -333,8 +333,8 @@ describe('Controllers', function () { }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert.strictEqual(body.next, nconf.get('relative_path') + '/register/complete'); - request(nconf.get('url') + '/api/register/complete', { + assert.strictEqual(body.next, `${nconf.get('relative_path')}/register/complete`); + request(`${nconf.get('url')}/api/register/complete`, { jar: jar, json: true, }, function (err, res, body) { @@ -351,7 +351,7 @@ describe('Controllers', function () { }); it('should load /robots.txt', function (done) { - request(nconf.get('url') + '/robots.txt', function (err, res, body) { + request(`${nconf.get('url')}/robots.txt`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -360,7 +360,7 @@ describe('Controllers', function () { }); it('should load /manifest.webmanifest', function (done) { - request(nconf.get('url') + '/manifest.webmanifest', function (err, res, body) { + request(`${nconf.get('url')}/manifest.webmanifest`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -369,7 +369,7 @@ describe('Controllers', function () { }); it('should load /outgoing?url=', function (done) { - request(nconf.get('url') + '/outgoing?url=http://youtube.com', function (err, res, body) { + request(`${nconf.get('url')}/outgoing?url=http://youtube.com`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -378,7 +378,7 @@ describe('Controllers', function () { }); it('should 404 on /outgoing with no url', function (done) { - request(nconf.get('url') + '/outgoing', function (err, res, body) { + request(`${nconf.get('url')}/outgoing`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -387,7 +387,7 @@ describe('Controllers', function () { }); it('should 404 on /outgoing with javascript: protocol', function (done) { - request(nconf.get('url') + '/outgoing?url=javascript:alert(1);', function (err, res, body) { + request(`${nconf.get('url')}/outgoing?url=javascript:alert(1);`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -396,7 +396,7 @@ describe('Controllers', function () { }); it('should 404 on /outgoing with invalid url', function (done) { - request(nconf.get('url') + '/outgoing?url=derp', function (err, res, body) { + request(`${nconf.get('url')}/outgoing?url=derp`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -406,7 +406,7 @@ describe('Controllers', function () { it('should load /tos', function (done) { meta.config.termsOfUse = 'please accept our tos'; - request(nconf.get('url') + '/tos', function (err, res, body) { + request(`${nconf.get('url')}/tos`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -417,7 +417,7 @@ describe('Controllers', function () { it('should load 404 if meta.config.termsOfUse is empty', function (done) { meta.config.termsOfUse = ''; - request(nconf.get('url') + '/tos', function (err, res, body) { + request(`${nconf.get('url')}/tos`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -426,7 +426,7 @@ describe('Controllers', function () { }); it('should load /sping', function (done) { - request(nconf.get('url') + '/sping', function (err, res, body) { + request(`${nconf.get('url')}/sping`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body, 'healthy'); @@ -435,7 +435,7 @@ describe('Controllers', function () { }); it('should load /ping', function (done) { - request(nconf.get('url') + '/ping', function (err, res, body) { + request(`${nconf.get('url')}/ping`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body, '200'); @@ -444,7 +444,7 @@ describe('Controllers', function () { }); it('should handle 404', function (done) { - request(nconf.get('url') + '/arouteinthevoid', function (err, res, body) { + request(`${nconf.get('url')}/arouteinthevoid`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -453,7 +453,7 @@ describe('Controllers', function () { }); it('should load topic rss feed', function (done) { - request(nconf.get('url') + '/topic/' + tid + '.rss', function (err, res, body) { + request(`${nconf.get('url')}/topic/${tid}.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -462,7 +462,7 @@ describe('Controllers', function () { }); it('should load category rss feed', function (done) { - request(nconf.get('url') + '/category/' + cid + '.rss', function (err, res, body) { + request(`${nconf.get('url')}/category/${cid}.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -471,7 +471,7 @@ describe('Controllers', function () { }); it('should load topics rss feed', function (done) { - request(nconf.get('url') + '/topics.rss', function (err, res, body) { + request(`${nconf.get('url')}/topics.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -480,7 +480,7 @@ describe('Controllers', function () { }); it('should load recent rss feed', function (done) { - request(nconf.get('url') + '/recent.rss', function (err, res, body) { + request(`${nconf.get('url')}/recent.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -489,7 +489,7 @@ describe('Controllers', function () { }); it('should load top rss feed', function (done) { - request(nconf.get('url') + '/top.rss', function (err, res, body) { + request(`${nconf.get('url')}/top.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -498,7 +498,7 @@ describe('Controllers', function () { }); it('should load popular rss feed', function (done) { - request(nconf.get('url') + '/popular.rss', function (err, res, body) { + request(`${nconf.get('url')}/popular.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -507,7 +507,7 @@ describe('Controllers', function () { }); it('should load popular rss feed with term', function (done) { - request(nconf.get('url') + '/popular/day.rss', function (err, res, body) { + request(`${nconf.get('url')}/popular/day.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -516,7 +516,7 @@ describe('Controllers', function () { }); it('should load recent posts rss feed', function (done) { - request(nconf.get('url') + '/recentposts.rss', function (err, res, body) { + request(`${nconf.get('url')}/recentposts.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -525,7 +525,7 @@ describe('Controllers', function () { }); it('should load category recent posts rss feed', function (done) { - request(nconf.get('url') + '/category/' + cid + '/recentposts.rss', function (err, res, body) { + request(`${nconf.get('url')}/category/${cid}/recentposts.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -534,7 +534,7 @@ describe('Controllers', function () { }); it('should load user topics rss feed', function (done) { - request(nconf.get('url') + '/user/foo/topics.rss', function (err, res, body) { + request(`${nconf.get('url')}/user/foo/topics.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -543,7 +543,7 @@ describe('Controllers', function () { }); it('should load tag rss feed', function (done) { - request(nconf.get('url') + '/tags/nodebb.rss', function (err, res, body) { + request(`${nconf.get('url')}/tags/nodebb.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -552,7 +552,7 @@ describe('Controllers', function () { }); it('should load client.css', function (done) { - request(nconf.get('url') + '/assets/client.css', function (err, res, body) { + request(`${nconf.get('url')}/assets/client.css`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -561,7 +561,7 @@ describe('Controllers', function () { }); it('should load admin.css', function (done) { - request(nconf.get('url') + '/assets/admin.css', function (err, res, body) { + request(`${nconf.get('url')}/assets/admin.css`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -571,7 +571,7 @@ describe('Controllers', function () { it('should load nodebb.min.js', function (done) { - request(nconf.get('url') + '/assets/nodebb.min.js', function (err, res, body) { + request(`${nconf.get('url')}/assets/nodebb.min.js`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -580,7 +580,7 @@ describe('Controllers', function () { }); it('should load acp.min.js', function (done) { - request(nconf.get('url') + '/assets/acp.min.js', function (err, res, body) { + request(`${nconf.get('url')}/assets/acp.min.js`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -589,7 +589,7 @@ describe('Controllers', function () { }); it('should load sitemap.xml', function (done) { - request(nconf.get('url') + '/sitemap.xml', function (err, res, body) { + request(`${nconf.get('url')}/sitemap.xml`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -598,7 +598,7 @@ describe('Controllers', function () { }); it('should load sitemap/pages.xml', function (done) { - request(nconf.get('url') + '/sitemap/pages.xml', function (err, res, body) { + request(`${nconf.get('url')}/sitemap/pages.xml`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -607,7 +607,7 @@ describe('Controllers', function () { }); it('should load sitemap/categories.xml', function (done) { - request(nconf.get('url') + '/sitemap/categories.xml', function (err, res, body) { + request(`${nconf.get('url')}/sitemap/categories.xml`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -616,7 +616,7 @@ describe('Controllers', function () { }); it('should load sitemap/topics/1.xml', function (done) { - request(nconf.get('url') + '/sitemap/topics.1.xml', function (err, res, body) { + request(`${nconf.get('url')}/sitemap/topics.1.xml`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -625,7 +625,7 @@ describe('Controllers', function () { }); it('should load robots.txt', function (done) { - request(nconf.get('url') + '/robots.txt', function (err, res, body) { + request(`${nconf.get('url')}/robots.txt`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -634,7 +634,7 @@ describe('Controllers', function () { }); it('should load theme screenshot', function (done) { - request(nconf.get('url') + '/css/previews/nodebb-theme-persona', function (err, res, body) { + request(`${nconf.get('url')}/css/previews/nodebb-theme-persona`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -643,7 +643,7 @@ describe('Controllers', function () { }); it('should load users page', function (done) { - request(nconf.get('url') + '/users', function (err, res, body) { + request(`${nconf.get('url')}/users`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -652,7 +652,7 @@ describe('Controllers', function () { }); it('should load users page', function (done) { - request(nconf.get('url') + '/users?section=online', function (err, res, body) { + request(`${nconf.get('url')}/users?section=online`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -661,7 +661,7 @@ describe('Controllers', function () { }); it('should error if guests do not have search privilege', function (done) { - request(nconf.get('url') + '/api/users?query=bar§ion=sort-posts', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/users?query=bar§ion=sort-posts`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 500); assert(body); @@ -673,7 +673,7 @@ describe('Controllers', function () { it('should load users search page', function (done) { privileges.global.give(['groups:search:users'], 'guests', function (err) { assert.ifError(err); - request(nconf.get('url') + '/users?query=bar§ion=sort-posts', function (err, res, body) { + request(`${nconf.get('url')}/users?query=bar§ion=sort-posts`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -683,7 +683,7 @@ describe('Controllers', function () { }); it('should load groups page', function (done) { - request(nconf.get('url') + '/groups', function (err, res, body) { + request(`${nconf.get('url')}/groups`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -707,7 +707,7 @@ describe('Controllers', function () { cid: cid, }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/groups/group-details', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/groups/group-details`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -720,7 +720,7 @@ describe('Controllers', function () { }); it('should load group members page', function (done) { - request(nconf.get('url') + '/groups/group-details/members', function (err, res, body) { + request(`${nconf.get('url')}/groups/group-details/members`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -736,7 +736,7 @@ describe('Controllers', function () { hidden: 1, }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/groups/hidden-group/members', function (err, res) { + request(`${nconf.get('url')}/groups/hidden-group/members`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -745,7 +745,7 @@ describe('Controllers', function () { }); it('should get recent posts', function (done) { - request(nconf.get('url') + '/api/recent/posts/month', function (err, res, body) { + request(`${nconf.get('url')}/api/recent/posts/month`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -754,7 +754,7 @@ describe('Controllers', function () { }); it('should get post data', function (done) { - request(nconf.get('url') + '/api/v3/posts/' + pid, function (err, res, body) { + request(`${nconf.get('url')}/api/v3/posts/${pid}`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -763,7 +763,7 @@ describe('Controllers', function () { }); it('should get topic data', function (done) { - request(nconf.get('url') + '/api/v3/topics/' + tid, function (err, res, body) { + request(`${nconf.get('url')}/api/v3/topics/${tid}`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -772,7 +772,7 @@ describe('Controllers', function () { }); it('should get category data', function (done) { - request(nconf.get('url') + '/api/v3/categories/' + cid, function (err, res, body) { + request(`${nconf.get('url')}/api/v3/categories/${cid}`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -800,7 +800,7 @@ describe('Controllers', function () { }); it('should fail to revoke session with missing uuid', function (done) { - request.del(nconf.get('url') + '/api/user/revokeme/session', { + request.del(`${nconf.get('url')}/api/user/revokeme/session`, { jar: jar, headers: { 'x-csrf-token': csrf_token, @@ -832,7 +832,7 @@ describe('Controllers', function () { }); it('should revoke user session', function (done) { - db.getSortedSetRange('uid:' + uid + ':sessions', 0, -1, function (err, sids) { + db.getSortedSetRange(`uid:${uid}:sessions`, 0, -1, function (err, sids) { assert.ifError(err); var sid = sids[0]; @@ -890,7 +890,7 @@ describe('Controllers', function () { }); it('should return {} if there are no widgets', function (done) { - request(nconf.get('url') + '/api/category/' + cid, { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${cid}`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.widgets); @@ -900,7 +900,7 @@ describe('Controllers', function () { }); it('should render templates', function (done) { - var url = nconf.get('url') + '/api/categories'; + var url = `${nconf.get('url')}/api/categories`; request(url, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); @@ -914,7 +914,7 @@ describe('Controllers', function () { it('should reset templates', function (done) { widgets.resetTemplates(['categories', 'category'], function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/categories', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/categories`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.widgets); @@ -942,7 +942,7 @@ describe('Controllers', function () { }); it('should render tags page', function (done) { - request(nconf.get('url') + '/api/tags', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/tags`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -952,7 +952,7 @@ describe('Controllers', function () { }); it('should render tag page with no topics', function (done) { - request(nconf.get('url') + '/api/tags/notag', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/tags/notag`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -963,7 +963,7 @@ describe('Controllers', function () { }); it('should render tag page with 1 topic', function (done) { - request(nconf.get('url') + '/api/tags/nodebb', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/tags/nodebb`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -986,7 +986,7 @@ describe('Controllers', function () { }); it('should return 503 in maintenance mode', function (done) { - request(nconf.get('url') + '/recent', { json: true }, function (err, res) { + request(`${nconf.get('url')}/recent`, { json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 503); done(); @@ -994,7 +994,7 @@ describe('Controllers', function () { }); it('should return 503 in maintenance mode', function (done) { - request(nconf.get('url') + '/api/recent', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/recent`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 503); assert(body); @@ -1003,7 +1003,7 @@ describe('Controllers', function () { }); it('should return 200 in maintenance mode', function (done) { - request(nconf.get('url') + '/api/login', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/login`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1023,7 +1023,7 @@ describe('Controllers', function () { }); it('should redirect to account page with logged in user', function (done) { - request(nconf.get('url') + '/api/login', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/login`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/user/foo'); @@ -1033,7 +1033,7 @@ describe('Controllers', function () { }); it('should 404 if uid is not a number', function (done) { - request(nconf.get('url') + '/api/uid/test', { json: true }, function (err, res) { + request(`${nconf.get('url')}/api/uid/test`, { json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1041,7 +1041,7 @@ describe('Controllers', function () { }); it('should redirect to userslug', function (done) { - request(nconf.get('url') + '/api/uid/' + fooUid, { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/uid/${fooUid}`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/user/foo'); @@ -1051,7 +1051,7 @@ describe('Controllers', function () { }); it('should 404 if user does not exist', function (done) { - request(nconf.get('url') + '/api/uid/123123', { json: true }, function (err, res) { + request(`${nconf.get('url')}/api/uid/123123`, { json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1060,7 +1060,7 @@ describe('Controllers', function () { describe('/me/*', function () { it('should redirect to user profile', function (done) { - request(nconf.get('url') + '/me', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/me`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.includes('"template":{"name":"account/profile","account/profile":true}')); @@ -1069,7 +1069,7 @@ describe('Controllers', function () { }); }); it('api should redirect to /user/[userslug]/bookmarks', function (done) { - request(nconf.get('url') + '/api/me/bookmarks', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/me/bookmarks`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/user/foo/bookmarks'); @@ -1078,7 +1078,7 @@ describe('Controllers', function () { }); }); it('api should redirect to /user/[userslug]/edit/username', function (done) { - request(nconf.get('url') + '/api/me/edit/username', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/me/edit/username`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/user/foo/edit/username'); @@ -1087,7 +1087,7 @@ describe('Controllers', function () { }); }); it('should redirect to login if user is not logged in', function (done) { - request(nconf.get('url') + '/me/bookmarks', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/me/bookmarks`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.includes('Login to your account'), body.substr(0, 500)); @@ -1097,7 +1097,7 @@ describe('Controllers', function () { }); it('should 401 if user is not logged in', function (done) { - request(nconf.get('url') + '/api/admin', { json: true }, function (err, res) { + request(`${nconf.get('url')}/api/admin`, { json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 401); done(); @@ -1105,7 +1105,7 @@ describe('Controllers', function () { }); it('should 403 if user is not admin', function (done) { - request(nconf.get('url') + '/api/admin', { jar: jar, json: true }, function (err, res) { + request(`${nconf.get('url')}/api/admin`, { jar: jar, json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 403); done(); @@ -1113,7 +1113,7 @@ describe('Controllers', function () { }); it('should load /user/foo/posts', function (done) { - request(nconf.get('url') + '/api/user/foo/posts', function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/posts`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1122,7 +1122,7 @@ describe('Controllers', function () { }); it('should 401 if not logged in', function (done) { - request(nconf.get('url') + '/api/user/foo/bookmarks', function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/bookmarks`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 401); assert(body); @@ -1131,7 +1131,7 @@ describe('Controllers', function () { }); it('should load /user/foo/bookmarks', function (done) { - request(nconf.get('url') + '/api/user/foo/bookmarks', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/bookmarks`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1140,7 +1140,7 @@ describe('Controllers', function () { }); it('should load /user/foo/upvoted', function (done) { - request(nconf.get('url') + '/api/user/foo/upvoted', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/upvoted`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1149,7 +1149,7 @@ describe('Controllers', function () { }); it('should load /user/foo/downvoted', function (done) { - request(nconf.get('url') + '/api/user/foo/downvoted', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/downvoted`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1158,7 +1158,7 @@ describe('Controllers', function () { }); it('should load /user/foo/best', function (done) { - request(nconf.get('url') + '/api/user/foo/best', function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/best`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1167,7 +1167,7 @@ describe('Controllers', function () { }); it('should load /user/foo/watched', function (done) { - request(nconf.get('url') + '/api/user/foo/watched', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/watched`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1176,7 +1176,7 @@ describe('Controllers', function () { }); it('should load /user/foo/ignored', function (done) { - request(nconf.get('url') + '/api/user/foo/ignored', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/ignored`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1185,7 +1185,7 @@ describe('Controllers', function () { }); it('should load /user/foo/topics', function (done) { - request(nconf.get('url') + '/api/user/foo/topics', function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/topics`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1194,7 +1194,7 @@ describe('Controllers', function () { }); it('should load /user/foo/blocks', function (done) { - request(nconf.get('url') + '/api/user/foo/blocks', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/blocks`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1203,7 +1203,7 @@ describe('Controllers', function () { }); it('should load /user/foo/consent', function (done) { - request(nconf.get('url') + '/api/user/foo/consent', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/consent`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1212,7 +1212,7 @@ describe('Controllers', function () { }); it('should load /user/foo/sessions', function (done) { - request(nconf.get('url') + '/api/user/foo/sessions', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/sessions`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1221,7 +1221,7 @@ describe('Controllers', function () { }); it('should load /user/foo/categories', function (done) { - request(nconf.get('url') + '/api/user/foo/categories', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/categories`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1230,7 +1230,7 @@ describe('Controllers', function () { }); it('should load /user/foo/uploads', function (done) { - request(nconf.get('url') + '/api/user/foo/uploads', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/uploads`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1239,7 +1239,7 @@ describe('Controllers', function () { }); it('should export users posts', function (done) { - request(nconf.get('url') + '/api/user/uid/foo/export/posts', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/uid/foo/export/posts`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1248,7 +1248,7 @@ describe('Controllers', function () { }); it('should export users uploads', function (done) { - request(nconf.get('url') + '/api/user/uid/foo/export/uploads', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/uid/foo/export/uploads`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1257,7 +1257,7 @@ describe('Controllers', function () { }); it('should export users profile', function (done) { - request(nconf.get('url') + '/api/user/uid/foo/export/profile', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/uid/foo/export/profile`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1271,11 +1271,11 @@ describe('Controllers', function () { bodyShort: '[[notifications:user_posted_to, test1, test2]]', bodyLong: 'some post content', pid: 1, - path: '/post/' + 1, - nid: 'new_post:tid:' + 1 + ':pid:' + 1 + ':uid:' + fooUid, + path: `/post/${1}`, + nid: `new_post:tid:${1}:pid:${1}:uid:${fooUid}`, tid: 1, from: fooUid, - mergeId: 'notifications:user_posted_to|' + 1, + mergeId: `notifications:user_posted_to|${1}`, topicTitle: 'topic title', }; async.waterfall([ @@ -1289,7 +1289,7 @@ describe('Controllers', function () { setTimeout(next, 2500); }, function (next) { - request(nconf.get('url') + '/api/notifications', { jar: jar, json: true }, next); + request(`${nconf.get('url')}/api/notifications`, { jar: jar, json: true }, next); }, function (res, body, next) { assert.equal(res.statusCode, 200); @@ -1306,7 +1306,7 @@ describe('Controllers', function () { }); it('should 404 if user does not exist', function (done) { - request(nconf.get('url') + '/api/user/email/doesnotexist', function (err, res, body) { + request(`${nconf.get('url')}/api/user/email/doesnotexist`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -1315,7 +1315,7 @@ describe('Controllers', function () { }); it('should load user by uid', function (done) { - request(nconf.get('url') + '/api/user/uid/' + fooUid, function (err, res, body) { + request(`${nconf.get('url')}/api/user/uid/${fooUid}`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1324,7 +1324,7 @@ describe('Controllers', function () { }); it('should load user by username', function (done) { - request(nconf.get('url') + '/api/user/username/foo', function (err, res, body) { + request(`${nconf.get('url')}/api/user/username/foo`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1333,7 +1333,7 @@ describe('Controllers', function () { }); it('should load user by email', function (done) { - request(nconf.get('url') + '/api/user/email/foo@test.com', function (err, res, body) { + request(`${nconf.get('url')}/api/user/email/foo@test.com`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1344,7 +1344,7 @@ describe('Controllers', function () { it('should return 401 if user does not have view:users privilege', function (done) { privileges.global.rescind(['groups:view:users'], 'guests', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/user/foo', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 401); assert.deepEqual(body, { @@ -1364,10 +1364,10 @@ describe('Controllers', function () { assert.ifError(err); helpers.loginUser('regularJoe', 'barbar', function (err, jar) { assert.ifError(err); - request(nconf.get('url') + '/api/user/foo/info', { jar: jar, json: true }, function (err, res) { + request(`${nconf.get('url')}/api/user/foo/info`, { jar: jar, json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 403); - request(nconf.get('url') + '/api/user/foo/edit', { jar: jar, json: true }, function (err, res) { + request(`${nconf.get('url')}/api/user/foo/edit`, { jar: jar, json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 403); done(); @@ -1378,7 +1378,7 @@ describe('Controllers', function () { }); it('should load correct user', function (done) { - request(nconf.get('url') + '/api/user/FOO', { jar: jar, json: true }, function (err, res) { + request(`${nconf.get('url')}/api/user/FOO`, { jar: jar, json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 200); done(); @@ -1386,7 +1386,7 @@ describe('Controllers', function () { }); it('should redirect', function (done) { - request(nconf.get('url') + '/user/FOO', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/user/FOO`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1395,7 +1395,7 @@ describe('Controllers', function () { }); it('should 404 if user does not exist', function (done) { - request(nconf.get('url') + '/api/user/doesnotexist', { jar: jar }, function (err, res) { + request(`${nconf.get('url')}/api/user/doesnotexist`, { jar: jar }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1403,7 +1403,7 @@ describe('Controllers', function () { }); it('should not increase profile view if you visit your own profile', (done) => { - request(nconf.get('url') + '/api/user/foo', { jar: jar }, function (err, res) { + request(`${nconf.get('url')}/api/user/foo`, { jar: jar }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 200); setTimeout(function () { @@ -1417,7 +1417,7 @@ describe('Controllers', function () { }); it('should not increase profile view if a guest visits a profile', (done) => { - request(nconf.get('url') + '/api/user/foo', {}, function (err, res) { + request(`${nconf.get('url')}/api/user/foo`, {}, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 200); setTimeout(function () { @@ -1433,7 +1433,7 @@ describe('Controllers', function () { it('should increase profile view', function (done) { helpers.loginUser('regularJoe', 'barbar', function (err, jar) { assert.ifError(err); - request(nconf.get('url') + '/api/user/foo', { jar: jar }, function (err, res) { + request(`${nconf.get('url')}/api/user/foo`, { jar: jar }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 200); setTimeout(function () { @@ -1450,7 +1450,7 @@ describe('Controllers', function () { it('should parse about me', function (done) { user.setUserFields(fooUid, { picture: '/path/to/picture', aboutme: 'hi i am a bot' }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/user/foo', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.aboutme, 'hi i am a bot'); @@ -1462,7 +1462,7 @@ describe('Controllers', function () { it('should not return reputation if reputation is disabled', function (done) { meta.config['reputation:disabled'] = 1; - request(nconf.get('url') + '/api/user/foo', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo`, { json: true }, function (err, res, body) { meta.config['reputation:disabled'] = 0; assert.ifError(err); assert.equal(res.statusCode, 200); @@ -1490,7 +1490,7 @@ describe('Controllers', function () { posts.delete(pidToDelete, fooUid, next); }, function (next) { - request(nconf.get('url') + '/api/user/foo', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); var contents = body.posts.map(function (p) { @@ -1512,7 +1512,7 @@ describe('Controllers', function () { assert.ifError(err); groups.join('selectedGroup', uid, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/user/groupie', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/groupie`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(Array.isArray(body.selectedGroup)); @@ -1527,7 +1527,7 @@ describe('Controllers', function () { it('should 404 if user does not exist', function (done) { groups.join('administrators', fooUid, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/user/doesnotexist/edit', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/doesnotexist/edit`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); groups.leave('administrators', fooUid, done); @@ -1536,7 +1536,7 @@ describe('Controllers', function () { }); it('should render edit/password', function (done) { - request(nconf.get('url') + '/api/user/foo/edit/password', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/edit/password`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); done(); @@ -1544,7 +1544,7 @@ describe('Controllers', function () { }); it('should render edit/email', function (done) { - request(nconf.get('url') + '/api/user/foo/edit/email', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/edit/email`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); done(); @@ -1552,7 +1552,7 @@ describe('Controllers', function () { }); it('should render edit/username', function (done) { - request(nconf.get('url') + '/api/user/foo/edit/username', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/edit/username`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); done(); @@ -1579,7 +1579,7 @@ describe('Controllers', function () { }); it('should get followers page', function (done) { - request(nconf.get('url') + '/api/user/foo/followers', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/followers`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.users[0].username, 'follower'); @@ -1588,7 +1588,7 @@ describe('Controllers', function () { }); it('should get following page', function (done) { - request(nconf.get('url') + '/api/user/follower/following', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/follower/following`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.users[0].username, 'foo'); @@ -1599,7 +1599,7 @@ describe('Controllers', function () { it('should return empty after unfollow', function (done) { socketUser.unfollow({ uid: uid }, { uid: fooUid }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/user/foo/followers', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/foo/followers`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.users.length, 0); @@ -1620,7 +1620,7 @@ describe('Controllers', function () { }); it('should 404 for invalid pid', function (done) { - request(nconf.get('url') + '/api/post/fail', function (err, res) { + request(`${nconf.get('url')}/api/post/fail`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1630,7 +1630,7 @@ describe('Controllers', function () { it('should 403 if user does not have read privilege', function (done) { privileges.categories.rescind(['groups:topics:read'], category.cid, 'registered-users', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/post/' + pid, { jar: jar }, function (err, res) { + request(`${nconf.get('url')}/api/post/${pid}`, { jar: jar }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 403); privileges.categories.give(['groups:topics:read'], category.cid, 'registered-users', done); @@ -1639,7 +1639,7 @@ describe('Controllers', function () { }); it('should return correct post path', function (done) { - request(nconf.get('url') + '/api/post/' + pid, { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post/${pid}`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/topic/1/test-topic-title/1'); @@ -1651,7 +1651,7 @@ describe('Controllers', function () { describe('cookie consent', function () { it('should return relevant data in configs API route', function (done) { - request(nconf.get('url') + '/api/config', function (err, res, body) { + request(`${nconf.get('url')}/api/config`, function (err, res, body) { var parsed; assert.ifError(err); assert.equal(res.statusCode, 200); @@ -1675,7 +1675,7 @@ describe('Controllers', function () { meta.configs.set('cookieConsentMessage', 'Julian\'s Message', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/config', function (err, res, body) { + request(`${nconf.get('url')}/api/config`, function (err, res, body) { var parsed; assert.ifError(err); assert.equal(res.statusCode, 200); @@ -1694,7 +1694,7 @@ describe('Controllers', function () { }); it('should return osd data', function (done) { - request(nconf.get('url') + '/osd.xml', function (err, res, body) { + request(`${nconf.get('url')}/osd.xml`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1710,7 +1710,7 @@ describe('Controllers', function () { }); it('should handle topic malformed uri', function (done) { - request(nconf.get('url') + '/topic/1/a%AFc', function (err, res, body) { + request(`${nconf.get('url')}/topic/1/a%AFc`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1719,7 +1719,7 @@ describe('Controllers', function () { }); it('should handle category malformed uri', function (done) { - request(nconf.get('url') + '/category/1/a%AFc', function (err, res, body) { + request(`${nconf.get('url')}/category/1/a%AFc`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1728,7 +1728,7 @@ describe('Controllers', function () { }); it('should handle malformed uri ', function (done) { - request(nconf.get('url') + '/user/a%AFc', function (err, res, body) { + request(`${nconf.get('url')}/user/a%AFc`, function (err, res, body) { assert.ifError(err); assert(body); assert.equal(res.statusCode, 400); @@ -1737,7 +1737,7 @@ describe('Controllers', function () { }); it('should handle malformed uri in api', function (done) { - request(nconf.get('url') + '/api/user/a%AFc', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/a%AFc`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 400); assert.equal(body.error, '[[global:400.title]]'); @@ -1755,7 +1755,7 @@ describe('Controllers', function () { }, }); - request(nconf.get('url') + '/users', {}, function (err, res) { + request(`${nconf.get('url')}/users`, {}, function (err, res) { plugins.loadedHooks['filter:router.page'] = []; assert.ifError(err); assert.equal(res.statusCode, 403); @@ -1773,7 +1773,7 @@ describe('Controllers', function () { }, }); - request(nconf.get('url') + '/users', {}, function (err, res, body) { + request(`${nconf.get('url')}/users`, {}, function (err, res, body) { plugins.loadedHooks['filter:router.page'] = []; assert.ifError(err); assert.equal(res.statusCode, 403); @@ -1794,7 +1794,7 @@ describe('Controllers', function () { }, }); - request(nconf.get('url') + '/users', {}, function (err, res, body) { + request(`${nconf.get('url')}/users`, {}, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1814,7 +1814,7 @@ describe('Controllers', function () { }, }); - request(nconf.get('url') + '/api/users', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/users`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/api/popular'); @@ -1832,7 +1832,7 @@ describe('Controllers', function () { }, }); - request(nconf.get('url') + '/users', function (err, res, body) { + request(`${nconf.get('url')}/users`, function (err, res, body) { plugins.loadedHooks['filter:router.page'] = []; assert.ifError(err); assert.equal(res.statusCode, 500); @@ -1844,7 +1844,7 @@ describe('Controllers', function () { describe('timeago locales', function () { it('should load timeago locale', function (done) { - request(nconf.get('url') + '/assets/src/modules/timeago/locales/jquery.timeago.af.js', function (err, res, body) { + request(`${nconf.get('url')}/assets/src/modules/timeago/locales/jquery.timeago.af.js`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.includes('"gelede"')); @@ -1853,7 +1853,7 @@ describe('Controllers', function () { }); it('should return not found if NodeBB language exists but timeago locale does not exist', function (done) { - request(nconf.get('url') + '/assets/src/modules/timeago/locales/jquery.timeago.ms.js', function (err, res, body) { + request(`${nconf.get('url')}/assets/src/modules/timeago/locales/jquery.timeago.ms.js`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1861,7 +1861,7 @@ describe('Controllers', function () { }); it('should return not found if NodeBB language does not exist', function (done) { - request(nconf.get('url') + '/assets/src/modules/timeago/locales/jquery.timeago.muggle.js', function (err, res, body) { + request(`${nconf.get('url')}/assets/src/modules/timeago/locales/jquery.timeago.muggle.js`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1880,7 +1880,7 @@ describe('Controllers', function () { }); it('should return 404 if cid is not a number', function (done) { - request(nconf.get('url') + '/api/category/fail', function (err, res) { + request(`${nconf.get('url')}/api/category/fail`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1888,7 +1888,7 @@ describe('Controllers', function () { }); it('should return 404 if topic index is not a number', function (done) { - request(nconf.get('url') + '/api/category/' + category.slug + '/invalidtopicindex', function (err, res) { + request(`${nconf.get('url')}/api/category/${category.slug}/invalidtopicindex`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1896,7 +1896,7 @@ describe('Controllers', function () { }); it('should 404 if category does not exist', function (done) { - request(nconf.get('url') + '/api/category/123123', function (err, res) { + request(`${nconf.get('url')}/api/category/123123`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1908,7 +1908,7 @@ describe('Controllers', function () { assert.ifError(err); categories.setCategoryField(category.cid, 'disabled', 1, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/category/' + category.slug, function (err, res) { + request(`${nconf.get('url')}/api/category/${category.slug}`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1922,7 +1922,7 @@ describe('Controllers', function () { assert.ifError(err); privileges.categories.rescind(['groups:read'], category.cid, 'guests', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/category/' + category.slug, function (err, res) { + request(`${nconf.get('url')}/api/category/${category.slug}`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 401); done(); @@ -1932,7 +1932,7 @@ describe('Controllers', function () { }); it('should redirect if topic index is negative', function (done) { - request(nconf.get('url') + '/api/category/' + category.slug + '/-10', function (err, res) { + request(`${nconf.get('url')}/api/category/${category.slug}/-10`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.ok(res.headers['x-redirect']); @@ -1943,7 +1943,7 @@ describe('Controllers', function () { it('should 404 if page is not found', function (done) { user.setSetting(fooUid, 'usePagination', 1, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/category/' + category.slug + '?page=100', { jar: jar, json: true }, function (err, res) { + request(`${nconf.get('url')}/api/category/${category.slug}?page=100`, { jar: jar, json: true }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -1952,7 +1952,7 @@ describe('Controllers', function () { }); it('should load page 1 if req.query.page is not sent', function (done) { - request(nconf.get('url') + '/api/category/' + category.slug, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.pagination.currentPage, 1); @@ -1977,7 +1977,7 @@ describe('Controllers', function () { topics.reply({ uid: fooUid, content: 'topic 2 reply', tid: data.topicData.tid }, next); }, function (postData, next) { - request(nconf.get('url') + '/api/category/' + category.slug + '?sort=most_posts', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}?sort=most_posts`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.topics[0].title, 'topic 2'); @@ -2010,7 +2010,7 @@ describe('Controllers', function () { topics.post({ uid: fooUid, cid: category.cid, title: 'topic 3', content: 'topic 3 OP', tags: ['java', 'cpp', 'best'] }, next); }, function (data, next) { - request(nconf.get('url') + '/api/category/' + category.slug + '?tag=node&author=foo', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}?tag=node&author=foo`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.topics[0].title, 'topic 2'); @@ -2018,7 +2018,7 @@ describe('Controllers', function () { }); }, function (next) { - request(nconf.get('url') + '/api/category/' + category.slug + '?tag[]=java&tag[]=cpp', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}?tag[]=java&tag[]=cpp`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.topics[0].title, 'topic 3'); @@ -2043,7 +2043,7 @@ describe('Controllers', function () { function (_category, next) { category = _category; cid = category.cid; - request(nconf.get('url') + '/api/category/' + category.slug, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], 'https://nodebb.org'); @@ -2055,7 +2055,7 @@ describe('Controllers', function () { categories.setCategoryField(cid, 'link', '/recent', next); }, function (next) { - request(nconf.get('url') + '/api/category/' + category.slug, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/recent'); @@ -2090,7 +2090,7 @@ describe('Controllers', function () { topics.post({ uid: fooUid, cid: childCategory2.cid, title: 'topic 1', content: 'topic 1 OP' }, next); }, function (data, next) { - request(nconf.get('url') + '/api/category/' + parentCategory.slug, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${parentCategory.slug}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.children[1].posts[0].content, 'topic 1 OP'); @@ -2112,7 +2112,7 @@ describe('Controllers', function () { function (category, next) { var titles = []; for (var i = 0; i < 30; i++) { - titles.push('topic title ' + i); + titles.push(`topic title ${i}`); } async.waterfall([ @@ -2125,7 +2125,7 @@ describe('Controllers', function () { user.getSettings(fooUid, next); }, function (settings, next) { - request(nconf.get('url') + '/api/category/' + category.slug, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${category.slug}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body.topics.length, settings.topicsPerPage); @@ -2152,7 +2152,7 @@ describe('Controllers', function () { }); it('should load unread page', function (done) { - request(nconf.get('url') + '/api/unread', { jar: jar }, function (err, res) { + request(`${nconf.get('url')}/api/unread`, { jar: jar }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 200); done(); @@ -2160,7 +2160,7 @@ describe('Controllers', function () { }); it('should 404 if filter is invalid', function (done) { - request(nconf.get('url') + '/api/unread/doesnotexist', { jar: jar }, function (err, res) { + request(`${nconf.get('url')}/api/unread/doesnotexist`, { jar: jar }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -2168,7 +2168,7 @@ describe('Controllers', function () { }); it('should return total unread count', function (done) { - request(nconf.get('url') + '/api/unread/total?filter=new', { jar: jar }, function (err, res, body) { + request(`${nconf.get('url')}/api/unread/total?filter=new`, { jar: jar }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(body, 0); @@ -2177,7 +2177,7 @@ describe('Controllers', function () { }); it('should redirect if page is out of bounds', function (done) { - request(nconf.get('url') + '/api/unread?page=-1', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/unread?page=-1`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/unread?page=1'); @@ -2189,7 +2189,7 @@ describe('Controllers', function () { describe('admin middlewares', function () { it('should redirect to login', function (done) { - request(nconf.get('url') + '//api/admin/advanced/database', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}//api/admin/advanced/database`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 401); done(); @@ -2197,7 +2197,7 @@ describe('Controllers', function () { }); it('should redirect to login', function (done) { - request(nconf.get('url') + '//admin/advanced/database', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}//admin/advanced/database`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.includes('Login to your account')); @@ -2216,7 +2216,7 @@ describe('Controllers', function () { jar = _jar; request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -2228,12 +2228,12 @@ describe('Controllers', function () { }); it('should load the composer route', function (done) { - request(nconf.get('url') + '/api/compose', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/compose`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.title); assert(body.template); - assert.equal(body.url, nconf.get('relative_path') + '/compose'); + assert.equal(body.url, `${nconf.get('relative_path')}/compose`); done(); }); }); @@ -2249,12 +2249,12 @@ describe('Controllers', function () { method: hookMethod, }); - request(nconf.get('url') + '/api/compose', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/compose`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.title); assert.strictEqual(body.template.name, ''); - assert.strictEqual(body.url, nconf.get('relative_path') + '/compose'); + assert.strictEqual(body.url, `${nconf.get('relative_path')}/compose`); plugins.hooks.unregister('myTestPlugin', 'filter:composer.build', hookMethod); done(); @@ -2271,7 +2271,7 @@ describe('Controllers', function () { method: hookMethod, }); - request(nconf.get('url') + '/api/compose', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/compose`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); @@ -2282,7 +2282,7 @@ describe('Controllers', function () { it('should error with invalid data', function (done) { - request.post(nconf.get('url') + '/compose', { + request.post(`${nconf.get('url')}/compose`, { form: { content: 'a new reply', }, @@ -2293,7 +2293,7 @@ describe('Controllers', function () { }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 400); - request.post(nconf.get('url') + '/compose', { + request.post(`${nconf.get('url')}/compose`, { form: { tid: tid, }, @@ -2315,7 +2315,7 @@ describe('Controllers', function () { title: 'no js is good', content: 'a topic with noscript', }; - request.post(nconf.get('url') + '/compose', { + request.post(`${nconf.get('url')}/compose`, { form: data, jar: jar, headers: { @@ -2324,7 +2324,7 @@ describe('Controllers', function () { }, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 302); - request.post(nconf.get('url') + '/compose', { + request.post(`${nconf.get('url')}/compose`, { form: { tid: tid, content: 'a new reply', diff --git a/test/coverPhoto.js b/test/coverPhoto.js index 1f3cfc27e9..d70690076f 100644 --- a/test/coverPhoto.js +++ b/test/coverPhoto.js @@ -11,14 +11,14 @@ describe('coverPhoto', function () { it('should get default group cover', function (done) { meta.config['groups:defaultCovers'] = '/assets/image1.png, /assets/image2.png'; var result = coverPhoto.getDefaultGroupCover('registered-users'); - assert.equal(result, nconf.get('relative_path') + '/assets/image2.png'); + assert.equal(result, `${nconf.get('relative_path')}/assets/image2.png`); done(); }); it('should get default default profile cover', function (done) { meta.config['profile:defaultCovers'] = ' /assets/image1.png, /assets/image2.png '; var result = coverPhoto.getDefaultProfileCover(1); - assert.equal(result, nconf.get('relative_path') + '/assets/image2.png'); + assert.equal(result, `${nconf.get('relative_path')}/assets/image2.png`); done(); }); }); diff --git a/test/database/sorted.js b/test/database/sorted.js index 2670e7e791..71bc9cd8bd 100644 --- a/test/database/sorted.js +++ b/test/database/sorted.js @@ -339,9 +339,9 @@ describe('Sorted Set methods', function () { for (let i = 0; i < 400; i++) { /* eslint-disable no-await-in-loop */ const bulkAdd = []; - keys.push('testzset' + i); + keys.push(`testzset${i}`); for (let k = 0; k < 100; k++) { - bulkAdd.push(['testzset' + i, 1000000 + k + (i * 100), k + (i * 100)]); + bulkAdd.push([`testzset${i}`, 1000000 + k + (i * 100), k + (i * 100)]); } await db.sortedSetAddBulk(bulkAdd); } diff --git a/test/defer-logger.js b/test/defer-logger.js index a3e5c91716..e6cdf1b721 100644 --- a/test/defer-logger.js +++ b/test/defer-logger.js @@ -32,6 +32,6 @@ after(function () { console.log('\n\n'); winstonLogged.forEach(function (args) { - console.log(args[0] + ' ' + args[1]); + console.log(`${args[0]} ${args[1]}`); }); }); diff --git a/test/emailer.js b/test/emailer.js index ed446a1029..689156102a 100644 --- a/test/emailer.js +++ b/test/emailer.js @@ -53,7 +53,7 @@ describe('emailer', function () { method: function (data, next) { assert(data); assert.equal(data.to, email); - assert.equal(data.subject, '[NodeBB] ' + params.subject); + assert.equal(data.subject, `[NodeBB] ${params.subject}`); next(error); }, diff --git a/test/feeds.js b/test/feeds.js index 6f540c1c71..bbfdc6da79 100644 --- a/test/feeds.js +++ b/test/feeds.js @@ -49,17 +49,17 @@ describe('feeds', function () { it('should 404', function (done) { var feedUrls = [ - nconf.get('url') + '/topic/' + tid + '.rss', - nconf.get('url') + '/category/' + cid + '.rss', - nconf.get('url') + '/topics.rss', - nconf.get('url') + '/recent.rss', - nconf.get('url') + '/top.rss', - nconf.get('url') + '/popular.rss', - nconf.get('url') + '/popular/day.rss', - nconf.get('url') + '/recentposts.rss', - nconf.get('url') + '/category/' + cid + '/recentposts.rss', - nconf.get('url') + '/user/foo/topics.rss', - nconf.get('url') + '/tags/nodebb.rss', + `${nconf.get('url')}/topic/${tid}.rss`, + `${nconf.get('url')}/category/${cid}.rss`, + `${nconf.get('url')}/topics.rss`, + `${nconf.get('url')}/recent.rss`, + `${nconf.get('url')}/top.rss`, + `${nconf.get('url')}/popular.rss`, + `${nconf.get('url')}/popular/day.rss`, + `${nconf.get('url')}/recentposts.rss`, + `${nconf.get('url')}/category/${cid}/recentposts.rss`, + `${nconf.get('url')}/user/foo/topics.rss`, + `${nconf.get('url')}/tags/nodebb.rss`, ]; async.eachSeries(feedUrls, function (url, next) { request(url, function (err, res) { @@ -75,7 +75,7 @@ describe('feeds', function () { }); it('should 404 if topic does not exist', function (done) { - request(nconf.get('url') + '/topic/' + 1000 + '.rss', function (err, res) { + request(`${nconf.get('url')}/topic/${1000}.rss`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -83,7 +83,7 @@ describe('feeds', function () { }); it('should 404 if category id is not a number', function (done) { - request(nconf.get('url') + '/category/invalid.rss', function (err, res) { + request(`${nconf.get('url')}/category/invalid.rss`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -93,7 +93,7 @@ describe('feeds', function () { it('should redirect if we do not have read privilege', function (done) { privileges.categories.rescind(['groups:topics:read'], cid, 'guests', function (err) { assert.ifError(err); - request(nconf.get('url') + '/topic/' + tid + '.rss', function (err, res, body) { + request(`${nconf.get('url')}/topic/${tid}.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -104,7 +104,7 @@ describe('feeds', function () { }); it('should 404 if user is not found', function (done) { - request(nconf.get('url') + '/user/doesnotexist/topics.rss', function (err, res) { + request(`${nconf.get('url')}/user/doesnotexist/topics.rss`, function (err, res) { assert.ifError(err); assert.equal(res.statusCode, 404); done(); @@ -114,7 +114,7 @@ describe('feeds', function () { it('should redirect if we do not have read privilege', function (done) { privileges.categories.rescind(['groups:read'], cid, 'guests', function (err) { assert.ifError(err); - request(nconf.get('url') + '/category/' + cid + '.rss', function (err, res, body) { + request(`${nconf.get('url')}/category/${cid}.rss`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -136,7 +136,7 @@ describe('feeds', function () { }); it('should load feed if its not private', function (done) { - request(nconf.get('url') + '/category/' + cid + '.rss', { }, function (err, res, body) { + request(`${nconf.get('url')}/category/${cid}.rss`, { }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -150,10 +150,10 @@ describe('feeds', function () { assert.ifError(err); async.parallel({ test1: function (next) { - request(nconf.get('url') + '/category/' + cid + '.rss?uid=' + fooUid, { }, next); + request(`${nconf.get('url')}/category/${cid}.rss?uid=${fooUid}`, { }, next); }, test2: function (next) { - request(nconf.get('url') + '/category/' + cid + '.rss?token=sometoken', { }, next); + request(`${nconf.get('url')}/category/${cid}.rss?token=sometoken`, { }, next); }, }, function (err, results) { assert.ifError(err); @@ -167,7 +167,7 @@ describe('feeds', function () { }); it('should not allow access if token is wrong', function (done) { - request(nconf.get('url') + '/category/' + cid + '.rss?uid=' + fooUid + '&token=sometoken', { }, function (err, res, body) { + request(`${nconf.get('url')}/category/${cid}.rss?uid=${fooUid}&token=sometoken`, { }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.includes('Login to your account')); @@ -176,10 +176,10 @@ describe('feeds', function () { }); it('should allow access if token is correct', function (done) { - request(nconf.get('url') + '/api/category/' + cid, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/category/${cid}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); rssToken = body.rssFeedUrl.split('token')[1].slice(1); - request(nconf.get('url') + '/category/' + cid + '.rss?uid=' + fooUid + '&token=' + rssToken, { }, function (err, res, body) { + request(`${nconf.get('url')}/category/${cid}.rss?uid=${fooUid}&token=${rssToken}`, { }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.startsWith(' { - await Groups.join('cid:' + category.cid + ':privileges:moderate', uid3); + await Groups.join(`cid:${category.cid}:privileges:moderate`, uid3); await Flags.update(1, uid3, { assignee: uid3, @@ -438,7 +438,7 @@ describe('Flags', function () { assignee = await db.getObjectField('flag:1', 'assignee'); assert.strictEqual(uid3, parseInt(assignee, 10)); - await Groups.leave('cid:' + category.cid + ':privileges:moderate', uid3); + await Groups.leave(`cid:${category.cid}:privileges:moderate`, uid3); }); it('should do nothing when you attempt to set a bogus state', async () => { @@ -462,14 +462,14 @@ describe('Flags', function () { await sleep(2000); let userNotifs = await User.notifications.getAll(adminUid); - assert(userNotifs.includes('flag:post:' + result.postData.pid)); + assert(userNotifs.includes(`flag:post:${result.postData.pid}`)); await Flags.update(flagId, adminUid, { state: 'resolved', }); userNotifs = await User.notifications.getAll(adminUid); - assert(!userNotifs.includes('flag:post:' + result.postData.pid)); + assert(!userNotifs.includes(`flag:post:${result.postData.pid}`)); }); }); @@ -658,7 +658,7 @@ describe('Flags', function () { it('should retrieve a list of notes, from newest to oldest', function (done) { Flags.getNotes(1, function (err, notes) { assert.ifError(err); - assert(notes[0].datetime > notes[1].datetime, notes[0].datetime + '-' + notes[1].datetime); + assert(notes[0].datetime > notes[1].datetime, `${notes[0].datetime}-${notes[1].datetime}`); assert.strictEqual('this is the second note', notes[0].content); done(); }); diff --git a/test/groups.js b/test/groups.js index 3543499b97..b24521c34f 100644 --- a/test/groups.js +++ b/test/groups.js @@ -692,7 +692,7 @@ describe('Groups', function () { assert.ifError(err); User.getUserData(uid, function (err, data) { assert.ifError(err); - assert.equal(data.groupTitle, '["' + groupName + '"]'); + assert.equal(data.groupTitle, `["${groupName}"]`); assert.deepEqual(data.groupTitleArray, [groupName]); done(); }); diff --git a/test/helpers/index.js b/test/helpers/index.js index 38239aaee0..a85d2e9992 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -14,7 +14,7 @@ helpers.loginUser = function (username, password, callback) { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, res, body) { @@ -22,7 +22,7 @@ helpers.loginUser = function (username, password, callback) { return callback(err || new Error('[[error:invalid-response]]')); } - request.post(nconf.get('url') + '/login', { + request.post(`${nconf.get('url')}/login`, { form: { username: username, password: password, @@ -44,7 +44,7 @@ helpers.loginUser = function (username, password, callback) { helpers.logoutUser = function (jar, callback) { request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -52,7 +52,7 @@ helpers.logoutUser = function (jar, callback) { return callback(err, response, body); } - request.post(nconf.get('url') + '/logout', { + request.post(`${nconf.get('url')}/logout`, { form: {}, json: true, jar: jar, @@ -71,7 +71,7 @@ helpers.connectSocketIO = function (res, callback) { cookies = cookies.filter(c => /express.sid=[^;]+;/.test(c)); const cookie = cookies[0]; var socket = io(nconf.get('base_url'), { - path: nconf.get('relative_path') + '/socket.io', + path: `${nconf.get('relative_path')}/socket.io`, extraHeaders: { Origin: nconf.get('url'), Cookie: cookie, @@ -117,7 +117,7 @@ helpers.uploadFile = function (uploadEndPoint, filePath, body, jar, csrf_token, helpers.registerUser = function (data, callback) { var jar = request.jar(); request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -125,7 +125,7 @@ helpers.registerUser = function (data, callback) { return callback(err); } - request.post(nconf.get('url') + '/register', { + request.post(`${nconf.get('url')}/register`, { form: data, json: true, jar: jar, diff --git a/test/locale-detect.js b/test/locale-detect.js index 5f865bbd7d..29b55ca1f5 100644 --- a/test/locale-detect.js +++ b/test/locale-detect.js @@ -11,7 +11,7 @@ describe('Language detection', function () { it('should detect the language for a guest', function (done) { meta.configs.set('autoDetectLang', 1, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/config', { + request(`${nconf.get('url')}/api/config`, { headers: { 'Accept-Language': 'de-DE,de;q=0.5', }, @@ -29,7 +29,7 @@ describe('Language detection', function () { it('should do nothing when disabled', function (done) { meta.configs.set('autoDetectLang', 0, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/config', { + request(`${nconf.get('url')}/api/config`, { headers: { 'Accept-Language': 'de-DE,de;q=0.5', }, diff --git a/test/messaging.js b/test/messaging.js index 3ebe798a98..78b85e0598 100644 --- a/test/messaging.js +++ b/test/messaging.js @@ -406,8 +406,8 @@ describe('Messaging Library', function () { assert(data.unread[0]); var notification = data.unread[0]; assert.equal(notification.bodyShort, '[[notifications:new_message_from, foo]]'); - assert.equal(notification.nid, 'chat_' + fooUid + '_' + roomId); - assert.equal(notification.path, nconf.get('relative_path') + '/chats/' + roomId); + assert.equal(notification.nid, `chat_${fooUid}_${roomId}`); + assert.equal(notification.path, `${nconf.get('relative_path')}/chats/${roomId}`); done(); }); }, 1500); @@ -533,7 +533,7 @@ describe('Messaging Library', function () { }); it('should return true if user is dnd', function (done) { - db.setObjectField('user:' + herpUid, 'status', 'dnd', function (err) { + db.setObjectField(`user:${herpUid}`, 'status', 'dnd', function (err) { assert.ifError(err); socketModules.chats.isDnD({ uid: fooUid }, herpUid, function (err, isDnD) { assert.ifError(err); @@ -669,7 +669,7 @@ describe('Messaging Library', function () { it('should mark the message as deleted', function (done) { socketModules.chats.delete({ uid: fooUid }, { messageId: mid, roomId: roomId }, function (err) { assert.ifError(err); - db.getObjectField('message:' + mid, 'deleted', function (err, value) { + db.getObjectField(`message:${mid}`, 'deleted', function (err, value) { assert.ifError(err); assert.strictEqual(1, parseInt(value, 10)); done(); @@ -712,7 +712,7 @@ describe('Messaging Library', function () { it('should restore the message', function (done) { socketModules.chats.restore({ uid: fooUid }, { messageId: mid, roomId: roomId }, function (err) { assert.ifError(err); - db.getObjectField('message:' + mid, 'deleted', function (err, value) { + db.getObjectField(`message:${mid}`, 'deleted', function (err, value) { assert.ifError(err); assert.strictEqual(0, parseInt(value, 10)); done(); @@ -763,7 +763,7 @@ describe('Messaging Library', function () { describe('controller', function () { it('should 404 if chat is disabled', function (done) { meta.config.disableChat = 1; - request(nconf.get('url') + '/user/baz/chats', function (err, response) { + request(`${nconf.get('url')}/user/baz/chats`, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -772,7 +772,7 @@ describe('Messaging Library', function () { it('should 500 for guest with no privilege error', function (done) { meta.config.disableChat = 0; - request(nconf.get('url') + '/api/user/baz/chats', { json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/user/baz/chats`, { json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 500); assert.equal(body.error, '[[error:no-privileges]]'); @@ -781,7 +781,7 @@ describe('Messaging Library', function () { }); it('should 404 for non-existent user', function (done) { - request(nconf.get('url') + '/user/doesntexist/chats', function (err, response) { + request(`${nconf.get('url')}/user/doesntexist/chats`, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -800,7 +800,7 @@ describe('Messaging Library', function () { }); it('should return chats page data', function (done) { - request(nconf.get('url') + '/api/user/herp/chats', { json: true, jar: jar }, function (err, response, body) { + request(`${nconf.get('url')}/api/user/herp/chats`, { json: true, jar: jar }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert(Array.isArray(body.rooms)); @@ -811,7 +811,7 @@ describe('Messaging Library', function () { }); it('should return room data', function (done) { - request(nconf.get('url') + '/api/user/herp/chats/' + roomId, { json: true, jar: jar }, function (err, response, body) { + request(`${nconf.get('url')}/api/user/herp/chats/${roomId}`, { json: true, jar: jar }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert.equal(body.roomId, roomId); @@ -821,7 +821,7 @@ describe('Messaging Library', function () { }); it('should redirect to chats page', function (done) { - request(nconf.get('url') + '/api/chats', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/chats`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert.equal(res.headers['x-redirect'], '/user/herp/chats'); @@ -833,7 +833,7 @@ describe('Messaging Library', function () { it('should return 404 if user is not in room', function (done) { helpers.loginUser('baz', 'quuxquux', function (err, jar) { assert.ifError(err); - request(nconf.get('url') + '/api/user/baz/chats/' + roomId, { json: true, jar: jar }, function (err, response) { + request(`${nconf.get('url')}/api/user/baz/chats/${roomId}`, { json: true, jar: jar }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); diff --git a/test/meta.js b/test/meta.js index 1946a94f16..1818f866da 100644 --- a/test/meta.js +++ b/test/meta.js @@ -491,7 +491,7 @@ describe('meta', function () { describe('Access-Control-Allow-Origin', function () { it('Access-Control-Allow-Origin header should be empty', function (done) { var jar = request.jar(); - request.get(nconf.get('url') + '/api/search?term=bug', { + request.get(`${nconf.get('url')}/api/search?term=bug`, { form: {}, json: true, jar: jar, @@ -506,7 +506,7 @@ describe('meta', function () { var jar = request.jar(); var oldValue = meta.config['access-control-allow-origin']; meta.config['access-control-allow-origin'] = 'test.com, mydomain.com'; - request.get(nconf.get('url') + '/api/search?term=bug', { + request.get(`${nconf.get('url')}/api/search?term=bug`, { form: { }, json: true, @@ -526,7 +526,7 @@ describe('meta', function () { var jar = request.jar(); var oldValue = meta.config['access-control-allow-origin']; meta.config['access-control-allow-origin'] = 'test.com, mydomain.com'; - request.get(nconf.get('url') + '/api/search?term=bug', { + request.get(`${nconf.get('url')}/api/search?term=bug`, { form: { }, json: true, @@ -546,7 +546,7 @@ describe('meta', function () { var jar = request.jar(); var oldValue = meta.config['access-control-allow-origin-regex']; meta.config['access-control-allow-origin-regex'] = 'match\\.this\\..+\\.domain.com, mydomain\\.com'; - request.get(nconf.get('url') + '/api/search?term=bug', { + request.get(`${nconf.get('url')}/api/search?term=bug`, { form: { }, json: true, @@ -566,7 +566,7 @@ describe('meta', function () { var jar = request.jar(); var oldValue = meta.config['access-control-allow-origin-regex']; meta.config['access-control-allow-origin-regex'] = 'match\\.this\\..+\\.domain.com, mydomain\\.com'; - request.get(nconf.get('url') + '/api/search?term=bug', { + request.get(`${nconf.get('url')}/api/search?term=bug`, { form: { }, json: true, @@ -586,7 +586,7 @@ describe('meta', function () { var jar = request.jar(); var oldValue = meta.config['access-control-allow-origin-regex']; meta.config['access-control-allow-origin-regex'] = '[match\\.this\\..+\\.domain.com, mydomain\\.com'; - request.get(nconf.get('url') + '/api/search?term=bug', { + request.get(`${nconf.get('url')}/api/search?term=bug`, { form: { }, json: true, diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index c5a9a5545b..841cd75000 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -41,7 +41,7 @@ nconf.set('relative_path', relativePath); nconf.set('upload_path', path.join(nconf.get('base_dir'), nconf.get('upload_path'))); nconf.set('upload_url', '/assets/uploads'); nconf.set('url_parsed', urlObject); -nconf.set('base_url', urlObject.protocol + '//' + urlObject.host); +nconf.set('base_url', `${urlObject.protocol}//${urlObject.host}`); nconf.set('secure', urlObject.protocol === 'https:'); nconf.set('use_port', !!urlObject.port); nconf.set('port', urlObject.port || nconf.get('port') || (nconf.get('PORT_ENV_VAR') ? nconf.get(nconf.get('PORT_ENV_VAR')) : false) || 4567); @@ -113,7 +113,7 @@ if (testDbConfig.database === productionDbConfig.database && nconf.set(dbType, testDbConfig); winston.info('database config %s', dbType, testDbConfig); -winston.info('environment ' + global.env); +winston.info(`environment ${global.env}`); const db = require('../../src/database'); @@ -125,7 +125,6 @@ before(async function () { // Parse out the relative_url and other goodies from the configured URL const urlObject = url.parse(nconf.get('url')); - nconf.set('core_templates_path', path.join(__dirname, '../../src/views')); nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates')); nconf.set('theme_config', path.join(nconf.get('themes_path'), 'nodebb-theme-persona', 'theme.json')); diff --git a/test/notifications.js b/test/notifications.js index 2b147394de..292db1ee01 100644 --- a/test/notifications.js +++ b/test/notifications.js @@ -46,7 +46,7 @@ describe('Notifications', function () { notification = _notification; assert.ifError(err); assert(notification); - db.exists('notifications:' + notification.nid, function (err, exists) { + db.exists(`notifications:${notification.nid}`, function (err, exists) { assert.ifError(err); assert(exists); db.isSortedSetMember('notifications', notification.nid, function (err, isMember) { @@ -108,7 +108,7 @@ describe('Notifications', function () { notifications.push(notification, [uid], function (err) { assert.ifError(err); setTimeout(function () { - db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:unread`, notification.nid, function (err, isMember) { assert.ifError(err); assert(isMember); done(); @@ -121,7 +121,7 @@ describe('Notifications', function () { notifications.pushGroup(notification, 'registered-users', function (err) { assert.ifError(err); setTimeout(function () { - db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:unread`, notification.nid, function (err, isMember) { assert.ifError(err); assert(isMember); done(); @@ -134,7 +134,7 @@ describe('Notifications', function () { notifications.pushGroups(notification, ['registered-users', 'administrators'], function (err) { assert.ifError(err); setTimeout(function () { - db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:unread`, notification.nid, function (err, isMember) { assert.ifError(err); assert(isMember); done(); @@ -156,10 +156,10 @@ describe('Notifications', function () { it('should mark a notification read', function (done) { socketNotifications.markRead({ uid: uid }, notification.nid, function (err) { assert.ifError(err); - db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:unread`, notification.nid, function (err, isMember) { assert.ifError(err); assert.equal(isMember, false); - db.isSortedSetMember('uid:' + uid + ':notifications:read', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:read`, notification.nid, function (err, isMember) { assert.ifError(err); assert.equal(isMember, true); done(); @@ -188,10 +188,10 @@ describe('Notifications', function () { it('should mark a notification unread', function (done) { socketNotifications.markUnread({ uid: uid }, notification.nid, function (err) { assert.ifError(err); - db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:unread`, notification.nid, function (err, isMember) { assert.ifError(err); assert.equal(isMember, true); - db.isSortedSetMember('uid:' + uid + ':notifications:read', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:read`, notification.nid, function (err, isMember) { assert.ifError(err); assert.equal(isMember, false); socketNotifications.getCount({ uid: uid }, null, function (err, count) { @@ -207,10 +207,10 @@ describe('Notifications', function () { it('should mark all notifications read', function (done) { socketNotifications.markAllRead({ uid: uid }, null, function (err) { assert.ifError(err); - db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:unread`, notification.nid, function (err, isMember) { assert.ifError(err); assert.equal(isMember, false); - db.isSortedSetMember('uid:' + uid + ':notifications:read', notification.nid, function (err, isMember) { + db.isSortedSetMember(`uid:${uid}:notifications:read`, notification.nid, function (err, isMember) { assert.ifError(err); assert.equal(isMember, true); done(); @@ -286,7 +286,7 @@ describe('Notifications', function () { }, function (notifications, next) { assert.equal(notifications.unread.length, 1, 'there should be 1 unread notification'); - assert.equal(nconf.get('relative_path') + '/post/' + pid, notifications.unread[0].path, 'the notification should link to the first unread post'); + assert.equal(`${nconf.get('relative_path')}/post/${pid}`, notifications.unread[0].path, 'the notification should link to the first unread post'); next(); }, ], function (err) { @@ -300,7 +300,7 @@ describe('Notifications', function () { assert.ifError(err); assert.equal(data[0].bodyShort, 'bodyShort'); assert.equal(data[0].nid, 'notification_id'); - assert.equal(data[0].path, nconf.get('relative_path') + '/notification/path'); + assert.equal(data[0].path, `${nconf.get('relative_path')}/notification/path`); done(); }); }); @@ -450,7 +450,7 @@ describe('Notifications', function () { user.notifications.getAll(uid, '', function (err, data) { meta.config.welcomeNotification = ''; assert.ifError(err); - assert(data.includes('welcome_' + uid), data); + assert(data.includes(`welcome_${uid}`), data); done(); }); }, 2000); diff --git a/test/plugins.js b/test/plugins.js index 6af4dc774f..61e8c77652 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -13,7 +13,7 @@ var plugins = require('../src/plugins'); describe('Plugins', function () { it('should load plugin data', function (done) { var pluginId = 'nodebb-plugin-markdown'; - plugins.loadPlugin(path.join(nconf.get('base_dir'), 'node_modules/' + pluginId), function (err) { + plugins.loadPlugin(path.join(nconf.get('base_dir'), `node_modules/${pluginId}`), function (err) { assert.ifError(err); assert(plugins.libraries[pluginId]); assert(plugins.loadedHooks['static:app.load']); @@ -256,7 +256,7 @@ describe('Plugins', function () { describe('static assets', function () { it('should 404 if resource does not exist', function (done) { - request.get(nconf.get('url') + '/plugins/doesnotexist/should404.tpl', function (err, res, body) { + request.get(`${nconf.get('url')}/plugins/doesnotexist/should404.tpl`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -265,7 +265,7 @@ describe('Plugins', function () { }); it('should 404 if resource does not exist', function (done) { - request.get(nconf.get('url') + '/plugins/nodebb-plugin-dbsearch/dbsearch/templates/admin/plugins/should404.tpl', function (err, res, body) { + request.get(`${nconf.get('url')}/plugins/nodebb-plugin-dbsearch/dbsearch/templates/admin/plugins/should404.tpl`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 404); assert(body); @@ -274,7 +274,7 @@ describe('Plugins', function () { }); it('should get resource', function (done) { - request.get(nconf.get('url') + '/plugins/nodebb-plugin-dbsearch/dbsearch/templates/admin/plugins/dbsearch.tpl', function (err, res, body) { + request.get(`${nconf.get('url')}/plugins/nodebb-plugin-dbsearch/dbsearch/templates/admin/plugins/dbsearch.tpl`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); diff --git a/test/posts.js b/test/posts.js index 9c32d90c89..2cd1f6ffaf 100644 --- a/test/posts.js +++ b/test/posts.js @@ -76,7 +76,7 @@ describe('Post\'s', function () { it('should update category teaser properly', async function () { const util = require('util'); const getCategoriesAsync = util.promisify(async function getCategories(callback) { - request(nconf.get('url') + '/api/categories', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/categories`, { json: true }, function (err, res, body) { callback(err, body); }); }); @@ -112,11 +112,11 @@ describe('Post\'s', function () { const pid1 = postResult.postData.pid; const pid2 = postData.pid; - assert.deepStrictEqual(await db.sortedSetScores('tid:' + postResult.topicData.tid + ':posters', [oldUid, newUid]), [2, null]); + assert.deepStrictEqual(await db.sortedSetScores(`tid:${postResult.topicData.tid}:posters`, [oldUid, newUid]), [2, null]); await posts.changeOwner([pid1, pid2], newUid); - assert.deepStrictEqual(await db.sortedSetScores('tid:' + postResult.topicData.tid + ':posters', [oldUid, newUid]), [0, 2]); + assert.deepStrictEqual(await db.sortedSetScores(`tid:${postResult.topicData.tid}:posters`, [oldUid, newUid]), [0, 2]); assert.deepStrictEqual(await posts.isOwner([pid1, pid2], oldUid), [false, false]); assert.deepStrictEqual(await posts.isOwner([pid1, pid2], newUid), [true, true]); @@ -282,7 +282,7 @@ describe('Post\'s', function () { describe('bookmarking', function () { it('should bookmark a post', function (done) { - socketPosts.bookmark({ uid: voterUid }, { pid: postData.pid, room_id: 'topic_' + postData.tid }, function (err, data) { + socketPosts.bookmark({ uid: voterUid }, { pid: postData.pid, room_id: `topic_${postData.tid}` }, function (err, data) { assert.ifError(err); assert.equal(data.isBookmarked, true); posts.hasBookmarked(postData.pid, voterUid, function (err, hasBookmarked) { @@ -294,7 +294,7 @@ describe('Post\'s', function () { }); it('should unbookmark a post', function (done) { - socketPosts.unbookmark({ uid: voterUid }, { pid: postData.pid, room_id: 'topic_' + postData.tid }, function (err, data) { + socketPosts.unbookmark({ uid: voterUid }, { pid: postData.pid, room_id: `topic_${postData.tid}` }, function (err, data) { assert.ifError(err); assert.equal(data.isBookmarked, false); posts.hasBookmarked([postData.pid], voterUid, function (err, hasBookmarked) { @@ -394,7 +394,7 @@ describe('Post\'s', function () { assert.ifError(err); var jar = _jar; - request(nconf.get('url') + '/api/topic/' + tid, { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/topic/${tid}`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.posts[1].content, '[[topic:post_is_deleted]]'); privileges.categories.give(['groups:posts:view_deleted'], cid, 'Global Moderators', next); @@ -448,7 +448,7 @@ describe('Post\'s', function () { createTopicWithReply(function (topicPostData, replyData) { socketPosts.purgePosts({ uid: voterUid }, { pids: [replyData.pid, topicPostData.postData.pid], tid: topicPostData.topicData.tid }, function (err) { assert.ifError(err); - posts.exists('post:' + replyData.pid, function (err, exists) { + posts.exists(`post:${replyData.pid}`, function (err, exists) { assert.ifError(err); assert.equal(exists, false); topics.exists(topicPostData.topicData.tid, function (err, exists) { @@ -505,7 +505,7 @@ describe('Post\'s', function () { it('should error if title is too short', function (done) { socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', title: 'a' }, function (err) { - assert.equal(err.message, '[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]'); + assert.equal(err.message, `[[error:title-too-short, ${meta.config.minimumTitleLength}]]`); done(); }); }); @@ -513,7 +513,7 @@ describe('Post\'s', function () { it('should error if title is too long', function (done) { var longTitle = new Array(meta.config.maximumTitleLength + 2).join('a'); socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', title: longTitle }, function (err) { - assert.equal(err.message, '[[error:title-too-long, ' + meta.config.maximumTitleLength + ']]'); + assert.equal(err.message, `[[error:title-too-long, ${meta.config.maximumTitleLength}]]`); done(); }); }); @@ -522,7 +522,7 @@ describe('Post\'s', function () { var oldValue = meta.config.minimumTagsPerTopic; meta.config.minimumTagsPerTopic = 1; socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', tags: [] }, function (err) { - assert.equal(err.message, '[[error:not-enough-tags, ' + meta.config.minimumTagsPerTopic + ']]'); + assert.equal(err.message, `[[error:not-enough-tags, ${meta.config.minimumTagsPerTopic}]]`); meta.config.minimumTagsPerTopic = oldValue; done(); }); @@ -531,17 +531,17 @@ describe('Post\'s', function () { it('should error with too many tags', function (done) { var tags = []; for (var i = 0; i < meta.config.maximumTagsPerTopic + 1; i += 1) { - tags.push('tag' + i); + tags.push(`tag${i}`); } socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', tags: tags }, function (err) { - assert.equal(err.message, '[[error:too-many-tags, ' + meta.config.maximumTagsPerTopic + ']]'); + assert.equal(err.message, `[[error:too-many-tags, ${meta.config.maximumTagsPerTopic}]]`); done(); }); }); it('should error if content is too short', function (done) { socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'e' }, function (err) { - assert.equal(err.message, '[[error:content-too-short, ' + meta.config.minimumPostLength + ']]'); + assert.equal(err.message, `[[error:content-too-short, ${meta.config.minimumPostLength}]]`); done(); }); }); @@ -549,7 +549,7 @@ describe('Post\'s', function () { it('should error if content is too long', function (done) { var longContent = new Array(meta.config.maximumPostLength + 2).join('a'); socketPosts.edit({ uid: voterUid }, { pid: pid, content: longContent }, function (err) { - assert.equal(err.message, '[[error:content-too-long, ' + meta.config.maximumPostLength + ']]'); + assert.equal(err.message, `[[error:content-too-long, ${meta.config.maximumPostLength}]]`); done(); }); }); @@ -566,7 +566,7 @@ describe('Post\'s', function () { assert.strictEqual(data.editor, voterUid); assert.strictEqual(data.topic.title, 'edited title'); assert.strictEqual(data.topic.tags[0].value, 'edited'); - const res = await db.getObject('post:' + pid); + const res = await db.getObject(`post:${pid}`); assert(!res.hasOwnProperty('bookmarks')); }); @@ -845,7 +845,7 @@ describe('Post\'s', function () { var nconf = require('nconf'); var content = 'test youtube'; var parsedContent = posts.relativeToAbsolute(content, posts.urlRegex); - assert.equal(parsedContent, 'test youtube'); + assert.equal(parsedContent, `test youtube`); done(); }); @@ -854,7 +854,7 @@ describe('Post\'s', function () { var content = 'test youtube some test '; var parsedContent = posts.relativeToAbsolute(content, posts.urlRegex); parsedContent = posts.relativeToAbsolute(parsedContent, posts.imgRegex); - assert.equal(parsedContent, 'test youtube some test '); + assert.equal(parsedContent, `test youtube some test `); done(); }); }); @@ -1097,7 +1097,7 @@ describe('Post\'s', function () { helpers.loginUser('globalmod', 'globalmodpwd', function (err, _jar) { jar = _jar; assert.ifError(err); - request(nconf.get('url') + '/api/post-queue', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post-queue`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.posts[0].type, 'topic'); assert.equal(body.posts[0].data.content, 'queued topic content'); @@ -1118,7 +1118,7 @@ describe('Post\'s', function () { it('should edit post in queue', function (done) { socketPosts.editQueuedContent({ uid: globalModUid }, { id: queueId, content: 'newContent' }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/post-queue', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post-queue`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.posts[1].type, 'reply'); assert.equal(body.posts[1].data.content, 'newContent'); @@ -1130,7 +1130,7 @@ describe('Post\'s', function () { it('should edit topic title in queue', function (done) { socketPosts.editQueuedContent({ uid: globalModUid }, { id: topicQueueId, title: 'new topic title' }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/post-queue', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post-queue`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.posts[0].type, 'topic'); assert.equal(body.posts[0].data.title, 'new topic title'); @@ -1142,7 +1142,7 @@ describe('Post\'s', function () { it('should edit topic category in queue', function (done) { socketPosts.editQueuedContent({ uid: globalModUid }, { id: topicQueueId, cid: 2 }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/post-queue', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/post-queue`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.posts[0].type, 'topic'); assert.equal(body.posts[0].data.cid, 2); @@ -1232,7 +1232,7 @@ describe('Post\'s', function () { posts.uploads.sync(pid, function (err) { assert.ifError(err); - db.sortedSetCard('post:' + pid + ':uploads', function (err, length) { + db.sortedSetCard(`post:${pid}:uploads`, function (err, length) { assert.ifError(err); assert.strictEqual(length, 2); done(); @@ -1252,7 +1252,7 @@ describe('Post\'s', function () { async.apply(posts.uploads.sync, pid), ], function (err) { assert.ifError(err); - db.sortedSetCard('post:' + pid + ':uploads', function (err, length) { + db.sortedSetCard(`post:${pid}:uploads`, function (err, length) { assert.ifError(err); assert.strictEqual(1, length); done(); @@ -1323,7 +1323,7 @@ describe('Post\'s', function () { async.waterfall([ async.apply(posts.uploads.associate, pid, ['test.bmp']), function (next) { - db.getSortedSetRange('upload:' + md5('test.bmp') + ':pids', 0, -1, next); + db.getSortedSetRange(`upload:${md5('test.bmp')}:pids`, 0, -1, next); }, ], function (err, pids) { assert.ifError(err); @@ -1426,7 +1426,7 @@ describe('Post\'s', function () { }); it('should automatically sync uploads on topic create and reply', function (done) { - db.sortedSetsCard(['post:' + topic.topicData.mainPid + ':uploads', 'post:' + reply.pid + ':uploads'], function (err, lengths) { + db.sortedSetsCard([`post:${topic.topicData.mainPid}:uploads`, `post:${reply.pid}:uploads`], function (err, lengths) { assert.ifError(err); assert.strictEqual(1, lengths[0]); assert.strictEqual(1, lengths[1]); diff --git a/test/search.js b/test/search.js index f9af50157c..6c2c690674 100644 --- a/test/search.js +++ b/test/search.js @@ -106,7 +106,7 @@ describe('Search', function () { it('should search term in titles and posts', function (done) { var meta = require('../src/meta'); - var qs = '/api/search?term=cucumber&in=titlesposts&categories[]=' + cid1 + '&by=phoebe&replies=1&repliesFilter=atleast&sortBy=timestamp&sortDirection=desc&showAs=posts'; + var qs = `/api/search?term=cucumber&in=titlesposts&categories[]=${cid1}&by=phoebe&replies=1&repliesFilter=atleast&sortBy=timestamp&sortDirection=desc&showAs=posts`; privileges.global.give(['groups:search:content'], 'guests', function (err) { assert.ifError(err); request({ diff --git a/test/socket.io.js b/test/socket.io.js index 3c3241d599..679dec1ba2 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -55,13 +55,13 @@ describe('socket.io', function () { it('should connect and auth properly', function (done) { request.get({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, jar: cookies, json: true, }, function (err, res, body) { assert.ifError(err); - request.post(nconf.get('url') + '/login', { + request.post(`${nconf.get('url')}/login`, { jar: cookies, form: { username: 'admin', diff --git a/test/template-helpers.js b/test/template-helpers.js index fb1044bf3b..c48d436c64 100644 --- a/test/template-helpers.js +++ b/test/template-helpers.js @@ -102,7 +102,7 @@ describe('helpers', function () { ], }; var html = helpers.generateChildrenCategories(category); - assert.equal(html, 'children'); + assert.equal(html, `children`); done(); }); @@ -155,42 +155,42 @@ describe('helpers', function () { it('should render thumb as topic image', function (done) { var topicObj = { thumb: '/uploads/1.png', user: { username: 'baris' } }; var html = helpers.renderTopicImage(topicObj); - assert.equal(html, ''); + assert.equal(html, ``); done(); }); it('should render user picture as topic image', function (done) { var topicObj = { thumb: '', user: { uid: 1, username: 'baris', picture: '/uploads/2.png' } }; var html = helpers.renderTopicImage(topicObj); - assert.equal(html, ''); + assert.equal(html, ``); done(); }); it('should render digest avatar', function (done) { var block = { teaser: { user: { username: 'baris', picture: '/uploads/1.png' } } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, ''); + assert.equal(html, ``); done(); }); it('should render digest avatar', function (done) { var block = { teaser: { user: { username: 'baris', 'icon:text': 'B', 'icon:bgColor': '#ff000' } } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, '
' + block.teaser.user['icon:text'] + '
'); + assert.equal(html, `
${block.teaser.user['icon:text']}
`); done(); }); it('should render digest avatar', function (done) { var block = { user: { username: 'baris', picture: '/uploads/1.png' } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, ''); + assert.equal(html, ``); done(); }); it('should render digest avatar', function (done) { var block = { user: { username: 'baris', 'icon:text': 'B', 'icon:bgColor': '#ff000' } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, '
' + block.user['icon:text'] + '
'); + assert.equal(html, `
${block.user['icon:text']}
`); done(); }); diff --git a/test/topics.js b/test/topics.js index 3cbca7be5d..b38e672ff7 100644 --- a/test/topics.js +++ b/test/topics.js @@ -123,7 +123,7 @@ describe('Topic\'s', function () { name: 'Test Category', description: 'Test category created by testing script', }); - const result = await requestType('post', nconf.get('url') + '/api/v3/topics', { + const result = await requestType('post', `${nconf.get('url')}/api/v3/topics`, { form: { title: 'just a title', cid: categoryObj.cid, @@ -142,7 +142,7 @@ describe('Topic\'s', function () { await privileges.categories.give(['groups:topics:create'], categoryObj.cid, 'guests'); await privileges.categories.give(['groups:topics:reply'], categoryObj.cid, 'guests'); - const result = await requestType('post', nconf.get('url') + '/api/v3/topics', { + const result = await requestType('post', `${nconf.get('url')}/api/v3/topics`, { form: { title: 'just a title', cid: categoryObj.cid, @@ -155,7 +155,7 @@ describe('Topic\'s', function () { assert.strictEqual(result.body.response.title, 'just a title'); assert.strictEqual(result.body.response.user.username, '[[global:guest]]'); - const replyResult = await requestType('post', nconf.get('url') + '/api/v3/topics/' + result.body.response.tid, { + const replyResult = await requestType('post', `${nconf.get('url')}/api/v3/topics/${result.body.response.tid}`, { form: { content: 'a reply by guest', }, @@ -330,13 +330,13 @@ describe('Topic\'s', function () { tid = result.topicData.tid; for (let i = 0; i < 30; i++) { // eslint-disable-next-line no-await-in-loop - await topics.reply({ uid: adminUid, content: 'topic reply ' + (i + 1), tid: tid }); + await topics.reply({ uid: adminUid, content: `topic reply ${i + 1}`, tid: tid }); } }); it('should get a topic with posts and other data', async function () { const topicData = await topics.getTopicData(tid); - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, -1, false); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, 0, -1, false); assert(data); assert.equal(data.category.cid, topic.categoryId); assert.equal(data.unreplied, false); @@ -347,7 +347,7 @@ describe('Topic\'s', function () { it('should return first 3 posts including main post', async function () { const topicData = await topics.getTopicData(tid); - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, 2, false); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, 0, 2, false); assert.strictEqual(data.posts.length, 3); assert.strictEqual(data.posts[0].content, 'main post'); assert.strictEqual(data.posts[1].content, 'topic reply 1'); @@ -360,7 +360,7 @@ describe('Topic\'s', function () { it('should return 3 posts from 1 to 3 excluding main post', async function () { const topicData = await topics.getTopicData(tid); const start = 1; - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 3, false); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, start, 3, false); assert.strictEqual(data.posts.length, 3); assert.strictEqual(data.posts[0].content, 'topic reply 1'); assert.strictEqual(data.posts[1].content, 'topic reply 2'); @@ -372,7 +372,7 @@ describe('Topic\'s', function () { it('should return main post and last 2 posts', async function () { const topicData = await topics.getTopicData(tid); - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, 2, true); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, 0, 2, true); assert.strictEqual(data.posts.length, 3); assert.strictEqual(data.posts[0].content, 'main post'); assert.strictEqual(data.posts[1].content, 'topic reply 30'); @@ -385,7 +385,7 @@ describe('Topic\'s', function () { it('should return last 3 posts and not main post', async function () { const topicData = await topics.getTopicData(tid); const start = 1; - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 3, true); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, start, 3, true); assert.strictEqual(data.posts.length, 3); assert.strictEqual(data.posts[0].content, 'topic reply 30'); assert.strictEqual(data.posts[1].content, 'topic reply 29'); @@ -398,7 +398,7 @@ describe('Topic\'s', function () { it('should return posts 29 to 27 posts and not main post', async function () { const topicData = await topics.getTopicData(tid); const start = 2; - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 4, true); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, start, 4, true); assert.strictEqual(data.posts.length, 3); assert.strictEqual(data.posts[0].content, 'topic reply 29'); assert.strictEqual(data.posts[1].content, 'topic reply 28'); @@ -411,7 +411,7 @@ describe('Topic\'s', function () { it('should return 3 posts in reverse', async function () { const topicData = await topics.getTopicData(tid); const start = 28; - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 30, true); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, start, 30, true); assert.strictEqual(data.posts.length, 3); assert.strictEqual(data.posts[0].content, 'topic reply 3'); assert.strictEqual(data.posts[1].content, 'topic reply 2'); @@ -423,7 +423,7 @@ describe('Topic\'s', function () { it('should get all posts with main post at the start', async function () { const topicData = await topics.getTopicData(tid); - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, -1, false); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, 0, -1, false); assert.strictEqual(data.posts.length, 31); assert.strictEqual(data.posts[0].content, 'main post'); assert.strictEqual(data.posts[1].content, 'topic reply 1'); @@ -435,7 +435,7 @@ describe('Topic\'s', function () { it('should get all posts in reverse with main post at the start followed by reply 30', async function () { const topicData = await topics.getTopicData(tid); - const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, -1, true); + const data = await topics.getTopicWithPosts(topicData, `tid:${tid}:posts`, topic.userId, 0, -1, true); assert.strictEqual(data.posts.length, 31); assert.strictEqual(data.posts[0].content, 'main post'); assert.strictEqual(data.posts[1].content, 'topic reply 30'); @@ -604,28 +604,28 @@ describe('Topic\'s', function () { }, scores1: function (next) { db.sortedSetsScore([ - 'cid:' + cid1 + ':tids', - 'cid:' + cid1 + ':tids:lastposttime', - 'cid:' + cid1 + ':tids:posts', + `cid:${cid1}:tids`, + `cid:${cid1}:tids:lastposttime`, + `cid:${cid1}:tids:posts`, ], tid1, next); }, scores2: function (next) { db.sortedSetsScore([ - 'cid:' + cid2 + ':tids', - 'cid:' + cid2 + ':tids:lastposttime', - 'cid:' + cid2 + ':tids:posts', + `cid:${cid2}:tids`, + `cid:${cid2}:tids:lastposttime`, + `cid:${cid2}:tids:posts`, ], tid2, next); }, posts1: function (next) { - db.getSortedSetRangeWithScores('tid:' + tid1 + ':posts', 0, -1, next); + db.getSortedSetRangeWithScores(`tid:${tid1}:posts`, 0, -1, next); }, posts2: function (next) { - db.getSortedSetRangeWithScores('tid:' + tid2 + ':posts', 0, -1, next); + db.getSortedSetRangeWithScores(`tid:${tid2}:posts`, 0, -1, next); }, }, next); }, function (results, next) { - var assertMsg = JSON.stringify(results.posts1) + '\n' + JSON.stringify(results.posts2); + var assertMsg = `${JSON.stringify(results.posts1)}\n${JSON.stringify(results.posts2)}`; assert.equal(results.topicData[0].postcount, results.scores1[2], assertMsg); assert.equal(results.topicData[1].postcount, results.scores2[2], assertMsg); assert.equal(results.topicData[0].lastposttime, post1.timestamp, assertMsg); @@ -672,7 +672,7 @@ describe('Topic\'s', function () { checkCidSets(movedPost, postData, next); }, function (next) { - db.isMemberOfSortedSets(['cid:' + cid1 + ':pids', 'cid:' + cid2 + ':pids'], movedPost.pid, next); + db.isMemberOfSortedSets([`cid:${cid1}:pids`, `cid:${cid2}:pids`], movedPost.pid, next); }, function (isMember, next) { assert.deepEqual(isMember, [true, false]); @@ -687,7 +687,7 @@ describe('Topic\'s', function () { checkCidSets(previousPost, topic2LastReply, next); }, function (next) { - db.isMemberOfSortedSets(['cid:' + cid1 + ':pids', 'cid:' + cid2 + ':pids'], movedPost.pid, next); + db.isMemberOfSortedSets([`cid:${cid1}:pids`, `cid:${cid2}:pids`], movedPost.pid, next); }, function (isMember, next) { assert.deepEqual(isMember, [false, true]); @@ -736,7 +736,7 @@ describe('Topic\'s', function () { it('should purge the topic', function (done) { socketTopics.purge({ uid: adminUid }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) { assert.ifError(err); - db.isSortedSetMember('uid:' + followerUid + ':followed_tids', newTopic.tid, function (err, isMember) { + db.isSortedSetMember(`uid:${followerUid}:followed_tids`, newTopic.tid, function (err, isMember) { assert.ifError(err); assert.strictEqual(false, isMember); done(); @@ -827,7 +827,7 @@ describe('Topic\'s', function () { it('should not do anything if topics are not pinned', function (done) { socketTopics.orderPinnedTopics({ uid: adminUid }, [{ tid: tid3 }], function (err) { assert.ifError(err); - db.isSortedSetMember('cid:' + topic.categoryId + ':tids:pinned', tid3, function (err, isMember) { + db.isSortedSetMember(`cid:${topic.categoryId}:tids:pinned`, tid3, function (err, isMember) { assert.ifError(err); assert(!isMember); done(); @@ -836,13 +836,13 @@ describe('Topic\'s', function () { }); it('should order pinned topics', function (done) { - db.getSortedSetRevRange('cid:' + topic.categoryId + ':tids:pinned', 0, -1, function (err, pinnedTids) { + db.getSortedSetRevRange(`cid:${topic.categoryId}:tids:pinned`, 0, -1, function (err, pinnedTids) { assert.ifError(err); assert.equal(pinnedTids[0], tid2); assert.equal(pinnedTids[1], tid1); socketTopics.orderPinnedTopics({ uid: adminUid }, [{ tid: tid1, order: 1 }, { tid: tid2, order: 0 }], function (err) { assert.ifError(err); - db.getSortedSetRevRange('cid:' + topic.categoryId + ':tids:pinned', 0, -1, function (err, pinnedTids) { + db.getSortedSetRevRange(`cid:${topic.categoryId}:tids:pinned`, 0, -1, function (err, pinnedTids) { assert.ifError(err); assert.equal(pinnedTids[0], tid1); assert.equal(pinnedTids[1], tid2); @@ -971,7 +971,7 @@ describe('Topic\'s', function () { var topicPids; var originalBookmark = 6; function postReply(next) { - topics.reply({ uid: topic.userId, content: 'test post ' + replies.length, tid: newTopic.tid }, function (err, result) { + topics.reply({ uid: topic.userId, content: `test post ${replies.length}`, tid: newTopic.tid }, function (err, result) { assert.equal(err, null, 'was created with error'); assert.ok(result); replies.push(result); @@ -1084,11 +1084,11 @@ describe('Topic\'s', function () { await posts.upvote(result.postData.pid, adminUid); await posts.upvote(reply1.pid, adminUid); assert.strictEqual(await db.sortedSetScore('topics:votes', result.topicData.tid), 1); - assert.strictEqual(await db.sortedSetScore('cid:' + categoryObj.cid + ':tids:votes', result.topicData.tid), 1); + assert.strictEqual(await db.sortedSetScore(`cid:${categoryObj.cid}:tids:votes`, result.topicData.tid), 1); const newTopic = await topics.createTopicFromPosts(adminUid, 'Fork test, vote update', [reply1.pid, reply2.pid], result.topicData.tid); assert.strictEqual(await db.sortedSetScore('topics:votes', newTopic.tid), 1); - assert.strictEqual(await db.sortedSetScore('cid:' + categoryObj.cid + ':tids:votes', newTopic.tid), 1); + assert.strictEqual(await db.sortedSetScore(`cid:${categoryObj.cid}:tids:votes`, newTopic.tid), 1); assert.strictEqual(await topics.getTopicField(newTopic.tid, 'upvotes'), 1); }); }); @@ -1112,7 +1112,7 @@ describe('Topic\'s', function () { }); it('should load topic', function (done) { - request(nconf.get('url') + '/topic/' + topicData.slug, function (err, response, body) { + request(`${nconf.get('url')}/topic/${topicData.slug}`, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert(body); @@ -1121,7 +1121,7 @@ describe('Topic\'s', function () { }); it('should load topic api data', function (done) { - request(nconf.get('url') + '/api/topic/' + topicData.slug, { json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/topic/${topicData.slug}`, { json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert.strictEqual(body._header.tags.meta.find(t => t.name === 'description').content, 'topic content'); @@ -1131,7 +1131,7 @@ describe('Topic\'s', function () { }); it('should 404 if post index is invalid', function (done) { - request(nconf.get('url') + '/topic/' + topicData.slug + '/derp', function (err, response) { + request(`${nconf.get('url')}/topic/${topicData.slug}/derp`, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1139,7 +1139,7 @@ describe('Topic\'s', function () { }); it('should 404 if topic does not exist', function (done) { - request(nconf.get('url') + '/topic/123123/does-not-exist', function (err, response) { + request(`${nconf.get('url')}/topic/123123/does-not-exist`, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1150,7 +1150,7 @@ describe('Topic\'s', function () { var privileges = require('../src/privileges'); privileges.categories.rescind(['groups:topics:read'], topicData.cid, 'guests', function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/topic/' + topicData.slug, function (err, response, body) { + request(`${nconf.get('url')}/api/topic/${topicData.slug}`, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 401); assert(body); @@ -1160,7 +1160,7 @@ describe('Topic\'s', function () { }); it('should redirect to correct topic if slug is missing', function (done) { - request(nconf.get('url') + '/topic/' + topicData.tid + '/herpderp/1?page=2', function (err, response, body) { + request(`${nconf.get('url')}/topic/${topicData.tid}/herpderp/1?page=2`, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert(body); @@ -1169,11 +1169,11 @@ describe('Topic\'s', function () { }); it('should redirect if post index is out of range', function (done) { - request(nconf.get('url') + '/api/topic/' + topicData.slug + '/-1', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/topic/${topicData.slug}/-1`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert.equal(res.headers['x-redirect'], '/topic/' + topicData.tid + '/topic-for-controller-test'); - assert.equal(body, '/topic/' + topicData.tid + '/topic-for-controller-test'); + assert.equal(res.headers['x-redirect'], `/topic/${topicData.tid}/topic-for-controller-test`); + assert.equal(body, `/topic/${topicData.tid}/topic-for-controller-test`); done(); }); }); @@ -1181,7 +1181,7 @@ describe('Topic\'s', function () { it('should 404 if page is out of bounds', function (done) { var meta = require('../src/meta'); meta.config.usePagination = 1; - request(nconf.get('url') + '/topic/' + topicData.slug + '?page=100', function (err, response) { + request(`${nconf.get('url')}/topic/${topicData.slug}?page=100`, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1189,7 +1189,7 @@ describe('Topic\'s', function () { }); it('should mark topic read', function (done) { - request(nconf.get('url') + '/topic/' + topicData.slug, { + request(`${nconf.get('url')}/topic/${topicData.slug}`, { jar: adminJar, }, function (err, res) { assert.ifError(err); @@ -1203,7 +1203,7 @@ describe('Topic\'s', function () { }); it('should 404 if tid is not a number', function (done) { - request(nconf.get('url') + '/api/topic/teaser/nan', { json: true }, function (err, response) { + request(`${nconf.get('url')}/api/topic/teaser/nan`, { json: true }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1211,7 +1211,7 @@ describe('Topic\'s', function () { }); it('should 403 if cant read', function (done) { - request(nconf.get('url') + '/api/topic/teaser/' + 123123, { json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/topic/teaser/${123123}`, { json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 403); assert.equal(body, '[[error:no-privileges]]'); @@ -1221,7 +1221,7 @@ describe('Topic\'s', function () { }); it('should load topic teaser', function (done) { - request(nconf.get('url') + '/api/topic/teaser/' + topicData.tid, { json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/topic/teaser/${topicData.tid}`, { json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert(body); @@ -1236,7 +1236,7 @@ describe('Topic\'s', function () { it('should 404 if tid is not a number', function (done) { - request(nconf.get('url') + '/api/topic/pagination/nan', { json: true }, function (err, response) { + request(`${nconf.get('url')}/api/topic/pagination/nan`, { json: true }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1244,7 +1244,7 @@ describe('Topic\'s', function () { }); it('should 404 if tid does not exist', function (done) { - request(nconf.get('url') + '/api/topic/pagination/1231231', { json: true }, function (err, response) { + request(`${nconf.get('url')}/api/topic/pagination/1231231`, { json: true }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1252,7 +1252,7 @@ describe('Topic\'s', function () { }); it('should load pagination', function (done) { - request(nconf.get('url') + '/api/topic/pagination/' + topicData.tid, { json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/topic/pagination/${topicData.tid}`, { json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert(body); @@ -1344,7 +1344,7 @@ describe('Topic\'s', function () { }); it('should load more from custom set', function (done) { - socketTopics.loadMoreFromSet({ uid: adminUid }, { set: 'uid:' + adminUid + ':topics', after: 0, count: 10 }, function (err, data) { + socketTopics.loadMoreFromSet({ uid: adminUid }, { set: `uid:${adminUid}:topics`, after: 0, count: 10 }, function (err, data) { assert.ifError(err); assert(data); assert(Array.isArray(data.topics)); @@ -1985,7 +1985,7 @@ describe('Topic\'s', function () { } catch (_err) { err = _err; } - assert.equal(err.message, '[[error:not-enough-tags, ' + meta.config.minimumTagsPerTopic + ']]'); + assert.equal(err.message, `[[error:not-enough-tags, ${meta.config.minimumTagsPerTopic}]]`); meta.config.minimumTagsPerTopic = oldValue; }); @@ -1998,7 +1998,7 @@ describe('Topic\'s', function () { } catch (_err) { err = _err; } - assert.equal(err.message, '[[error:too-many-tags, ' + meta.config.maximumTagsPerTopic + ']]'); + assert.equal(err.message, `[[error:too-many-tags, ${meta.config.maximumTagsPerTopic}]]`); meta.config.maximumTagsPerTopic = oldValue; }); @@ -2011,8 +2011,8 @@ describe('Topic\'s', function () { } catch (_err) { err = _err; } - assert.equal(err.message, '[[error:not-enough-tags, ' + minTags + ']]'); - await db.deleteObjectField('category:' + topic.categoryId, 'minTags'); + assert.equal(err.message, `[[error:not-enough-tags, ${minTags}]]`); + await db.deleteObjectField(`category:${topic.categoryId}`, 'minTags'); }); it('should respect maxTags per category', async () => { @@ -2024,8 +2024,8 @@ describe('Topic\'s', function () { } catch (_err) { err = _err; } - assert.equal(err.message, '[[error:too-many-tags, ' + maxTags + ']]'); - await db.deleteObjectField('category:' + topic.categoryId, 'maxTags'); + assert.equal(err.message, `[[error:too-many-tags, ${maxTags}]]`); + await db.deleteObjectField(`category:${topic.categoryId}`, 'maxTags'); }); it('should create and delete category tags properly', async () => { @@ -2387,7 +2387,7 @@ describe('Topic\'s', function () { async function getTopic(tid) { const topicData = await topics.getTopicData(tid); - return await topics.getTopicWithPosts(topicData, 'tid:' + topicData.tid + ':posts', adminUid, 0, 19, false); + return await topics.getTopicWithPosts(topicData, `tid:${topicData.tid}:posts`, adminUid, 0, 19, false); } before(function (done) { @@ -2449,7 +2449,7 @@ describe('Topic\'s', function () { }); it('should return properly for merged topic', function (done) { - request(nconf.get('url') + '/api/topic/' + topic2Data.slug, { jar: adminJar, json: true }, function (err, response, body) { + request(`${nconf.get('url')}/api/topic/${topic2Data.slug}`, { jar: adminJar, json: true }, function (err, response, body) { assert.ifError(err); assert.equal(response.statusCode, 200); assert(body); diff --git a/test/translator.js b/test/translator.js index 7f765ac060..c5eafdf08a 100644 --- a/test/translator.js +++ b/test/translator.js @@ -150,7 +150,7 @@ describe('new Translator(language)', function () { var translator = Translator.create('en-GB'); var title = 'Test 1\\, 2\\, 3 %2 salmon'; - var key = '[[topic:composer.replying_to, ' + title + ']]'; + var key = `[[topic:composer.replying_to, ${title}]]`; return translator.translate(key).then(function (translated) { assert.strictEqual(translated, 'Replying to Test 1, 2, 3 %2 salmon'); }); @@ -160,7 +160,7 @@ describe('new Translator(language)', function () { var translator = Translator.create('en-GB'); var title = '3 % salmon'; - var key = '[[topic:composer.replying_to, ' + title + ']]'; + var key = `[[topic:composer.replying_to, ${title}]]`; return translator.translate(key).then(function (translated) { assert.strictEqual(translated, 'Replying to 3 % salmon'); }); diff --git a/test/uploads.js b/test/uploads.js index 5bf81efd6d..2ef454e482 100644 --- a/test/uploads.js +++ b/test/uploads.js @@ -72,7 +72,7 @@ describe('Upload Controllers', function () { }); it('should upload an image to a post', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body && body.status && body.response && body.response.images); @@ -83,7 +83,7 @@ describe('Upload Controllers', function () { }); it('should upload an image to a post and then delete the upload', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.strictEqual(res.statusCode, 200); assert(body && body.status && body.response && body.response.images); @@ -92,7 +92,7 @@ describe('Upload Controllers', function () { var name = body.response.images[0].url.replace(nconf.get('relative_path') + nconf.get('upload_url'), ''); socketUser.deleteUpload({ uid: regularUid }, { uid: regularUid, name: name }, function (err) { assert.ifError(err); - db.getSortedSetRange('uid:' + regularUid + ':uploads', 0, -1, function (err, uploads) { + db.getSortedSetRange(`uid:${regularUid}:uploads`, 0, -1, function (err, uploads) { assert.ifError(err); assert.equal(uploads.includes(name), false); done(); @@ -119,7 +119,7 @@ describe('Upload Controllers', function () { var oldValue = meta.config.resizeImageWidth; meta.config.resizeImageWidth = 10; meta.config.resizeImageWidthThreshold = 10; - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body && body.status && body.response && body.response.images); @@ -136,7 +136,7 @@ describe('Upload Controllers', function () { it('should upload a file to a post', function (done) { var oldValue = meta.config.allowedFileExtensions; meta.config.allowedFileExtensions = 'png,jpg,bmp,html'; - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/503.html'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/503.html'), {}, jar, csrf_token, function (err, res, body) { meta.config.allowedFileExtensions = oldValue; assert.ifError(err); assert.strictEqual(res.statusCode, 200); @@ -148,7 +148,7 @@ describe('Upload Controllers', function () { }); it('should fail to upload image to post if image dimensions are too big', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/toobig.jpg'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/toobig.jpg'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.strictEqual(res.statusCode, 500); assert(body && body.status && body.status.message); @@ -158,7 +158,7 @@ describe('Upload Controllers', function () { }); it('should fail to upload image to post if image is broken', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/brokenimage.png'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/brokenimage.png'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.strictEqual(res.statusCode, 500); assert(body && body.status && body.status.message); @@ -285,7 +285,7 @@ describe('Upload Controllers', function () { helpers.loginUser('uploader', 'barbar', next); }, function (jar, csrf_token, next) { - helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, next); + helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, next); }, function (res, body, next) { assert(body && body.status && body.response && body.response.images); @@ -321,17 +321,17 @@ describe('Upload Controllers', function () { }); it('should upload site logo', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/uploadlogo', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/uploadlogo`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(Array.isArray(body)); - assert.equal(body[0].url, nconf.get('relative_path') + '/assets/uploads/system/site-logo.png'); + assert.equal(body[0].url, `${nconf.get('relative_path')}/assets/uploads/system/site-logo.png`); done(); }); }); it('should fail to upload invalid file type', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/category/uploadpicture', path.join(__dirname, '../test/files/503.html'), { params: JSON.stringify({ cid: cid }) }, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/category/uploadpicture`, path.join(__dirname, '../test/files/503.html'), { params: JSON.stringify({ cid: cid }) }, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(body.error, '[[error:invalid-image-type, image/png, image/jpeg, image/pjpeg, image/jpg, image/gif, image/svg+xml]]'); done(); @@ -339,7 +339,7 @@ describe('Upload Controllers', function () { }); it('should fail to upload category image with invalid json params', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/category/uploadpicture', path.join(__dirname, '../test/files/test.png'), { params: 'invalid json' }, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/category/uploadpicture`, path.join(__dirname, '../test/files/test.png'), { params: 'invalid json' }, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(body.error, '[[error:invalid-json]]'); done(); @@ -347,35 +347,35 @@ describe('Upload Controllers', function () { }); it('should upload category image', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/category/uploadpicture', path.join(__dirname, '../test/files/test.png'), { params: JSON.stringify({ cid: cid }) }, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/category/uploadpicture`, path.join(__dirname, '../test/files/test.png'), { params: JSON.stringify({ cid: cid }) }, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(Array.isArray(body)); - assert.equal(body[0].url, nconf.get('relative_path') + '/assets/uploads/category/category-1.png'); + assert.equal(body[0].url, `${nconf.get('relative_path')}/assets/uploads/category/category-1.png`); done(); }); }); it('should upload default avatar', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/uploadDefaultAvatar', path.join(__dirname, '../test/files/test.png'), { }, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/uploadDefaultAvatar`, path.join(__dirname, '../test/files/test.png'), { }, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert.equal(body[0].url, nconf.get('relative_path') + '/assets/uploads/system/avatar-default.png'); + assert.equal(body[0].url, `${nconf.get('relative_path')}/assets/uploads/system/avatar-default.png`); done(); }); }); it('should upload og image', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/uploadOgImage', path.join(__dirname, '../test/files/test.png'), { }, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/uploadOgImage`, path.join(__dirname, '../test/files/test.png'), { }, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert.equal(body[0].url, nconf.get('relative_path') + '/assets/uploads/system/og-image.png'); + assert.equal(body[0].url, `${nconf.get('relative_path')}/assets/uploads/system/og-image.png`); done(); }); }); it('should upload favicon', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/uploadfavicon', path.join(__dirname, '../test/files/favicon.ico'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/uploadfavicon`, path.join(__dirname, '../test/files/favicon.ico'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(Array.isArray(body)); @@ -386,13 +386,13 @@ describe('Upload Controllers', function () { it('should upload touch icon', function (done) { var touchiconAssetPath = '/assets/uploads/system/touchicon-orig.png'; - helpers.uploadFile(nconf.get('url') + '/api/admin/uploadTouchIcon', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { + helpers.uploadFile(`${nconf.get('url')}/api/admin/uploadTouchIcon`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(Array.isArray(body)); assert.equal(body[0].url, touchiconAssetPath); meta.config['brand:touchIcon'] = touchiconAssetPath; - request(nconf.get('url') + '/apple-touch-icon', function (err, res, body) { + request(`${nconf.get('url')}/apple-touch-icon`, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -402,7 +402,7 @@ describe('Upload Controllers', function () { }); it('should upload regular file', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/upload/file', path.join(__dirname, '../test/files/test.png'), { + helpers.uploadFile(`${nconf.get('url')}/api/admin/upload/file`, path.join(__dirname, '../test/files/test.png'), { params: JSON.stringify({ folder: 'system', }), @@ -417,7 +417,7 @@ describe('Upload Controllers', function () { }); it('should fail to upload regular file in wrong directory', function (done) { - helpers.uploadFile(nconf.get('url') + '/api/admin/upload/file', path.join(__dirname, '../test/files/test.png'), { + helpers.uploadFile(`${nconf.get('url')}/api/admin/upload/file`, path.join(__dirname, '../test/files/test.png'), { params: JSON.stringify({ folder: '../../system', }), diff --git a/test/user.js b/test/user.js index 6492e44847..41c2ba2b09 100644 --- a/test/user.js +++ b/test/user.js @@ -165,7 +165,7 @@ describe('User', function () { for (var i = 0; i < 10; i += 1) { users.push({ username: 'Jane Doe', - email: 'jane.doe' + i + '@example.com', + email: `jane.doe${i}@example.com`, }); } @@ -573,7 +573,7 @@ describe('User', function () { }); it('.validate() should correctly identify an invalid code', function (done) { - User.reset.validate(code + 'abcdef', function (err, valid) { + User.reset.validate(`${code}abcdef`, function (err, valid) { assert.ifError(err); assert.strictEqual(valid, false); done(); @@ -598,7 +598,7 @@ describe('User', function () { User.getUserData(uid, next); }, password: function (next) { - db.getObjectField('user:' + uid, 'password', next); + db.getObjectField(`user:${uid}`, 'password', next); }, }, function (err, results) { assert.ifError(err); @@ -861,7 +861,7 @@ describe('User', function () { assert.equal(result.userslug, 'updatedusername'); assert.equal(result.email, 'updatedEmail@me.com'); - db.getObject('user:' + uid, function (err, userData) { + db.getObject(`user:${uid}`, function (err, userData) { assert.ifError(err); Object.keys(data).forEach(function (key) { if (key !== 'password') { @@ -942,7 +942,7 @@ describe('User', function () { it('should change username', function (done) { socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, username: 'updatedAgain', password: '123456' }, function (err) { assert.ifError(err); - db.getObjectField('user:' + uid, 'username', function (err, username) { + db.getObjectField(`user:${uid}`, 'username', function (err, username) { assert.ifError(err); assert.equal(username, 'updatedAgain'); done(); @@ -952,7 +952,7 @@ describe('User', function () { it('should not let setting an empty username', async function () { await socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, username: '', password: '123456' }); - const username = await db.getObjectField('user:' + uid, 'username'); + const username = await db.getObjectField(`user:${uid}`, 'username'); assert.strictEqual(username, 'updatedAgain'); }); @@ -961,7 +961,7 @@ describe('User', function () { const longName = new Array(maxLength).fill('a').join(''); const uid = await User.create({ username: longName }); await socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, username: longName, email: 'verylong@name.com' }); - const userData = await db.getObject('user:' + uid); + const userData = await db.getObject(`user:${uid}`); assert.strictEqual(userData.username, longName); assert.strictEqual(userData.email, 'verylong@name.com'); }); @@ -969,7 +969,7 @@ describe('User', function () { it('should not update a user\'s username if it did not change', function (done) { socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, username: 'updatedAgain', password: '123456' }, function (err) { assert.ifError(err); - db.getSortedSetRevRange('user:' + uid + ':usernames', 0, -1, function (err, data) { + db.getSortedSetRevRange(`user:${uid}:usernames`, 0, -1, function (err, data) { assert.ifError(err); assert.equal(data.length, 2); assert(data[0].startsWith('updatedAgain')); @@ -995,7 +995,7 @@ describe('User', function () { assert.ifError(err); socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, email: 'updatedAgain@me.com', password: '123456' }, function (err) { assert.ifError(err); - db.getObjectField('user:' + uid, 'email', function (err, email) { + db.getObjectField(`user:${uid}`, 'email', function (err, email) { assert.ifError(err); assert.equal(email, 'updatedAgain@me.com'); done(); @@ -1031,7 +1031,7 @@ describe('User', function () { socketUser.updateCover({ uid: uid }, { uid: uid, imageData: imageData, position: position }, function (err, result) { assert.ifError(err); assert(result.url); - db.getObjectFields('user:' + uid, ['cover:url', 'cover:position'], function (err, data) { + db.getObjectFields(`user:${uid}`, ['cover:url', 'cover:position'], function (err, data) { assert.ifError(err); assert.equal(data['cover:url'], result.url); assert.equal(data['cover:position'], position); @@ -1045,7 +1045,7 @@ describe('User', function () { socketUser.uploadCroppedPicture({ uid: uid }, { uid: uid, imageData: imageData }, function (err, result) { assert.ifError(err); assert(result.url); - db.getObjectFields('user:' + uid, ['uploadedpicture', 'picture'], function (err, data) { + db.getObjectFields(`user:${uid}`, ['uploadedpicture', 'picture'], function (err, data) { assert.ifError(err); assert.equal(result.url, data.uploadedpicture); assert.equal(result.url, data.picture); @@ -1057,7 +1057,7 @@ describe('User', function () { it('should remove cover image', function (done) { socketUser.removeCover({ uid: uid }, { uid: uid }, function (err) { assert.ifError(err); - db.getObjectField('user:' + uid, 'cover:url', function (err, url) { + db.getObjectField(`user:${uid}`, 'cover:url', function (err, url) { assert.ifError(err); assert.equal(url, null); done(); @@ -1121,7 +1121,7 @@ describe('User', function () { assert.ifError(err); User.getUserField(uid, 'picture', function (err, picture) { assert.ifError(err); - assert.equal(picture, nconf.get('relative_path') + '/test'); + assert.equal(picture, `${nconf.get('relative_path')}/test`); done(); }); }); @@ -1248,7 +1248,7 @@ describe('User', function () { }); it('should load profile page', function (done) { - request(nconf.get('url') + '/api/user/updatedagain', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/updatedagain`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1257,7 +1257,7 @@ describe('User', function () { }); it('should load settings page', function (done) { - request(nconf.get('url') + '/api/user/updatedagain/settings', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/updatedagain/settings`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body.settings); @@ -1268,7 +1268,7 @@ describe('User', function () { }); it('should load edit page', function (done) { - request(nconf.get('url') + '/api/user/updatedagain/edit', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/updatedagain/edit`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1277,7 +1277,7 @@ describe('User', function () { }); it('should load edit/email page', function (done) { - request(nconf.get('url') + '/api/user/updatedagain/edit/email', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/updatedagain/edit/email`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(body); @@ -1293,7 +1293,7 @@ describe('User', function () { assert.ifError(err); groups.join('Test', uid, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/user/updatedagain/groups', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/updatedagain/groups`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); assert(Array.isArray(body.groups)); @@ -1325,8 +1325,8 @@ describe('User', function () { it('should get history from set', async function () { const now = Date.now(); - await db.sortedSetAdd('user:' + testUserUid + ':usernames', now, 'derp:' + now); - const data = await User.getHistory('user:' + testUserUid + ':usernames'); + await db.sortedSetAdd(`user:${testUserUid}:usernames`, now, `derp:${now}`); + const data = await User.getHistory(`user:${testUserUid}:usernames`); assert.equal(data[0].value, 'derp'); assert.equal(data[0].timestamp, now); }); @@ -1439,7 +1439,7 @@ describe('User', function () { var testUsers = ['daysub', 'offsub', 'nullsub', 'weeksub']; async.each(testUsers, function (username, next) { async.waterfall([ - async.apply(User.create, { username: username, email: username + '@example.com' }), + async.apply(User.create, { username: username, email: `${username}@example.com` }), function (uid, next) { if (username === 'nullsub') { return setImmediate(next); @@ -1556,12 +1556,12 @@ describe('User', function () { request({ method: 'post', - url: nconf.get('url') + '/email/unsubscribe/' + token, + url: `${nconf.get('url')}/email/unsubscribe/${token}`, }, function (err, res) { assert.ifError(err); assert.strictEqual(res.statusCode, 200); - db.getObjectField('user:' + uid + ':settings', 'dailyDigestFreq', function (err, value) { + db.getObjectField(`user:${uid}:settings`, 'dailyDigestFreq', function (err, value) { assert.ifError(err); assert.strictEqual(value, 'off'); done(); @@ -1578,12 +1578,12 @@ describe('User', function () { request({ method: 'post', - url: nconf.get('url') + '/email/unsubscribe/' + token, + url: `${nconf.get('url')}/email/unsubscribe/${token}`, }, function (err, res) { assert.ifError(err); assert.strictEqual(res.statusCode, 200); - db.getObjectField('user:' + uid + ':settings', 'notificationType_test', function (err, value) { + db.getObjectField(`user:${uid}:settings`, 'notificationType_test', function (err, value) { assert.ifError(err); assert.strictEqual(value, 'notification'); done(); @@ -1598,7 +1598,7 @@ describe('User', function () { request({ method: 'post', - url: nconf.get('url') + '/email/unsubscribe/' + token, + url: `${nconf.get('url')}/email/unsubscribe/${token}`, }, function (err, res) { assert.ifError(err); assert.strictEqual(res.statusCode, 404); @@ -1614,7 +1614,7 @@ describe('User', function () { request({ method: 'post', - url: nconf.get('url') + '/email/unsubscribe/' + token, + url: `${nconf.get('url')}/email/unsubscribe/${token}`, }, function (err, res) { assert.ifError(err); assert.strictEqual(res.statusCode, 404); @@ -1625,7 +1625,7 @@ describe('User', function () { it('should return errors on missing token', function (done) { request({ method: 'post', - url: nconf.get('url') + '/email/unsubscribe/', + url: `${nconf.get('url')}/email/unsubscribe/`, }, function (err, res) { assert.ifError(err); assert.strictEqual(res.statusCode, 404); @@ -1638,11 +1638,11 @@ describe('User', function () { template: 'notification', type: 'test', uid: uid, - }, nconf.get('secret') + 'aababacaba'); + }, `${nconf.get('secret')}aababacaba`); request({ method: 'post', - url: nconf.get('url') + '/email/unsubscribe/' + token, + url: `${nconf.get('url')}/email/unsubscribe/${token}`, }, function (err, res) { assert.ifError(err); assert.strictEqual(res.statusCode, 403); @@ -1932,7 +1932,7 @@ describe('User', function () { assert.ifError(err); helpers.loginUser('admin', '123456', function (err, jar) { assert.ifError(err); - request(nconf.get('url') + '/api/admin/manage/registration', { jar: jar, json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/admin/manage/registration`, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.users[0].username, 'rejectme'); assert.equal(body.users[0].email, '<script>alert("ok")<script>reject@me.com'); @@ -2066,7 +2066,7 @@ describe('User', function () { jar = _jar; request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -2102,7 +2102,7 @@ describe('User', function () { jar = _jar; request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -2168,7 +2168,7 @@ describe('User', function () { meta.config.maximumInvites = 1; const { res } = await helpers.invite({ emails: 'invite6@test.com', groupsToJoin: [] }, inviterUid, jar, csrf_token); assert.strictEqual(res.statusCode, 403); - assert.strictEqual(res.body.status.message, '[[error:invite-maximum-met, ' + 5 + ', ' + 1 + ']]'); + assert.strictEqual(res.body.status.message, `[[error:invite-maximum-met, ${5}, ${1}]]`); meta.config.maximumInvites = 10; }); @@ -2202,7 +2202,7 @@ describe('User', function () { jar = _jar; request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -2231,7 +2231,7 @@ describe('User', function () { User.getInvites(inviterUid, function (err, data) { assert.ifError(err); Array.from(Array(6)).forEach((_, i) => { - assert.notEqual(data.indexOf('invite' + (i + 1) + '@test.com'), -1); + assert.notEqual(data.indexOf(`invite${i + 1}@test.com`), -1); }); done(); }); @@ -2246,7 +2246,7 @@ describe('User', function () { var inviterData = data.filter(d => parseInt(d.uid, 10) === inviterUid)[0]; Array.from(Array(6)).forEach((_, i) => { - assert.notEqual(inviterData.invitations.indexOf('invite' + (i + 1) + '@test.com'), -1); + assert.notEqual(inviterData.invitations.indexOf(`invite${i + 1}@test.com`), -1); }); done(); @@ -2269,7 +2269,7 @@ describe('User', function () { it('should verify installation with no errors', function (done) { var email = 'invite1@test.com'; - db.getObjectField('invitation:email:' + email, 'token', function (err, token) { + db.getObjectField(`invitation:email:${email}`, 'token', function (err, token) { assert.ifError(err); User.verifyInvitation({ token: token, email: 'invite1@test.com' }, function (err) { assert.ifError(err); @@ -2289,7 +2289,7 @@ describe('User', function () { var socketUser = require('../src/socket.io/user'); socketUser.deleteInvitation({ uid: adminUid }, { invitedBy: 'inviter', email: 'invite1@test.com' }, function (err) { assert.ifError(err); - db.isSetMember('invitation:uid:' + inviterUid, 'invite1@test.com', function (err, isMember) { + db.isSetMember(`invitation:uid:${inviterUid}`, 'invite1@test.com', function (err, isMember) { assert.ifError(err); assert.equal(isMember, false); done(); @@ -2300,7 +2300,7 @@ describe('User', function () { it('should delete invitation key', function (done) { User.deleteInvitationKey('invite99@test.com', function (err) { assert.ifError(err); - db.isSetMember('invitation:uid:' + adminUid, 'invite99@test.com', function (err, isMember) { + db.isSetMember(`invitation:uid:${adminUid}`, 'invite99@test.com', function (err, isMember) { assert.ifError(err); assert.equal(isMember, false); db.isSetMember('invitation:uids', adminUid, function (err, isMember) { @@ -2315,7 +2315,7 @@ describe('User', function () { it('should joined the groups from invitation after registration', async function () { var email = 'invite5@test.com'; var groupsToJoin = [PUBLIC_GROUP, OWN_PRIVATE_GROUP]; - var token = await db.getObjectField('invitation:email:' + email, 'token'); + var token = await db.getObjectField(`invitation:email:${email}`, 'token'); await new Promise(function (resolve, reject) { helpers.registerUser({ @@ -2353,7 +2353,7 @@ describe('User', function () { jar = _jar; request({ - url: nconf.get('url') + '/api/config', + url: `${nconf.get('url')}/api/config`, json: true, jar: jar, }, function (err, response, body) { @@ -2417,7 +2417,7 @@ describe('User', function () { assert.strictEqual(unverified, true); await User.email.confirmByCode(code); const [confirmed, isVerified] = await Promise.all([ - db.getObjectField('user:' + uid, 'email:confirmed'), + db.getObjectField(`user:${uid}`, 'email:confirmed'), groups.isMember(uid, 'verified-users', uid), ]); assert.strictEqual(parseInt(confirmed, 10), 1); @@ -2435,7 +2435,7 @@ describe('User', function () { assert.strictEqual(unverified, true); await User.email.confirmByUid(uid); const [confirmed, isVerified] = await Promise.all([ - db.getObjectField('user:' + uid, 'email:confirmed'), + db.getObjectField(`user:${uid}`, 'email:confirmed'), groups.isMember(uid, 'verified-users', uid), ]); assert.strictEqual(parseInt(confirmed, 10), 1); @@ -2484,7 +2484,7 @@ describe('User', function () { }, function (err, _uid) { uid = _uid; assert.ifError(err); - request(nconf.get('url') + '/api/user/hiddenemail', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/user/hiddenemail`, { json: true }, function (err, res, body) { assert.ifError(err); assert.equal(body.fullname, ''); assert.equal(body.email, ''); @@ -2502,10 +2502,10 @@ describe('User', function () { cid: testCid, }, function (err) { assert.ifError(err); - request(nconf.get('url') + '/api/recent', { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/recent`, { json: true }, function (err, res, body) { assert.ifError(err); assert(!body.topics[0].user.hasOwnProperty('fullname')); - request(nconf.get('url') + '/api/topic/' + body.topics[0].slug, { json: true }, function (err, res, body) { + request(`${nconf.get('url')}/api/topic/${body.topics[0].slug}`, { json: true }, function (err, res, body) { assert.ifError(err); assert(!body.posts[0].user.hasOwnProperty('fullname')); done(); diff --git a/test/utils.js b/test/utils.js index c91ba8c02d..486dbc3779 100644 --- a/test/utils.js +++ b/test/utils.js @@ -430,7 +430,7 @@ describe('Utility Methods', function () { var index = hours.length - 1; for (var i = currentHour, ii = currentHour - 24; i > ii; i -= 1) { var hour = i < 0 ? 24 + i : i; - assert.equal(hours[index], hour + ':00'); + assert.equal(hours[index], `${hour}:00`); index -= 1; } done(); @@ -443,7 +443,7 @@ describe('Utility Methods', function () { var index = 0; for (var x = 29; x >= 0; x -= 1) { var tmpDate = new Date(currentDay - (1000 * 60 * 60 * 24 * x)); - assert.equal(months[tmpDate.getMonth()] + ' ' + tmpDate.getDate(), days[index]); + assert.equal(`${months[tmpDate.getMonth()]} ${tmpDate.getDate()}`, days[index]); index += 1; } done();