You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
5.0 KiB
JavaScript

'use strict';
const user = require('../../user');
const meta = require('../../meta');
const helpers = require('../helpers');
const groups = require('../../groups');
const accountHelpers = require('./helpers');
const privileges = require('../../privileges');
const file = require('../../file');
const editController = module.exports;
editController.get = async function (req, res, next) {
const [userData, canUseSignature] = await Promise.all([
accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid),
privileges.global.can('signature', req.uid),
]);
if (!userData) {
return next();
}
userData.maximumSignatureLength = meta.config.maximumSignatureLength;
userData.maximumAboutMeLength = meta.config.maximumAboutMeLength;
userData.maximumProfileImageSize = meta.config.maximumProfileImageSize;
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.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'];
userData.allowAboutMe = !userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:aboutme'];
userData.allowSignature = canUseSignature && (!userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:signature']);
userData.profileImageDimension = meta.config.profileImageDimension;
userData.defaultAvatar = user.getDefaultAvatar();
userData.groups = userData.groups.filter(g => g && g.userTitleEnabled && !groups.isPrivilegeGroup(g.name) && g.name !== 'registered-users');
if (!userData.allowMultipleBadges) {
userData.groupTitle = userData.groupTitleArray[0];
}
userData.groups.sort((a, b) => {
const i1 = userData.groupTitleArray.indexOf(a.name);
const i2 = userData.groupTitleArray.indexOf(b.name);
if (i1 === -1) {
return 1;
} else if (i2 === -1) {
return -1;
}
return i1 - i2;
});
userData.groups.forEach((group) => {
group.userTitle = group.userTitle || group.displayName;
group.selected = userData.groupTitleArray.includes(group.name);
});
userData.groupSelectSize = Math.min(10, Math.max(5, userData.groups.length + 1));
userData.title = `[[pages:account/edit, ${userData.username}]]`;
userData.breadcrumbs = helpers.buildBreadcrumbs([
{
text: userData.username,
url: `/user/${userData.userslug}`,
},
{
text: '[[user:edit]]',
},
]);
userData.editButtons = [];
res.render('account/edit', userData);
};
editController.password = async function (req, res, next) {
await renderRoute('password', req, res, next);
};
editController.username = async function (req, res, next) {
await renderRoute('username', req, res, next);
};
editController.email = async function (req, res, next) {
await renderRoute('email', req, res, next);
};
async function renderRoute(name, req, res, next) {
const userData = await getUserData(req, next);
if (!userData) {
return next();
}
if (meta.config[`${name}:disableEdit`] && !userData.isAdmin) {
return helpers.notAllowed(req, res);
}
if (name === 'password') {
userData.minimumPasswordLength = meta.config.minimumPasswordLength;
userData.minimumPasswordStrength = meta.config.minimumPasswordStrength;
}
userData.title = `[[pages:account/edit/${name}, ${userData.username}]]`;
userData.breadcrumbs = helpers.buildBreadcrumbs([
{
text: userData.username,
url: `/user/${userData.userslug}`,
},
{
text: '[[user:edit]]',
url: `/user/${userData.userslug}/edit`,
},
{
text: `[[user:${name}]]`,
},
]);
res.render(`account/edit/${name}`, userData);
}
async function getUserData(req) {
const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid);
if (!userData) {
return null;
}
userData.hasPassword = await user.hasPassword(userData.uid);
return userData;
}
editController.uploadPicture = async function (req, res, next) {
const userPhoto = req.files.files[0];
try {
const updateUid = await user.getUidByUserslug(req.params.userslug);
const isAllowed = await privileges.users.canEdit(req.uid, updateUid);
if (!isAllowed) {
return helpers.notAllowed(req, res);
}
await user.checkMinReputation(req.uid, updateUid, 'min:rep:profile-picture');
const image = await user.uploadCroppedPictureFile({
uid: updateUid,
file: userPhoto,
});
res.json([{
name: userPhoto.name,
url: image.url,
}]);
} catch (err) {
next(err);
} finally {
await file.delete(userPhoto.path);
}
};