Name

global.SNHelpDBController

Description

SN Help DB Controller for managing all GlideRecord Queries

Script

var SNHelpDBController = Class.create();
SNHelpDBController.prototype = {
  INVALID_TABLE : "SNHelpDBController: {0} is not a valid table",
  CREATE_ERROR : "SNHelpDBController: Error Creating record in {0} table",
  RECORD_NOT_FOUND : "SNHelpDBController: No record found with sys_id - {0}",
  UPDATE_ERROR : "SNHelpDBController: Error Updating record in {0} table",
  INVALID_SYS_ID : "SNHelpDBController: Invalid sys_id - {0}",

  initialize: function(table) {
  	this.table = table;
  	this.constants = new SNHelpConstantProvider();
  },
  
  create: function(params) {
  	var gr = new GlideRecord(this.table);

  	if(!this._isValidTable(gr))
  		return;
  	
  	gr.initialize();
  	this._setFieldsData(gr, params);
  	var sys_id = gr.insert();
  	if(sys_id)
  		return sys_id;
  	else
  		gs.error(this.CREATE_ERROR, this.table);
  },
  update: function(sys_id, params) {
  	var gr = new GlideRecord(this.table);

  	if(!this._isValidSysId(sys_id) || !this._isValidTable(gr) || !this._isValidRecord(gr, sys_id))
  		return;
  	
  	this._setFieldsData(gr, params);
  	
  	sys_id = gr.update();
  	if(sys_id) 
  		return sys_id;
  	else 
  		gs.error(this.UPDATE_ERROR, this.table);
  },
  
  getById: function(sys_id, fields) {
  	var gr = new GlideRecord(this.table);

  	if(!this._isValidSysId(sys_id) || !this._isValidTable(gr) || !this._isValidRecord(gr, sys_id))
  		return null;
  	
  	if(this.skipACLCheck() || gr.canRead())
  		return this._getFieldsData(gr, fields);
  	else
  		return null;
  },
  
  getByEncodedQuery: function(queryString, orderBy, fields) {
  	var gr = new GlideRecord(this.table);

  	if(!this._isValidTable(gr))
  		return;
  	
  	if(orderBy && gr.isValidField(orderBy))
  		gr.orderBy(orderBy);
  	gr.addEncodedQuery(queryString);
  	gr.query();
  	
  	var result = [];
  	
  	while (gr.next()) {
  		if(this.skipACLCheck() || gr.canRead())
  			result.push(this._getFieldsData(gr, fields));
  	}
  	return result;
  },

  _isValidTable: function(gr) {
  	if(!gr.isValid()) {
  		gs.error(this.INVALID_TABLE, this.table);
  		return false;
  	}
  	return true;
  },

  _isValidSysId: function(sys_id) {
  	if(!GlideStringUtil.isEligibleSysID(sys_id)) {
  		gs.error(this.INVALID_SYS_ID, sys_id);
  		return false;
  	}
  	return true;
  },

  _isValidRecord: function(gr, sys_id) {
  	var exist = gr.get(sys_id);
  	if(!exist) {
  		gs.error(this.RECORD_NOT_FOUND, sys_id);
  		return false;
  	}
  	return true;
  },

  _setFieldsData: function(gr, params) {
  	var keys = Object.keys(params);
  	var glideElement;
  	var internalType;
  	
  	for(var i = 0; i < keys.length; i++) {
  		if(!gr.isValidField(keys[i]))
  			continue;
  		glideElement = gr.getElement(keys[i]);
  		internalType = glideElement.getED().getInternalType();
  		if(internalType === "translated_html" || internalType === "translated_text") {
  			glideElement.setDisplayValue(params[keys[i]]);
  		} else 
  			glideElement.setValue(params[keys[i]]);
  	}
  },

  _getFieldsData: function(gr, fields) {
  	var gRU = new GlideRecordUtil();
  	
  	if(!(Array.isArray(fields) && fields.length > 0))
  		fields = gRU.getFields(gr);
  	
  	var result = {};
  	var glideElement;
  	var descriptor;
  	for(var i = 0; i < fields.length; i++) {
  		
  		if(!gr.isValidField(fields[i]))
  			continue;
  		
  		glideElement = gr.getElement(fields[i]);
  		descriptor = glideElement.getED();
  		// strict equality operator is not working ===
  		if(descriptor.getInternalType() == 'user_image' || descriptor.getInternalType() == 'translated_html' || descriptor.getInternalType() == 'translated_text')
  			result[glideElement.getName()] = glideElement.getDisplayValue();
  		else if (descriptor.getInternalType() == "simple_name_values"){
  			var el = JSON.parse(glideElement.getDisplayValue());
  			for(key in el)
  				el[key] = gs.getMessage(el[key]);
  			result[glideElement.getName()] = JSON.stringify(el);
  		}
  		else
  			result[glideElement.getName()] = glideElement + "";
  	}
  	return result;
  },
  // Skip checking Read ACL on help_content and embedded_help_content table
  skipACLCheck : function() {
  	if(this.table === this.constants.tables.content || this.table === this.constants.tables.eh_content)
  		return true;
  	return false;
  },

  type: 'SNHelpDBController'
};

Sys ID

f59ea0005344101065f2ddeeff7b1226

Offical Documentation

Official Docs: