Skip to content

Commit

Permalink
refactor(payment): Extract classes from initializeOffsitePayment func…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
davidchin committed Apr 21, 2017
1 parent de0f0d9 commit ebb465e
Show file tree
Hide file tree
Showing 32 changed files with 606 additions and 323 deletions.
17 changes: 6 additions & 11 deletions src/client/client.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { PAYMENT_TYPES, initializeOffsitePayment, submitPayment } from '../payment';
import { PAYMENT_TYPES, submitPayment } from '../payment';
import OffsitePaymentInitializer from '../payment/offsite-payment-initializer';

export default class Client {
/**
* Construct BigpayClient
* @param {Object} config
* @param {string} config.host
*/
constructor({ host }) {
this.host = host;
constructor(config) {
this.host = config.host;
this.offsitePaymentInitializer = OffsitePaymentInitializer.create(config);
}

/**
Expand All @@ -17,14 +19,7 @@ export default class Client {
* @returns {void}
*/
initializeOffsitePayment(data, callback) {
const { paymentMethod = {} } = data;
const options = { host: this.host };

if (paymentMethod.type !== PAYMENT_TYPES.HOSTED) {
throw new Error(`${paymentMethod.type} is not supported.`);
}

initializeOffsitePayment(data, options, callback);
this.offsitePaymentInitializer.initializeOffsitePayment(data, callback);
}

/**
Expand Down
2 changes: 0 additions & 2 deletions src/payment/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import * as PAYMENT_TYPES from './payment-types';
import initializeOffsitePayment from './initialize-offsite-payment';
import submitPayment from './submit-payment';

export {
PAYMENT_TYPES,
initializeOffsitePayment,
submitPayment,
};
19 changes: 0 additions & 19 deletions src/payment/initialize-offsite-payment.js

This file was deleted.

5 changes: 0 additions & 5 deletions src/payment/offsite-mappers/index.js

This file was deleted.

27 changes: 0 additions & 27 deletions src/payment/offsite-mappers/map-to-address.js

This file was deleted.

10 changes: 0 additions & 10 deletions src/payment/offsite-mappers/map-to-billing-address.js

This file was deleted.

22 changes: 0 additions & 22 deletions src/payment/offsite-mappers/map-to-customer.js

This file was deleted.

16 changes: 0 additions & 16 deletions src/payment/offsite-mappers/map-to-meta.js

This file was deleted.

39 changes: 0 additions & 39 deletions src/payment/offsite-mappers/map-to-payload.js

This file was deleted.

10 changes: 0 additions & 10 deletions src/payment/offsite-mappers/map-to-shipping-address.js

This file was deleted.

15 changes: 0 additions & 15 deletions src/payment/offsite-mappers/map-to-store.js

This file was deleted.

63 changes: 63 additions & 0 deletions src/payment/offsite-payment-initializer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { createFormPoster } from 'form-poster';
import { HOSTED } from './payment-types';
import PayloadMapper from './offsite-payment-mappers/payload-mapper';
import UrlHelper from './url-helper';

export default class OffsitePaymentInitializer {
/**
* @param {Object} config
* @returns {OffsitePaymentInitializer}
*/
static create(config) {
const urlHelper = UrlHelper.create(config);
const formPoster = createFormPoster();
const payloadMapper = PayloadMapper.create();

return new OffsitePaymentInitializer(urlHelper, formPoster, payloadMapper);
}

/**
* @param {UrlHelper} urlHelper
* @param {FormPoster} formPoster
* @param {PayloadMapper} payloadMapper
* @returns {void}
*/
constructor(urlHelper, formPoster, payloadMapper) {
/**
* @private
* @type {UrlHelper}
*/
this.urlHelper = urlHelper;

/**
* @private
* @type {FormPoster}
*/
this.formPoster = formPoster;

/**
* @private
* @type {PayloadMapper}
*/
this.payloadMapper = payloadMapper;
}

/**
* @param {PaymentRequestData} data
* @param {Function} [callback]
* @returns {void}
* @throws {Error}
*/
initializeOffsitePayment(data, callback) {
const { paymentMethod = {} } = data;

if (paymentMethod.type !== HOSTED) {
throw new Error(`${paymentMethod.type} is not supported.`);
}

const payload = this.payloadMapper.mapToPayload(data);
const url = this.urlHelper.getOffsitePaymentUrl();

this.formPoster.postForm(url, payload, callback);
}
}
52 changes: 52 additions & 0 deletions src/payment/offsite-payment-mappers/address-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { omitNil, toSnakeCase } from '../../common/utils';

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

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToBillingAddress(data) {
return this.mapToAddress(data, 'billingAddress');
}

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToShippingAddress(data) {
return this.mapToAddress(data, 'shippingAddress');
}

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

return omitNil({
[`${formattedAddressKey}_city`]: address.city,
[`${formattedAddressKey}_company`]: address.company,
[`${formattedAddressKey}_country_code`]: address.countryCode,
[`${formattedAddressKey}_country`]: address.country,
[`${formattedAddressKey}_first_name`]: address.firstName,
[`${formattedAddressKey}_last_name`]: address.lastName,
[`${formattedAddressKey}_phone`]: address.phone,
[`${formattedAddressKey}_state_code`]: address.provinceCode,
[`${formattedAddressKey}_state`]: address.province,
[`${formattedAddressKey}_street_1`]: address.addressLine1,
[`${formattedAddressKey}_street_2`]: address.addressLine2,
[`${formattedAddressKey}_zip`]: address.postCode,
});
}
}
30 changes: 30 additions & 0 deletions src/payment/offsite-payment-mappers/customer-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { omitNil } from '../../common/utils';

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

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToCustomer(data) {
const { customer = {}, quoteMeta = {}, store = {} } = data;

return omitNil({
customer_browser_info: navigator.userAgent,
customer_email: customer.email,
customer_first_name: customer.firstName,
customer_geo_ip_country_code: quoteMeta.request ? quoteMeta.request.geoCountryCode : null,
customer_last_name: customer.lastName,
customer_locale: store.storeLanguage,
customer_name: customer.name,
customer_phone: customer.phoneNumber,
customer_reference: customer.email,
});
}
}
24 changes: 24 additions & 0 deletions src/payment/offsite-payment-mappers/meta-mapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { omitNil } from '../../common/utils';

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

/**
* @param {PaymentRequestData} data
* @returns {Object}
*/
mapToMeta(data) {
const { source } = data;

return omitNil({
meta_referrer: document.referrer,
meta_source: source,
meta_user_agent: navigator.userAgent,
});
}
}
Loading

0 comments on commit ebb465e

Please sign in to comment.