195 lines
5.7 KiB
JavaScript
195 lines
5.7 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var assign = require('./assign');
|
||
|
var httpHeadersConfig = require('*/cartridge/config/httpHeadersConf');
|
||
|
|
||
|
/**
|
||
|
* @constructor
|
||
|
* @classdesc Creates writtable response object
|
||
|
*
|
||
|
* @param {Object} response - Global response object
|
||
|
*/
|
||
|
function Response(response) {
|
||
|
this.view = null;
|
||
|
this.viewData = {};
|
||
|
this.redirectUrl = null;
|
||
|
this.redirectStatus = null;
|
||
|
this.messageLog = [];
|
||
|
this.base = response;
|
||
|
this.cachePeriod = null;
|
||
|
this.cachePeriodUnit = null;
|
||
|
this.personalized = false;
|
||
|
this.renderings = [];
|
||
|
httpHeadersConfig.forEach(function (httpHeader) {
|
||
|
this.setHttpHeader(httpHeader.id, httpHeader.value);
|
||
|
}, this);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stores a list of rendering steps.
|
||
|
* @param {Array} renderings - The array of rendering steps
|
||
|
* @param {Object} object - An object containing what type to render
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
function appendRenderings(renderings, object) {
|
||
|
var hasRendering = false;
|
||
|
|
||
|
if (renderings.length) {
|
||
|
for (var i = renderings.length - 1; i >= 0; i--) {
|
||
|
if (renderings[i].type === 'render') {
|
||
|
renderings[i] = object; // eslint-disable-line no-param-reassign
|
||
|
hasRendering = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!hasRendering) {
|
||
|
renderings.push(object);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Response.prototype = {
|
||
|
/**
|
||
|
* Stores template name and data for rendering at the later time
|
||
|
* @param {string} name - Path to a template
|
||
|
* @param {Object} data - Data to be passed to the template
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
render: function render(name, data) {
|
||
|
this.view = name;
|
||
|
this.viewData = assign(this.viewData, data);
|
||
|
|
||
|
appendRenderings(this.renderings, { type: 'render', subType: 'isml', view: name });
|
||
|
},
|
||
|
/**
|
||
|
* Stores data to be rendered as json
|
||
|
* @param {Object} data - Data to be rendered as json
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
json: function json(data) {
|
||
|
this.isJson = true;
|
||
|
this.viewData = assign(this.viewData, data);
|
||
|
|
||
|
appendRenderings(this.renderings, { type: 'render', subType: 'json' });
|
||
|
},
|
||
|
/**
|
||
|
* Stores data to be rendered as XML
|
||
|
* @param {string} xmlString - The XML to print.
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
xml: function xml(xmlString) {
|
||
|
this.isXml = true;
|
||
|
this.viewData = assign(this.viewData, { xml: xmlString });
|
||
|
|
||
|
appendRenderings(this.renderings, { type: 'render', subType: 'xml' });
|
||
|
},
|
||
|
/**
|
||
|
* Stores data to be rendered as a page designer page
|
||
|
* @param {string} page - ID of the page to be rendered
|
||
|
* @param {Object} data - Data to be passed to the template
|
||
|
* @param {dw.util.HashMap} aspectAttributes - (optional) aspect attributes to be passed to the PageMgr
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
page: function (page, data, aspectAttributes) {
|
||
|
this.viewData = assign(this.viewData, data);
|
||
|
appendRenderings(this.renderings, { type: 'render', subType: 'page', page: page, aspectAttributes: aspectAttributes });
|
||
|
},
|
||
|
/**
|
||
|
* Redirects to a given url right away
|
||
|
* @param {string} url - Url to be redirected to
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
redirect: function redirect(url) {
|
||
|
this.redirectUrl = url;
|
||
|
},
|
||
|
/**
|
||
|
* Sets an optional redirect status, standard cases being 301 or 302.
|
||
|
* @param {string} redirectStatus - HTTP redirect status code
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
setRedirectStatus: function setRedirectStatus(redirectStatus) {
|
||
|
this.redirectStatus = redirectStatus;
|
||
|
},
|
||
|
/**
|
||
|
* Get data that was setup for a template
|
||
|
* @returns {Object} Data for the template
|
||
|
*/
|
||
|
getViewData: function () {
|
||
|
return this.viewData;
|
||
|
},
|
||
|
/**
|
||
|
* Updates data for the template
|
||
|
* @param {Object} data - Data for template
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
setViewData: function (data) {
|
||
|
this.viewData = assign(this.viewData, data);
|
||
|
},
|
||
|
/**
|
||
|
* Logs information for output on the error page
|
||
|
* @param {string[]} arguments - List of items to be logged
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
log: function log() {
|
||
|
var args = Array.prototype.slice.call(arguments);
|
||
|
|
||
|
var output = args.map(function (item) {
|
||
|
if (typeof item === 'object' || Array.isArray(item)) {
|
||
|
return JSON.stringify(item);
|
||
|
}
|
||
|
return item;
|
||
|
});
|
||
|
|
||
|
this.messageLog.push(output.join(' '));
|
||
|
},
|
||
|
/**
|
||
|
* Set content type for the output
|
||
|
* @param {string} type - Type of the output
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
setContentType: function setContentType(type) {
|
||
|
this.base.setContentType(type);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Set status code of the response
|
||
|
* @param {int} code - Valid HTTP return code
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
setStatusCode: function setStatusCode(code) {
|
||
|
this.base.setStatus(code);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* creates a print step to the renderings
|
||
|
* @param {string} message - Message to be printed
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
print: function print(message) {
|
||
|
this.renderings.push({ type: 'print', message: message });
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Sets current page cache expiration period value in hours
|
||
|
* @param {int} period Number of hours from current time
|
||
|
* @return {void}
|
||
|
*/
|
||
|
cacheExpiration: function cacheExpiration(period) {
|
||
|
this.cachePeriod = period;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Adds a response header with the given name and value
|
||
|
* @param {string} name - the name to use for the response header
|
||
|
* @param {string} value - the value to use
|
||
|
* @return {void}
|
||
|
*/
|
||
|
setHttpHeader: function setHttpHeader(name, value) {
|
||
|
this.base.setHttpHeader(name, value);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
module.exports = Response;
|