Name
global.DataPrivacyAttributeUtils
Description
No description available
Script
var DataPrivacyAttributeUtils = Class.create();
DataPrivacyAttributeUtils.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
MAX_USER_SOURCE_HARD_LIMIT: 1000,
LEFT_SLUSH_END_MARKER: '==END==',
USER_SOURCES: {
'sys_user': 'users',
'sys_user_group': 'groups'
},
setItemWithTableData: function() {
var jobId = this.getParameter('sysparm_job_id');
var prefix = this.getParameter('sysparm_prefix');
var rightChoiceMap = {};
var exclusionValues = '';
if (prefix == null) {
var valueReferenceTable = this.getParameter('sysparm_value_reference_table');
var currentAttrGr = this.getDpJobAttributes(jobId, valueReferenceTable);
while (currentAttrGr.next()) {
rightChoiceMap[currentAttrGr.getValue('value_reference')] = currentAttrGr['value_reference'].name;
}
} else {
var values = this.getParameter('sysparm_right_choice_values');
if (!values) {
values = '';
}
var arr = values.split(',');
for (var x in arr) {
rightChoiceMap[arr[x]] = true;
}
}
exclusionValues = (Object.keys(rightChoiceMap)).join(',');
var leftKey = this.getParameter('sysparm_leftKey');
var textField = this.getParameter('sysparm_textField');
var leftSlushRecords = this._getLeftSlushRecords(this.getParameter('sysparm_left_table'), prefix, exclusionValues);
this._populateSlushLeftRightValues(leftSlushRecords, rightChoiceMap, leftKey, textField);
},
editTargetTables: function() {
var response = {};
var values = this.getParameter('sysparm_right_choice_values');
var privacyJobId = this.getParameter('sysparm_job_id');
var valueReferenceTable = this.getParameter('sysparm_value_reference_table');
if (!privacyJobId || !valueReferenceTable) {
return this._returnErrorResponse('Invalid job parameters');
}
if (!values) {
values = '';
}
var maxUserSourceLimit = this._getMaxUserSourceLimit();
var arr = values.split(',');
// Hard limit of users being added to attribute list
if (arr.length > maxUserSourceLimit) {
return this._returnMaxUserSourceLimitError(valueReferenceTable);
}
var computedValues = this._computeAttributesToInsert(arr, privacyJobId);
var newAttributes = Object.keys(computedValues.valuesToInsert);
if (values == '' || newAttributes.length == 0) {
response.status = 'success';
return JSON.stringify(response);
}
if (computedValues.currentAttributeCount + newAttributes.length > maxUserSourceLimit) {
return this._returnMaxUserSourceLimitError(valueReferenceTable);
}
return this.insertAttributeValues(privacyJobId, valueReferenceTable, newAttributes);
},
/**
* Insert list of value references to dp_job_attribute.
*
* @param jobId sys_id of dp_job
* @param valueReferenceTable User Source table - for ex. sys_user, sys_user_group
* @param valueReferences List of references of @param valueReferenceTable
* @return JSON string of response
*/
insertAttributeValues: function(jobId, valueReferenceTable, valueReferences) {
var response = {};
if (!jobId || !valueReferenceTable || !valueReferences) {
return this._returnErrorResponse('Invalid job parameters');
}
if (valueReferences.length > this._getMaxUserSourceLimit()) {
return this._returnMaxUserSourceLimitError(valueReferenceTable);
}
var attibuteRecord = new GlideRecord('dp_job_attribute');
for (var item in valueReferences) {
attibuteRecord.newRecord();
attibuteRecord.setValue('name', 'USER_SOURCE_INPUT'); // Constant for data_privacy attributes
attibuteRecord.setValue('job_table', 'dp_job'); // Constant for data_privacy attributes
attibuteRecord.setValue('job', jobId);
attibuteRecord.setValue('value_reference_table', valueReferenceTable);
attibuteRecord.setValue('value_reference', valueReferences[item]);
attibuteRecord.insert();
}
response.status = 'success';
return JSON.stringify(response);
},
/**
* @param jobId sys_id of dp_job
* @param @nullable valueReferenceTable reference table add filter
* @return GlideRecord all attributes if @param valueReferenceTable is null
* or attributes beloning to @param valueReferenceTable
*/
getDpJobAttributes: function(jobId, valueReferenceTable) {
var gr = new GlideRecord('dp_job_attribute');
gr.addQuery('job_table', 'dp_job');
gr.addQuery('job', jobId);
if (valueReferenceTable && this.USER_SOURCES[valueReferenceTable]) {
gr.addQuery('value_reference_table', valueReferenceTable);
}
gr.query();
return gr;
},
_returnMaxUserSourceLimitError: function(userSource) {
var message = gs.getMessage("You can pick maximum {0} {1} per job.",
[this._getMaxUserSourceLimit(), this.USER_SOURCES[userSource]]);
return this._returnErrorResponse(message);
},
_returnErrorResponse: function(message) {
var response = {};
response.status = 'error';
response.message = message;
return JSON.stringify(response);
},
_getMaxUserSourceLimit: function() {
// We have a hard limit of Max - 1000 as supported by backend.
var userSetProperty = parseInt(gs.getProperty('dp.job.usersource.input.limit'));
if (isNaN(userSetProperty)) {
return this.MAX_USER_SOURCE_HARD_LIMIT;
}
return Math.min(userSetProperty, this.MAX_USER_SOURCE_HARD_LIMIT);
},
_getLeftSlushRecords: function(table, prefix, exclusionValues) {
var gr = new GlideRecord(table);
if (prefix) {
gr.addQuery('name', "STARTSWITH", prefix);
}
if (exclusionValues) {
gr.addQuery('sys_id', "NOT IN", exclusionValues);
}
gr.setLimit(this._getMaxUserSourceLimit());
gr.orderBy('name');
gr.query();
return gr;
},
_populateSlushLeftRightValues: function(leftSlushRecords, rightChoiceMap, leftKey, textField) {
var item;
while (leftSlushRecords.next()) {
if (!rightChoiceMap[leftSlushRecords.getValue(leftKey)]) {
item = this.newItem(); // Save response data in Ajax element
item.setAttribute('value', leftSlushRecords.getValue(leftKey));
item.setAttribute('text', leftSlushRecords.getValue(textField));
}
}
item = this.newItem(); // Save response data in Ajax element
item.setAttribute('value', this.LEFT_SLUSH_END_MARKER);
var keys = Object.keys(rightChoiceMap);
for (var i = 0; i < keys.length; i++) {
item = this.newItem(); // Save response data in Ajax element
item.setAttribute('value', keys[i]);
item.setAttribute('text', rightChoiceMap[keys[i]]);
}
},
_computeAttributesToInsert: function(slushRightValues, jobId) {
var valueReferenceField = 'value_reference';
var rightChoiceMap = {};
for (var i in slushRightValues) {
rightChoiceMap[slushRightValues[i]] = true;
}
var existingAttributes = this.getDpJobAttributes(jobId, null); // Get all attributes
var persistedAttributeCount = existingAttributes.getRowCount();
while (existingAttributes.next()) {
if (rightChoiceMap[existingAttributes.getValue(valueReferenceField)]) {
// Skip items which are already in attribute table
delete rightChoiceMap[existingAttributes.getValue(valueReferenceField)];
} else {
// Remove other attributes from table which are not selected by user
existingAttributes.deleteRecord();
--persistedAttributeCount;
}
}
return {
currentAttributeCount: persistedAttributeCount,
valuesToInsert: rightChoiceMap
};
},
type: 'DataPrivacyAttributeUtils'
});
Sys ID
ce39496aa3312110c1c5109246fcdacc