The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Rocket.Chat/app/user-status/server/methods/insertOrUpdateUserStatus.js

71 lines
2.6 KiB

import { Meteor } from 'meteor/meteor';
import s from 'underscore.string';
import { hasPermission } from '../../../authorization';
import { Notifications } from '../../../notifications';
import { CustomUserStatus } from '../../../models';
Meteor.methods({
insertOrUpdateUserStatus(userStatusData) {
if (!hasPermission(this.userId, 'manage-user-status')) {
throw new Meteor.Error('not_authorized');
}
if (!s.trim(userStatusData.name)) {
throw new Meteor.Error('error-the-field-is-required', 'The field Name is required', { method: 'insertOrUpdateUserStatus', field: 'Name' });
}
// allow all characters except >, <, &, ", '
// more practical than allowing specific sets of characters; also allows foreign languages
const nameValidation = /[><&"']/;
if (nameValidation.test(userStatusData.name)) {
throw new Meteor.Error('error-input-is-not-a-valid-field', `${ userStatusData.name } is not a valid name`, { method: 'insertOrUpdateUserStatus', input: userStatusData.name, field: 'Name' });
}
let matchingResults = [];
if (userStatusData._id) {
matchingResults = CustomUserStatus.findByNameExceptId(userStatusData.name, userStatusData._id).fetch();
} else {
matchingResults = CustomUserStatus.findByName(userStatusData.name).fetch();
}
if (matchingResults.length > 0) {
throw new Meteor.Error('Custom_User_Status_Error_Name_Already_In_Use', 'The custom user status name is already in use', { method: 'insertOrUpdateUserStatus' });
}
const validStatusTypes = ['online', 'away', 'busy', 'offline'];
if (userStatusData.statusType && validStatusTypes.indexOf(userStatusData.statusType) < 0) {
throw new Meteor.Error('error-input-is-not-a-valid-field', `${ userStatusData.statusType } is not a valid status type`, { method: 'insertOrUpdateUserStatus', input: userStatusData.statusType, field: 'StatusType' });
}
if (!userStatusData._id) {
// insert user status
const createUserStatus = {
name: userStatusData.name,
statusType: userStatusData.statusType || null,
};
const _id = CustomUserStatus.create(createUserStatus);
Notifications.notifyLogged('updateCustomUserStatus', { userStatusData: createUserStatus });
return _id;
}
// update User status
if (userStatusData.name !== userStatusData.previousName) {
CustomUserStatus.setName(userStatusData._id, userStatusData.name);
}
if (userStatusData.statusType !== userStatusData.previousStatusType) {
CustomUserStatus.setStatusType(userStatusData._id, userStatusData.statusType);
}
Notifications.notifyLogged('updateCustomUserStatus', { userStatusData });
return true;
},
});