Name
global.NotificationPreferencesAjax
Description
No description available
Script
var NotificationPreferencesAjax = Class.create();
NotificationPreferencesAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {
preferences: {},
devices: [],
existingPreferences: {},
tableReadRules: {},
gatherNotifPreferenceData: function(userId, notification) {
this.isLegacy = gs.getProperty("glide.notification.use_legacy_subscription_model", false);
this.showAdvanced = gs.getProperty("glide.notification.show_advanced_notif_message_fields", true);
this.hideInactiveDevices = gs.getProperty("glide.notification.hide_inactive_devices", false);
var data = {
"devices" : this.gatherDevices(userId),
"notifications" : this.gatherNotifications(),
"subscriptions" : this.gatherSubscriptions(userId),
"show_advanced" : this.showAdvanced,
"isExpressInstance" : this.isExpressInstance(),
"notification" : this.getNotificationData(notification),
"showSpecificSubscriptions" : this.shouldShowSpecificSubscriptions(notification),
"registeredPushMsgNotifs" : this.getNotificationsFilteredByRegisteredPushMessage(userId)
};
var json = new JSON();
return json.encode(data);
},
gatherNotifPreferenceDataAjax: function() {
return this.gatherNotifPreferenceData(this.getParameter("sysparm_user"),
this.getParameter("sysparm_action"),
this.getParameter("sysparm_notification"));
},
isExpressInstance: function() {
return GlideUtil.isExpressInstance();
},
gatherSubscriptions: function(userId) {
var subscriptions = [];
if (this.isLegacy == "true")
return;
var gr = new GlideRecord("sys_notif_subscription");
if (!gr.isValid())
return;
gr.addQuery("user", userId);
gr.query();
while (gr.next()) {
if (!gr.canRead())
continue;
var canPush = JSUtil.nil(gr.notification.message_list);
var tableLabel = gs.getMessage("No Table");
if (gr.notification.collection) {
var table = GlideTableDescriptor.get(gr.notification.collection);
tableLabel = table.getLabel();
if (tableLabel == "label")
tableLabel = gs.getMessage("No Table");
}
subscriptions.push({
"devices": gr.devices + "",
"active" : gr.active+ "",
"sys_id" : gr.sys_id + "",
"notification" : gr.notification + "",
"notificationName" : gr.notification.name + "",
"conditions" : gr.condition + "",
"name" : GlideStringUtil.escapeHTML(gr.name) + "",
"table" : GlideStringUtil.escapeHTML(tableLabel) + "",
"canPush" : (!JSUtil.nil(gr.notification.message_list)) + "",
"push_only" : gr.notification.push_message_only.toString(),
"subscribable" : gr.notification.subscribable.toString()
});
if (gr.filter != "" || gr.schedule != "")
this.showAdvanced = true;
}
return subscriptions;
},
gatherDevices: function(userId) {
var gr = new GlideRecord("cmn_notif_device");
gr.addQuery("user", userId);
if (this.hideInactiveDevices == "true")
gr.addQuery("active", true);
gr.orderByDesc("primary_email");
gr.query();
while (gr.next()) {
if (!gr.canRead())
continue;
this.devices.push({
notifications : {},
sys_id : gr.sys_id.toString(),
name : GlideStringUtil.escapeHTML(gr.name) + "",
primary_email : gr.primary_email.toString(),
type : gr.type.toString(),
active: gr.active.toString()
});
}
this.gatherDevicePreferences();
return JSON.stringify(this.devices);
},
gatherDevicePreferences: function() {
for (var i = 0; i < this.devices.length; i++) {
var gr = new GlideRecord("cmn_notif_message");
gr.query("device", this.devices[i].sys_id);
while (gr.next()) {
if (!gr.canRead())
continue;
this.devices[i].notifications[gr.notification] = {
"subscribed" : gr.notification_filter == 'c1bfa4040a0a0b8b001eeb0f3f5ee961'? false : true,
"sys_id" : gr.sys_id.toString()
};
this.existingPreferences[gr.notification.toString()] = true;
}
}
},
gatherNotifications: function() {
var gr = new GlideRecord("sysevent_email_action");
gr.addActiveQuery();
gr.orderBy("name");
gr.query();
while (gr.next()) {
if (!gr.canRead())
continue;
var tableLabel = gs.getMessage("No Table");
if (gr.collection) {
if (!this.canReadTable(gr.collection) && !this.existingPreferences[gr.sys_id.toString()])
continue;
var table = new GlideTableDescriptor.get(gr.collection);
tableLabel = table.getLabel();
if (tableLabel == "label")
tableLabel = gs.getMessage("No Table");
}
this.preferences[gr.sys_id] = {
"name" : GlideStringUtil.escapeHTML(gr.name) + "",
"mandatory" : gr.mandatory.toString(),
"push_only" : gr.push_message_only.toString(),
"canPush" : (!JSUtil.nil(gr.message_list)) + "",
"table" : tableLabel
};
}
return this.preferences;
},
getNotificationsFilteredByRegisteredPushMessage: function(userId) {
// Ensure PushMessageQualifier is a function before using it
// This is necessary only during upgrades while the push plugin is not yet active
if (typeof PushMessageQualifier !== 'function')
return;
var pushQual = new PushMessageQualifier();
var filteredNotifs = [];
var gr = new GlideRecord("cmn_notif_device");
gr.addQuery('user',userId);
gr.addActiveQuery();
gr.query();
while(gr.next()) {
if (!gr.canRead())
continue;
var pushMsgIds = pushQual.getPushApplicationPushMessages(gr.push_app);
var notifIds = pushQual.getRawNotificationList(pushMsgIds);
filteredNotifs.push({"device_sys_id":gr.getUniqueValue(),"notification_sys_id":notifIds});
}
return filteredNotifs;
},
getNotificationData: function(notificationId) {
if (!notificationId) {
// No data to get if there is no id to check
return "";
}
var gr = new GlideRecord("sysevent_email_action");
if (!gr.get(notificationId)) {
gs.warn("Attempt to find notification preferences for non-existant " +
"sysevent_email_action: '" + notificationId + "' failed");
return "";
}
if (!gr.canRead())
return "";
return {
"sys_id" : notificationId,
"name" : gr.getValue("name")
};
},
shouldShowSpecificSubscriptions: function(notificationId) {
if (!notificationId) {
// No subscription to get if there is no notification
return false;
}
// Return "true" if this user has at least one subscription
// for this notification
var gr = new GlideRecord("sys_notif_subscription");
gr.addQuery("notification", notificationId);
gr.addQuery("user", gs.getUserID());
gr.query();
return gr.hasNext();
},
/*
* See if user has read access to the table, keep the results so we don't have to redo the canRead() as it is expensive
*
*/
canReadTable: function(table) {
if (this.tableReadRules[table])
return this.tableReadRules[table] == "true";
var gr = new GlideRecord(table);
if (gr.isValid()) {
if(gr.canRead()) {
this.tableReadRules[table] = "true";
return true;
}
}
// Enterprise wants Notifications for invalid tables to go to "No Table"
else if (!GlideUtil.isExpressInstance()) {
this.tableReadRules[table] = "true";
return true;
}
this.tableReadRules[table] = "false";
return false;
},
type: 'NotificationPreferencesAjax'
});
Sys ID
b7b1cf91ff1302002841ffffffffff00