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/push-notifications/server/methods/saveNotificationSettings.js

84 lines
3.6 KiB

import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import { Subscriptions } from '../../../models/server';
import { getUserNotificationPreference } from '../../../utils/server';
const saveAudioNotificationValue = (subId, value) => (value === 'default'
? Subscriptions.clearAudioNotificationValueById(subId)
: Subscriptions.updateAudioNotificationValueById(subId, value));
Meteor.methods({
saveNotificationSettings(roomId, field, value) {
if (!Meteor.userId()) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'saveNotificationSettings' });
}
check(roomId, String);
check(field, String);
check(value, String);
const getNotificationPrefValue = (field, value) => {
if (value === 'default') {
const userPref = getUserNotificationPreference(Meteor.userId(), field);
return userPref.origin === 'server' ? null : userPref;
}
return { value, origin: 'subscription' };
};
const notifications = {
desktopNotifications: {
updateMethod: (subscription, value) => Subscriptions.updateNotificationsPrefById(subscription._id, getNotificationPrefValue('desktop', value), 'desktopNotifications', 'desktopPrefOrigin'),
},
mobilePushNotifications: {
updateMethod: (subscription, value) => Subscriptions.updateNotificationsPrefById(subscription._id, getNotificationPrefValue('mobile', value), 'mobilePushNotifications', 'mobilePrefOrigin'),
},
emailNotifications: {
updateMethod: (subscription, value) => Subscriptions.updateNotificationsPrefById(subscription._id, getNotificationPrefValue('email', value), 'emailNotifications', 'emailPrefOrigin'),
},
unreadAlert: {
updateMethod: (subscription, value) => Subscriptions.updateUnreadAlertById(subscription._id, value),
},
disableNotifications: {
updateMethod: (subscription, value) => Subscriptions.updateDisableNotificationsById(subscription._id, value === '1'),
},
hideUnreadStatus: {
updateMethod: (subscription, value) => Subscriptions.updateHideUnreadStatusById(subscription._id, value === '1'),
},
muteGroupMentions: {
updateMethod: (subscription, value) => Subscriptions.updateMuteGroupMentions(subscription._id, value === '1'),
},
audioNotificationValue: {
updateMethod: (subscription, value) => saveAudioNotificationValue(subscription._id, value),
},
};
const isInvalidNotification = !Object.keys(notifications).includes(field);
const basicValuesForNotifications = ['all', 'mentions', 'nothing', 'default'];
const fieldsMustHaveBasicValues = ['emailNotifications', 'mobilePushNotifications', 'desktopNotifications'];
if (isInvalidNotification) {
throw new Meteor.Error('error-invalid-settings', 'Invalid settings field', { method: 'saveNotificationSettings' });
}
if (fieldsMustHaveBasicValues.includes(field) && !basicValuesForNotifications.includes(value)) {
throw new Meteor.Error('error-invalid-settings', 'Invalid settings value', { method: 'saveNotificationSettings' });
}
const subscription = Subscriptions.findOneByRoomIdAndUserId(roomId, Meteor.userId());
if (!subscription) {
throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'saveNotificationSettings' });
}
notifications[field].updateMethod(subscription, value);
return true;
},
saveAudioNotificationValue(rid, value) {
const subscription = Subscriptions.findOneByRoomIdAndUserId(rid, Meteor.userId());
if (!subscription) {
throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'saveAudioNotificationValue' });
}
saveAudioNotificationValue(subscription._id, value);
return true;
},
});