fix: closes #12632, dont load data twice

This commit is contained in:
Barış Soner Uşaklı
2024-06-11 15:38:40 -04:00
parent 9af3a2daca
commit 66adfa2999
5 changed files with 40 additions and 38 deletions

View File

@@ -6,13 +6,16 @@ const helpers = require('../helpers');
const groups = require('../../groups'); const groups = require('../../groups');
const privileges = require('../../privileges'); const privileges = require('../../privileges');
const plugins = require('../../plugins'); const plugins = require('../../plugins');
const accountHelpers = require('./helpers');
const file = require('../../file'); const file = require('../../file');
const editController = module.exports; const editController = module.exports;
editController.get = async function (req, res) { editController.get = async function (req, res, next) {
const [{ const { userData } = res.locals;
if (!userData) {
return next();
}
const {
username, username,
userslug, userslug,
isSelf, isSelf,
@@ -20,36 +23,36 @@ editController.get = async function (req, res) {
groups: _groups, groups: _groups,
groupTitleArray, groupTitleArray,
allowMultipleBadges, allowMultipleBadges,
}, canUseSignature, canManageUsers] = await Promise.all([ } = userData;
accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query),
const [canUseSignature, canManageUsers] = await Promise.all([
privileges.global.can('signature', req.uid), privileges.global.can('signature', req.uid),
privileges.admin.can('admin:users', req.uid), privileges.admin.can('admin:users', req.uid),
]); ]);
const payload = {}; userData.maximumSignatureLength = meta.config.maximumSignatureLength;
payload.maximumSignatureLength = meta.config.maximumSignatureLength; userData.maximumAboutMeLength = meta.config.maximumAboutMeLength;
payload.maximumAboutMeLength = meta.config.maximumAboutMeLength; userData.maximumProfileImageSize = meta.config.maximumProfileImageSize;
payload.maximumProfileImageSize = meta.config.maximumProfileImageSize; userData.allowMultipleBadges = meta.config.allowMultipleBadges === 1;
payload.allowMultipleBadges = meta.config.allowMultipleBadges === 1; userData.allowAccountDelete = meta.config.allowAccountDelete === 1;
payload.allowAccountDelete = meta.config.allowAccountDelete === 1; userData.allowWebsite = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:website'];
payload.allowWebsite = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:website']; userData.allowAboutMe = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:aboutme'];
payload.allowAboutMe = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:aboutme']; userData.allowSignature = canUseSignature && (!isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:signature']);
payload.allowSignature = canUseSignature && (!isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:signature']); userData.profileImageDimension = meta.config.profileImageDimension;
payload.profileImageDimension = meta.config.profileImageDimension; userData.defaultAvatar = user.getDefaultAvatar();
payload.defaultAvatar = user.getDefaultAvatar();
payload.groups = _groups.filter(g => g && g.userTitleEnabled && !groups.isPrivilegeGroup(g.name) && g.name !== 'registered-users'); userData.groups = _groups.filter(g => g && g.userTitleEnabled && !groups.isPrivilegeGroup(g.name) && g.name !== 'registered-users');
if (req.uid === res.locals.uid || canManageUsers) { if (req.uid === res.locals.uid || canManageUsers) {
const { associations } = await plugins.hooks.fire('filter:auth.list', { uid: res.locals.uid, associations: [] }); const { associations } = await plugins.hooks.fire('filter:auth.list', { uid: res.locals.uid, associations: [] });
payload.sso = associations; userData.sso = associations;
} }
if (!allowMultipleBadges) { if (!allowMultipleBadges) {
payload.groupTitle = groupTitleArray[0]; userData.groupTitle = groupTitleArray[0];
} }
payload.groups.sort((a, b) => { userData.groups.sort((a, b) => {
const i1 = groupTitleArray.indexOf(a.name); const i1 = groupTitleArray.indexOf(a.name);
const i2 = groupTitleArray.indexOf(b.name); const i2 = groupTitleArray.indexOf(b.name);
if (i1 === -1) { if (i1 === -1) {
@@ -59,14 +62,14 @@ editController.get = async function (req, res) {
} }
return i1 - i2; return i1 - i2;
}); });
payload.groups.forEach((group) => { userData.groups.forEach((group) => {
group.userTitle = group.userTitle || group.displayName; group.userTitle = group.userTitle || group.displayName;
group.selected = groupTitleArray.includes(group.name); group.selected = groupTitleArray.includes(group.name);
}); });
payload.groupSelectSize = Math.min(10, Math.max(5, payload.groups.length + 1)); userData.groupSelectSize = Math.min(10, Math.max(5, userData.groups.length + 1));
payload.title = `[[pages:account/edit, ${username}]]`; userData.title = `[[pages:account/edit, ${username}]]`;
payload.breadcrumbs = helpers.buildBreadcrumbs([ userData.breadcrumbs = helpers.buildBreadcrumbs([
{ {
text: username, text: username,
url: `/user/${userslug}`, url: `/user/${userslug}`,
@@ -75,9 +78,9 @@ editController.get = async function (req, res) {
text: '[[user:edit]]', text: '[[user:edit]]',
}, },
]); ]);
payload.editButtons = []; userData.editButtons = [];
res.render('account/edit', payload); res.render('account/edit', userData);
}; };
editController.password = async function (req, res, next) { editController.password = async function (req, res, next) {
@@ -102,6 +105,7 @@ editController.email = async function (req, res, next) {
}; };
async function renderRoute(name, req, res) { async function renderRoute(name, req, res) {
const { userData } = res.locals;
const [isAdmin, { username, userslug }, hasPassword] = await Promise.all([ const [isAdmin, { username, userslug }, hasPassword] = await Promise.all([
privileges.admin.can('admin:users', req.uid), privileges.admin.can('admin:users', req.uid),
user.getUserFields(res.locals.uid, ['username', 'userslug']), user.getUserFields(res.locals.uid, ['username', 'userslug']),
@@ -112,14 +116,14 @@ async function renderRoute(name, req, res) {
return helpers.notAllowed(req, res); return helpers.notAllowed(req, res);
} }
const payload = { hasPassword }; userData.hasPassword = hasPassword;
if (name === 'password') { if (name === 'password') {
payload.minimumPasswordLength = meta.config.minimumPasswordLength; userData.minimumPasswordLength = meta.config.minimumPasswordLength;
payload.minimumPasswordStrength = meta.config.minimumPasswordStrength; userData.minimumPasswordStrength = meta.config.minimumPasswordStrength;
} }
payload.title = `[[pages:account/edit/${name}, ${username}]]`; userData.title = `[[pages:account/edit/${name}, ${username}]]`;
payload.breadcrumbs = helpers.buildBreadcrumbs([ userData.breadcrumbs = helpers.buildBreadcrumbs([
{ {
text: username, text: username,
url: `/user/${userslug}`, url: `/user/${userslug}`,
@@ -133,7 +137,7 @@ async function renderRoute(name, req, res) {
}, },
]); ]);
res.render(`account/edit/${name}`, payload); res.render(`account/edit/${name}`, userData);
} }
editController.uploadPicture = async function (req, res, next) { editController.uploadPicture = async function (req, res, next) {

View File

@@ -9,7 +9,6 @@ const posts = require('../../posts');
const categories = require('../../categories'); const categories = require('../../categories');
const plugins = require('../../plugins'); const plugins = require('../../plugins');
const privileges = require('../../privileges'); const privileges = require('../../privileges');
const accountHelpers = require('./helpers');
const helpers = require('../helpers'); const helpers = require('../helpers');
const utils = require('../../utils'); const utils = require('../../utils');
@@ -26,7 +25,7 @@ profileController.get = async function (req, res, next) {
} }
} }
const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); const { userData } = res.locals;
if (!userData) { if (!userData) {
return next(); return next();
} }

View File

@@ -13,13 +13,12 @@ const plugins = require('../../plugins');
const notifications = require('../../notifications'); const notifications = require('../../notifications');
const db = require('../../database'); const db = require('../../database');
const helpers = require('../helpers'); const helpers = require('../helpers');
const accountHelpers = require('./helpers');
const slugify = require('../../slugify'); const slugify = require('../../slugify');
const settingsController = module.exports; const settingsController = module.exports;
settingsController.get = async function (req, res, next) { settingsController.get = async function (req, res, next) {
const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); const { userData } = res.locals;
if (!userData) { if (!userData) {
return next(); return next();
} }

View File

@@ -116,7 +116,7 @@ module.exports = function (middleware) {
} }
try { try {
await renderMethod(template, { ...res.locals.templateValues, ...options }, fn); await renderMethod(template, options, fn);
} catch (err) { } catch (err) {
next(err); next(err);
} }

View File

@@ -248,7 +248,7 @@ module.exports = function (middleware) {
}; };
middleware.buildAccountData = async (req, res, next) => { middleware.buildAccountData = async (req, res, next) => {
res.locals.templateValues = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); res.locals.userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query);
next(); next();
}; };