'use strict';
/**
* @namespace Address
*/
var server = require('server');
var URLUtils = require('dw/web/URLUtils');
var Resource = require('dw/web/Resource');
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
var userLoggedIn = require('*/cartridge/scripts/middleware/userLoggedIn');
var consentTracking = require('*/cartridge/scripts/middleware/consentTracking');
/**
* Creates a list of address model for the logged in user
* @param {string} customerNo - customer number of the current customer
* @returns {List} a plain list of objects of the current customer's addresses
*/
function getList(customerNo) {
var CustomerMgr = require('dw/customer/CustomerMgr');
var AddressModel = require('*/cartridge/models/address');
var collections = require('*/cartridge/scripts/util/collections');
var customer = CustomerMgr.getCustomerByCustomerNumber(customerNo);
var rawAddressBook = customer.addressBook.getAddresses();
var addressBook = collections.map(rawAddressBook, function (rawAddress) {
var addressModel = new AddressModel(rawAddress);
addressModel.address.UUID = rawAddress.UUID;
return addressModel;
});
return addressBook;
}
/**
* Address-List : Used to show a list of address created by a registered shopper
* @name Base/Address-List
* @function
* @memberof Address
* @param {middleware} - userLoggedIn.validateLoggedIn
* @param {middleware} - consentTracking.consent
* @param {category} - sensitive
* @param {renders} - isml
* @param {serverfunction} - get
*/
server.get('List', userLoggedIn.validateLoggedIn, consentTracking.consent, function (req, res, next) {
var actionUrls = {
deleteActionUrl: URLUtils.url('Address-DeleteAddress').toString(),
listActionUrl: URLUtils.url('Address-List').toString()
};
res.render('account/addressBook', {
addressBook: getList(req.currentCustomer.profile.customerNo),
actionUrls: actionUrls,
breadcrumbs: [
{
htmlValue: Resource.msg('global.home', 'common', null),
url: URLUtils.home().toString()
},
{
htmlValue: Resource.msg('page.title.myaccount', 'account', null),
url: URLUtils.url('Account-Show').toString()
}
]
});
next();
});
/**
* Address-AddAddress : A link to a page to create a new address
* @name Base/Address-AddAddress
* @function
* @memberof Address
* @param {middleware} - csrfProtection.generateToken
* @param {middleware} - consentTracking.consent
* @param {middleware} - userLoggedIn.validateLoggedIn
* @param {category} - sensitive
* @param {renders} - isml
* @param {serverfunction} - get
*/
server.get(
'AddAddress',
csrfProtection.generateToken,
consentTracking.consent,
userLoggedIn.validateLoggedIn,
function (req, res, next) {
var addressForm = server.forms.getForm('address');
addressForm.clear();
res.render('account/editAddAddress', {
addressForm: addressForm,
breadcrumbs: [
{
htmlValue: Resource.msg('global.home', 'common', null),
url: URLUtils.home().toString()
},
{
htmlValue: Resource.msg('page.title.myaccount', 'account', null),
url: URLUtils.url('Account-Show').toString()
},
{
htmlValue: Resource.msg('label.addressbook', 'account', null),
url: URLUtils.url('Address-List').toString()
}
]
});
next();
}
);
/**
* Address-EditAddress : A link to edit and existing address
* @name Base/Address-EditAddress
* @function
* @memberof Address
* @param {middleware} - csrfProtection.generateToken
* @param {middleware} - userLoggedIn.validateLoggedIn
* @param {middleware} - consentTracking.consent
* @param {querystringparameter} - addressId - a string used to identify the address record
* @param {category} - sensitive
* @param {renders} - isml
* @param {serverfunction} - get
*/
server.get(
'EditAddress',
csrfProtection.generateToken,
userLoggedIn.validateLoggedIn,
consentTracking.consent,
function (req, res, next) {
var CustomerMgr = require('dw/customer/CustomerMgr');
var AddressModel = require('*/cartridge/models/address');
var addressId = req.querystring.addressId;
var customer = CustomerMgr.getCustomerByCustomerNumber(
req.currentCustomer.profile.customerNo
);
var addressBook = customer.getProfile().getAddressBook();
var rawAddress = addressBook.getAddress(addressId);
var addressModel = new AddressModel(rawAddress);
var addressForm = server.forms.getForm('address');
addressForm.clear();
addressForm.copyFrom(addressModel.address);
res.render('account/editAddAddress', {
addressForm: addressForm,
addressId: addressId,
breadcrumbs: [
{
htmlValue: Resource.msg('global.home', 'common', null),
url: URLUtils.home().toString()
},
{
htmlValue: Resource.msg('page.title.myaccount', 'account', null),
url: URLUtils.url('Account-Show').toString()
},
{
htmlValue: Resource.msg('label.addressbook', 'account', null),
url: URLUtils.url('Address-List').toString()
}
]
});
next();
}
);
/**
* Address-SaveAddress : Save a new or existing address
* @name Base/Address-SaveAddress
* @function
* @memberof Address
* @param {middleware} - csrfProtection.validateAjaxRequest
* @param {querystringparameter} - addressId - a string used to identify the address record
* @param {httpparameter} - dwfrm_address_addressId - An existing address id (unless new record)
* @param {httpparameter} - dwfrm_address_firstName - A personβs first name
* @param {httpparameter} - dwfrm_address_lastName - A personβs last name
* @param {httpparameter} - dwfrm_address_address1 - A personβs street name
* @param {httpparameter} - dwfrm_address_address2 - A personβs apartment number
* @param {httpparameter} - dwfrm_address_country - A personβs country
* @param {httpparameter} - dwfrm_address_states_stateCode - A personβs state
* @param {httpparameter} - dwfrm_address_city - A personβs city
* @param {httpparameter} - dwfrm_address_postalCode - A personβs united states postel code
* @param {httpparameter} - dwfrm_address_phone - A personβs phone number
* @param {httpparameter} - csrf_token - hidden input field CSRF token
* @param {category} - sensitive
* @param {returns} - json
* @param {serverfunction} - post
*/
server.post('SaveAddress', csrfProtection.validateAjaxRequest, function (req, res, next) {
var CustomerMgr = require('dw/customer/CustomerMgr');
var Transaction = require('dw/system/Transaction');
var formErrors = require('*/cartridge/scripts/formErrors');
var accountHelpers = require('*/cartridge/scripts/helpers/accountHelpers');
var addressHelpers = require('*/cartridge/scripts/helpers/addressHelpers');
var addressForm = server.forms.getForm('address');
var addressFormObj = addressForm.toObject();
addressFormObj.addressForm = addressForm;
var customer = CustomerMgr.getCustomerByCustomerNumber(
req.currentCustomer.profile.customerNo
);
var addressBook = customer.getProfile().getAddressBook();
if (addressForm.valid) {
res.setViewData(addressFormObj);
this.on('route:BeforeComplete', function () { // eslint-disable-line no-shadow
var formInfo = res.getViewData();
Transaction.wrap(function () {
var address = null;
if (formInfo.addressId.equals(req.querystring.addressId) || !addressBook.getAddress(formInfo.addressId)) {
address = req.querystring.addressId
? addressBook.getAddress(req.querystring.addressId)
: addressBook.createAddress(formInfo.addressId);
}
if (address) {
if (req.querystring.addressId) {
address.setID(formInfo.addressId);
}
// Save form's address
addressHelpers.updateAddressFields(address, formInfo);
// Send account edited email
accountHelpers.sendAccountEditedEmail(customer.profile);
res.json({
success: true,
redirectUrl: URLUtils.url('Address-List').toString()
});
} else {
formInfo.addressForm.valid = false;
formInfo.addressForm.addressId.valid = false;
formInfo.addressForm.addressId.error =
Resource.msg('error.message.idalreadyexists', 'forms', null);
res.json({
success: false,
fields: formErrors.getFormErrors(addressForm)
});
}
});
});
} else {
res.json({
success: false,
fields: formErrors.getFormErrors(addressForm)
});
}
return next();
});
/**
* Address-DeleteAddress : Delete an existing address
* @name Base/Address-DeleteAddress
* @function
* @memberof Address
* @param {middleware} - userLoggedIn.validateLoggedInAjax
* @param {querystringparameter} - addressId - a string used to identify the address record
* @param {querystringparameter} - isDefault - true if this is the default address. false otherwise
* @param {category} - sensitive
* @param {returns} - json
* @param {serverfunction} - get
*/
server.get('DeleteAddress', userLoggedIn.validateLoggedInAjax, function (req, res, next) {
var CustomerMgr = require('dw/customer/CustomerMgr');
var Transaction = require('dw/system/Transaction');
var accountHelpers = require('*/cartridge/scripts/helpers/accountHelpers');
var data = res.getViewData();
if (data && !data.loggedin) {
res.json();
return next();
}
var addressId = req.querystring.addressId;
var isDefault = req.querystring.isDefault;
var customer = CustomerMgr.getCustomerByCustomerNumber(
req.currentCustomer.profile.customerNo
);
var addressBook = customer.getProfile().getAddressBook();
var address = addressBook.getAddress(addressId);
var UUID = address.getUUID();
this.on('route:BeforeComplete', function () { // eslint-disable-line no-shadow
var length;
Transaction.wrap(function () {
addressBook.removeAddress(address);
length = addressBook.getAddresses().length;
if (isDefault && length > 0) {
var newDefaultAddress = addressBook.getAddresses()[0];
addressBook.setPreferredAddress(newDefaultAddress);
}
});
// Send account edited email
accountHelpers.sendAccountEditedEmail(customer.profile);
if (length === 0) {
res.json({
UUID: UUID,
defaultMsg: Resource.msg('label.addressbook.defaultaddress', 'account', null),
message: Resource.msg('msg.no.saved.addresses', 'address', null)
});
} else {
res.json({ UUID: UUID,
defaultMsg: Resource.msg('label.addressbook.defaultaddress', 'account', null)
});
}
});
return next();
});
/**
* Address-SetDefault : Set an address the be the default address
* @name Base/Address-SetDefault
* @function
* @memberof Address
* @param {middleware} - userLoggedIn.validateLoggedIn
* @param {querystringparameter} - addressId - a string used to identify the address record
* @param {category} - sensitive
* @param {serverfunction} - get
*/
server.get('SetDefault', userLoggedIn.validateLoggedIn, function (req, res, next) {
var CustomerMgr = require('dw/customer/CustomerMgr');
var Transaction = require('dw/system/Transaction');
var accountHelpers = require('*/cartridge/scripts/helpers/accountHelpers');
var addressId = req.querystring.addressId;
var customer = CustomerMgr.getCustomerByCustomerNumber(
req.currentCustomer.profile.customerNo
);
var addressBook = customer.getProfile().getAddressBook();
var address = addressBook.getAddress(addressId);
this.on('route:BeforeComplete', function () { // eslint-disable-line no-shadow
Transaction.wrap(function () {
addressBook.setPreferredAddress(address);
});
// Send account edited email
accountHelpers.sendAccountEditedEmail(customer.profile);
res.redirect(URLUtils.url('Address-List'));
});
next();
});
/**
* Address-Header : The endpoint Address-Header renders an isml
* @name Base/Address-Header
* @function
* @memberof Address
* @param {middleware} - server.middleware.include
* @param {category} - sensitive
* @param {renders} - isml
* @param {serverfunction} - get
*/
server.get('Header', server.middleware.include, function (req, res, next) {
if (!req.currentCustomer.profile) {
res.render('account/header-anon', {});
} else {
res.render('account/header-logged', { name: req.currentCustomer.profile.firstName });
}
next();
});
module.exports = server.exports();