Name
sn_uibtk_api.APIHelper
Description
- This is meant to call into other script includes in this scope * No GlideRecord Queries should be performed in here
Script
var APIHelper = Class.create();
APIHelper.prototype = {
initialize: function( /*RESTAPIRequest*/ requsest, /*RESTAPIResponse*/ response) {
this.REQUEST = request;
this.RESPONSE = response;
},
execute: function(fn) {
try {
fn();
} catch (err) {
gs.error(`${err}\n${err.stack}`);
this.respondUnsuccessfully(BuilderToolkitConstants.ERRORS.A_ERROR_HAS_OCCURED, err, 500);
}
},
getDataByQuery: function(dataClass, encodedQuery = '', errorMessage, orderBy = false) {
const queryResult = dataClass.getRecordsByQuery(encodedQuery, orderBy);
this.getResponse(queryResult, errorMessage);
},
getResponse: function(result, errorMessage = BuilderToolkitConstants.ERRORS.A_ERROR_HAS_OCCURED) {
if (!result || (Array.isArray(result) && result.length === 0)) {
return this.respondUnsuccessfully(errorMessage);
}
this.respondSuccesfully(result);
},
getResponseGlideOperation: function(operationResult, errorMessage = BuilderToolkitConstants.ERRORS.A_ERROR_HAS_OCCURED) {
if (operationResult.error) {
return this.respondUnsuccessfully(errorMessage, operationResult.reason);
}
this.respondSuccesfully({
sysId: operationResult
});
},
getResponseFromMutliOperation: function(resultObject) {
const results = Object.values(resultObject);
const allSucceeded = results.every(this.didOperationSucceed.bind(this));
const someSucceeded = results.some(this.didOperationSucceed.bind(this));
if (allSucceeded) {
return this.respondSuccesfully(resultObject);
} else if (someSucceeded) {
this.respondSuccesfully(Object.entries(resultObject).reduce(this.getReducedOperationMessage.bind(this), {}), 207);
} else {
this.respondUnsuccessfully(BuilderToolkitConstants.A_ERROR_HAS_OCCURED, resultObject);
}
},
getQueryParam: function(paramName, defaultValue = null) {
return this.REQUEST.queryParams[paramName] ?? defaultValue;
},
getBodyParam: function(key, defaultValue = null) {
return this.REQUEST.body.data[key] ?? defaultValue;
},
respondSuccesfully: function(body = {}, status = 200) {
this.RESPONSE.setContentType('application/json');
this.RESPONSE.setStatus(status);
this.RESPONSE.setBody(body);
},
respondUnsuccessfully: function(message = '', details = '', status = 400) {
this.RESPONSE.setError(
new sn_ws_err.ServiceError()
.setStatus(status)
.setMessage(message)
.setDetail(details)
);
},
didOperationSucceed: function(value) {
if (typeof value === 'boolean' || typeof value === 'string') {
return true;
}
if (Array.isArray(value)) {
return value.every(this.didOperationSucceed);
}
return false;
},
getReducedOperationMessage: function(acc, [key, value]) {
if (Array.isArray(value)) {
acc[key] = value.map(this.getOperationMessage);
} else {
acc[key] = this.getOperationMessage(value)
}
return acc;
},
getOperationMessage: function(value) {
const error = value?.error ?? false;
const reason = value?.reason ?? '';
return {
status: error ? 400 : 200,
value: error ? reason : value
};
},
// -------------------
// HELPERS
// -------------------
/**
* @param message {string} the message we want to log
* @param prefix {string} the prefix for the log message to find it easier
*/
_logMessage: function(message, prefix) {
prefix = prefix || this.type;
gs.info('{0}\n\n{1}', prefix, message);
},
/**
* @param messageObj {JSON} the JSON object or array we want to log
* @param prefix {string} the prefix for the log message to find it easier
*/
_logJSON: function(messageObj, prefix) {
this._logMessage(JSON.stringify(messageObj, null, 4), prefix);
},
type: 'APIHelper'
};
Sys ID
ae72f2687c2f1110f87754eb73ab0086