'use strict';
var QueryString = require('./queryString');
var SimpleCache = require('./simpleCache');
/**
* Translates global session object into local object
* @param {dw.session} session - Global customer object
* @returns {Object} local instance of session object
*/
function getSessionObject(session) {
var sessionObject = {
privacyCache: new SimpleCache(session.privacy),
raw: session,
currency: {
currencyCode: session.currency.currencyCode,
defaultFractionDigits: session.currency.defaultFractionDigits,
name: session.currency.name,
symbol: session.currency.symbol
},
setCurrency: function (value) {
session.setCurrency(value);
}
};
Object.defineProperty(sessionObject, 'clickStream', {
get: function () {
var clickStreamEntries = session.clickStream.clicks.toArray();
var clicks = clickStreamEntries.map(function (clickObj) {
return {
host: clickObj.host,
locale: clickObj.locale,
path: clickObj.path,
pipelineName: clickObj.pipelineName,
queryString: clickObj.queryString,
referer: clickObj.referer,
remoteAddress: clickObj.remoteAddress,
timestamp: clickObj.timestamp,
url: clickObj.url,
userAgent: clickObj.userAgent
};
});
return {
clicks: clicks,
first: clicks[0],
last: clicks[clicks.length - 1],
partial: session.clickStream.partial
};
}
});
return sessionObject;
}
/**
*
* Retrieves and normalizes form data from httpParameterMap
* @param {dw.web.httpParameterMap} items - original parameters
* @param {Object} qs - Object containing querystring
* @return {Object} Object containing key value pairs submitted from the form
*/
function getFormData(items, qs) {
if (!items || !items.parameterNames) {
return {};
}
var allKeys = items.parameterNames;
var result = {};
if (allKeys.length > 0) {
var iterator = allKeys.iterator();
while (iterator.hasNext()) {
var key = iterator.next();
var value = items.get(key);
if (value.rawValue && !qs[key]) {
result[key] = value.rawValue;
}
}
}
return result;
}
/**
* Retrieves session locale info
*
* @param {string} locale - Session locale code, xx_XX
* @param {dw.util.Currency} currency - Session currency
* @return {Object} - Session locale info
*/
function getCurrentLocale(locale, currency) {
return {
id: locale,
currency: {
currencyCode: currency.currencyCode,
defaultFractionDigits: currency.defaultFractionDigits,
name: currency.name,
symbol: currency.symbol
}
};
}
/**
* Translates global customer's preferredAddress into local object
* @param {Object} address - a CustomerAddress or OrderAddress
* @returns {Object} local instance of address object
*/
function getAddressObject(address) {
var addressObject = null;
if (address) {
addressObject = {
address1: address.address1,
address2: address.address2,
city: address.city,
companyName: address.companyName,
countryCode: {
displayValue: address.countryCode.displayValue,
value: address.countryCode.value
},
firstName: address.firstName,
lastName: address.lastName,
ID: address.ID,
phone: address.phone,
postalCode: address.postalCode,
stateCode: address.stateCode,
postBox: address.postBox,
salutation: address.salutation,
secondName: address.secondName,
suffix: address.suffix,
suite: address.suite,
title: address.title,
raw: address
};
}
return addressObject;
}
/**
* Creates a list of payment instruments for the current user
* @param {Array} rawPaymentInstruments - current customer's payment instruments
* @returns {Array} an array of payment instruments
*/
function getPaymentInstruments(rawPaymentInstruments) {
var paymentInstruments = [];
if (rawPaymentInstruments.getLength() > 0) {
var iterator = rawPaymentInstruments.iterator();
while (iterator.hasNext()) {
var item = iterator.next();
paymentInstruments.push({
creditCardHolder: item.creditCardHolder,
maskedCreditCardNumber: item.maskedCreditCardNumber,
creditCardType: item.creditCardType,
creditCardExpirationMonth: item.creditCardExpirationMonth,
creditCardExpirationYear: item.creditCardExpirationYear,
UUID: item.UUID,
creditCardNumber: Object.hasOwnProperty.call(item, 'creditCardNumber')
? item.creditCardNumber
: null,
raw: item
});
}
}
return paymentInstruments;
}
/**
* Translates global customer object into local object
* @param {dw.customer.Customer} customer - Global customer object
* @returns {Object} local instance of customer object
*/
function getCustomerObject(customer) {
if (!customer || !customer.profile) {
return {
raw: customer
};
}
if (!customer.authenticated) {
return {
raw: customer,
credentials: {
username: customer.profile.credentials.login
}
};
}
var preferredAddress = customer.addressBook.preferredAddress;
var result;
result = {
raw: customer,
profile: {
lastName: customer.profile.lastName,
firstName: customer.profile.firstName,
email: customer.profile.email,
phone: customer.profile.phoneHome,
customerNo: customer.profile.customerNo
},
addressBook: {
preferredAddress: getAddressObject(preferredAddress),
addresses: []
},
wallet: {
paymentInstruments: getPaymentInstruments(customer.profile.wallet.paymentInstruments)
}
};
if (customer.addressBook.addresses && customer.addressBook.addresses.length > 0) {
for (var i = 0, ii = customer.addressBook.addresses.length; i < ii; i++) {
result.addressBook.addresses.push(getAddressObject(customer.addressBook.addresses[i]));
}
}
return result;
}
/**
* set currency of the current locale if there's a mismatch
* @param {Object} request - Global request object
* @param {dw.system.Session} session - Global session object
*/
function setCurrency(request, session) {
var Locale = require('dw/util/Locale');
var currency = require('dw/util/Currency');
var countries = require('*/cartridge/config/countries');
var currentLocale = Locale.getLocale(request.locale);
var currentCountry = !currentLocale
? countries[0]
: countries.filter(function (country) {
return country.id === currentLocale.ID;
})[0];
if (session.currency
&& currentCountry
&& session.currency.currencyCode !== currentCountry.currencyCode
&& (!currentCountry.alternativeCurrencyCodes
|| currentCountry.alternativeCurrencyCodes.indexOf(session.currency.currencyCode) < 0
)
) {
session.setCurrency(currency.getCurrency(currentCountry.currencyCode));
}
}
/**
* get a local instance of the geo location object
* @param {Object} request - Global request object
* @returns {Object} object containing geo location information
*/
function getGeolocationObject(request) {
var Locale = require('dw/util/Locale');
var currentLocale = Locale.getLocale(request.locale);
return {
countryCode: request.geolocation ? request.geolocation.countryCode : currentLocale.country,
latitude: request.geolocation ? request.geolocation.latitude : 90.0000,
longitude: request.geolocation ? request.geolocation.longitude : 0.0000
};
}
/**
* Get request body as string if it is a POST or PUT
* @param {Object} request - Global request object
* @returns {string|Null} the request body as string
*/
function getRequestBodyAsString(request) {
var result = null;
if (request
&& (request.httpMethod === 'POST' || request.httpMethod === 'PUT')
&& request.httpParameterMap
) {
result = request.httpParameterMap.requestBodyAsString;
}
return result;
}
/**
* Get a local instance of the pageMetaData object
* @param {Object} pageMetaData - Global request pageMetaData object
* @returns {Object} object containing pageMetaData information
*/
function getPageMetaData(pageMetaData) {
var pageMetaDataObject = {
title: pageMetaData.title,
description: pageMetaData.description,
keywords: pageMetaData.keywords,
pageMetaTags: pageMetaData.pageMetaTags,
addPageMetaTags: function (pageMetaTags) {
pageMetaData.addPageMetaTags(pageMetaTags);
},
setTitle: function (title) {
pageMetaData.setTitle(title);
},
setDescription: function (description) {
pageMetaData.setDescription(description);
},
setKeywords: function (keywords) {
pageMetaData.setKeywords(keywords);
}
};
return pageMetaDataObject;
}
/**
* @constructor
* @classdesc Local instance of request object with customer object in it
*
* Translates global request and customer object to local one
* @param {Object} request - Global request object
* @param {dw.customer.Customer} customer - Global customer object
* @param {dw.system.Session} session - Global session object
*/
function Request(request, customer, session) {
// Avoid currency check for remote includes
if (!request.includeRequest) {
setCurrency(request, session);
}
this.httpMethod = request.httpMethod;
this.host = request.httpHost;
this.path = request.httpPath;
this.httpHeaders = request.httpHeaders;
this.https = request.isHttpSecure();
this.includeRequest = request.includeRequest;
this.setLocale = function (localeID) {
return request.setLocale(localeID);
};
Object.defineProperty(this, 'session', {
get: function () {
return getSessionObject(session);
}
});
Object.defineProperty(this, 'httpParameterMap', {
get: function () {
return request.httpParameterMap;
}
});
Object.defineProperty(this, 'querystring', {
get: function () {
return new QueryString(request.httpQueryString);
}
});
Object.defineProperty(this, 'form', {
get: function () {
return getFormData(request.httpParameterMap, this.querystring);
}
});
Object.defineProperty(this, 'body', {
get: function () {
return getRequestBodyAsString(request);
}
});
Object.defineProperty(this, 'geolocation', {
get: function () {
return getGeolocationObject(request);
}
});
Object.defineProperty(this, 'currentCustomer', {
get: function () {
return getCustomerObject(customer);
}
});
Object.defineProperty(this, 'locale', {
get: function () {
return getCurrentLocale(request.locale, session.currency);
}
});
Object.defineProperty(this, 'remoteAddress', {
get: function () {
return request.getHttpRemoteAddress();
}
});
Object.defineProperty(this, 'referer', {
get: function () {
return request.getHttpReferer();
}
});
Object.defineProperty(this, 'pageMetaData', {
get: function () {
return getPageMetaData(request.pageMetaData);
}
});
}
module.exports = Request;