'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;