Skip to content

Commit

Permalink
feat(payment): Add BigPay v2 payload mappers
Browse files Browse the repository at this point in the history
  • Loading branch information
davidchin committed May 9, 2017
1 parent 3e35abc commit 6424089
Show file tree
Hide file tree
Showing 12 changed files with 548 additions and 3 deletions.
31 changes: 29 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,43 @@ export default function getPaymentData() {
province: 'New South Wales',
},
cart: {
currency: 'AUD',
grandTotal: {
integerAmount: 12000,
},
handling: {
integerAmount: 0,
},
shipping: {
integerAmount: 1000,
},
subtotal: {
integerAmount: 10000,
},
taxTotal: {
integerAmount: 1000,
},
items: [
{
id: '123',
integerAmount: 10000,
integerAmountAfterDiscount: 10000,
integerDiscount: 0,
integerTax: 1000,
name: 'Cheese',
quantity: 1,
sku: '123456789',
type: 'ItemPhysicalEntity',
},
],
},
customer: {
customerId: '123',
email: 'customer@bigcommerce.com',
email: 'email@bigcommerce.com',
firstName: 'Foo',
lastName: 'Bar',
locale: 'en-AU',
name: 'Foo Bar',
phoneNumber: '98765432',
},
order: {
currency: 'AUD',
Expand Down Expand Up @@ -119,6 +140,12 @@ export default function getPaymentData() {
},
source: 'bcapp-checkout-uco',
store: {
cartLink: '/cart',
checkoutLink: '/checkout',
countryCode: 'AU',
currencyCode: 'AUD',
orderConfirmationLink: '/order-confirmation',
shopPath: '/',
storeHash: 's123456789',
storeId: '100',
storeLanguage: 'en-AU',
Expand Down
77 changes: 77 additions & 0 deletions src/payment/v2/payment-mappers/cart-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { omitNil } from '../../../common/utils';

export default class CartMapper {
/**
* @returns {CartMapper}
*/
static create() {
return new CartMapper();
}

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToCart(data) {
const { cart = {} } = data;

return omitNil({
currency_code: cart.currency,
items: this.mapToItems(data),
totals: this.mapToOrderTotals(data),
});
}

/**
* @private
* @param {PaymentRequestData} data
* @returns {Object[]}
*/
mapToItems(data) {
const { cart = { items: [] } } = data;

return cart.items.map(itemData => omitNil({
discount_amount: itemData.integerDiscount,
name: itemData.name,
price: itemData.integerAmount,
quantity: itemData.quantity,
sku: itemData.sku,
tax_amount: itemData.integerTax,
amount: itemData.integerAmountAfterDiscount,
type: this.mapToType(itemData),
}));
}

/**
* @private
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToOrderTotals(data) {
const { cart = {} } = data;

return omitNil({
discount_total: cart.discount ? cart.discount.integerAmount : null,
grand_total: cart.grandTotal ? cart.grandTotal.integerAmount : null,
shipping_total: cart.shipping ? cart.shipping.integerAmount : null,
subtotal: cart.subtotal ? cart.subtotal.integerAmount : null,
surcharge_total: cart.handling ? cart.handling.integerAmount : null,
tax_total: cart.taxTotal ? cart.taxTotal.integerAmount : null,
});
}

/**
* @private
* @param {Object} itemData
* @returns {Object}
*/
mapToType(itemData) {
const types = {
ItemPhysicalEntity: 'physical',
ItemDigitalEntity: 'digital',
ItemGiftCertificateEntity: 'gift_card',
};

return types[itemData.type];
}
}
37 changes: 37 additions & 0 deletions src/payment/v2/payment-mappers/gateway-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { omitNil } from '../../../common/utils';
import PaymentMethodIdMapper from '../../payment-method-mappers/payment-method-id-mapper';

export default class GatewayMapper {
/**
* @returns {GatewayMapper}
*/
static create() {
const paymentMethodIdMapper = PaymentMethodIdMapper.create();

return new GatewayMapper(paymentMethodIdMapper);
}

/**
* @param {PaymentMethodIdMapper} paymentMethodIdMapper
* @returns {void}
*/
constructor(paymentMethodIdMapper) {
/**
* @private
* @type {PaymentMethodIdMapper}
*/
this.paymentMethodIdMapper = paymentMethodIdMapper;
}

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToGateway(data) {
const { paymentMethod = {} } = data;

return omitNil({
name: this.paymentMethodIdMapper.mapToId(paymentMethod),
});
}
}
22 changes: 22 additions & 0 deletions src/payment/v2/payment-mappers/header-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { omitNil } from '../../../common/utils';

export default class HeaderMapper {
/**
* @returns {HeaderMapper}
*/
static create() {
return new HeaderMapper();
}

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToHeaders(data) {
const { authToken } = data;

return omitNil({
Authorization: authToken,
});
}
}
46 changes: 46 additions & 0 deletions src/payment/v2/payment-mappers/quote-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { omitNil } from '../../../common/utils';

export default class QuoteMapper {
/**
* @returns {QuoteMapper}
*/
static create() {
return new QuoteMapper();
}

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToQuote(data) {
return omitNil({
billing_address: this.mapToAddress(data, 'billingAddress'),
shipping_address: this.mapToAddress(data, 'shippingAddress'),
});
}

/**
* @private
* @param {PaymentRequestData} data
* @param {string} addressKey
* @returns {Object}
*/
mapToAddress(data, addressKey) {
const { customer = {} } = data;
const address = data[addressKey] || {};

return omitNil({
address_line_1: address.addressLine1,
address_line_2: address.addressLine2,
city: address.city,
company: address.company,
country_code: address.countryCode,
email: customer.email,
first_name: address.firstName,
last_name: address.lastName,
phone: address.phone,
postal_code: address.postCode,
state: address.province,
});
}
}
67 changes: 67 additions & 0 deletions src/payment/v2/payment-mappers/store-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { omitNil, toNumber } from '../../../common/utils';

export default class StoreMapper {
/**
* @returns {StoreMapper}
*/
static create() {
return new StoreMapper();
}

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToStore(data) {
return omitNil({
locale: this.mapToLocale(data),
store_identity: this.mapToIdentity(data),
urls: this.mapToUrls(data),
});
}

/**
* @private
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToLocale(data) {
const { store = {} } = data;

return omitNil({
country_code: store.countryCode,
currency_code: store.currencyCode,
language_code: store.storeLanguage,
});
}

/**
* @private
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToIdentity(data) {
const { store = {} } = data;

return omitNil({
id: store.storeId ? toNumber(store.storeId) : null,
name: store.storeName,
});
}

/**
* @private
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToUrls(data) {
const { store = {} } = data;

return omitNil({
cart: store.cartLink,
checkout: store.checkoutLink,
confirmation: store.orderConfirmationLink,
home: store.shopPath,
});
}
}
34 changes: 33 additions & 1 deletion test/mocks/payment-request-data.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,36 @@ const paymentRequestDataMock = {
province: 'New South Wales',
},
cart: {
currency: 'AUD',
discount: {
integerAmount: 0,
},
grandTotal: {
integerAmount: 12000,
},
handling: {
integerAmount: 500,
},
shipping: {
integerAmount: 1000,
},
subtotal: {
integerAmount: 10000,
},
taxTotal: {
integerAmount: 1000,
},
items: [
{
integerAmount: 10000,
id: '123',
integerAmount: 10000,
integerAmountAfterDiscount: 10000,
integerDiscount: 0,
integerTax: 1000,
name: 'Cheese',
quantity: 1,
sku: '123456789',
type: 'ItemPhysicalEntity',
},
],
},
Expand All @@ -38,6 +61,9 @@ const paymentRequestDataMock = {
order: {
callbackUrl: '/order/123/payment',
currency: 'AUD',
discount: {
integerAmount: 0,
},
grandTotal: {
integerAmount: 12000,
},
Expand Down Expand Up @@ -93,6 +119,12 @@ const paymentRequestDataMock = {
},
source: 'bcapp-checkout-uco',
store: {
cartLink: '/cart',
checkoutLink: '/checkout',
countryCode: 'AU',
currencyCode: 'AUD',
orderConfirmationLink: '/order-confirmation',
shopPath: '/',
storeHash: 's123456789',
storeId: '100',
storeLanguage: 'en-AU',
Expand Down
Loading

0 comments on commit 6424089

Please sign in to comment.