import { ValidationError, EmptyResultError } from './errors'; /** * Define the configuration for all services */ export class Configuration { private config: any = { authorisationApiClientId: null, deliveryAddressApiKey: null, invoiceApiKey: null, licenceApiKey: null, loginApiKey: null, membershipApi: null, membershipPartnershipsApiKey: null, originSystemId: null, partnershipTokenApiKey: null, paypalPaymentGateway: null, printFulfilmentApiKey: null, printInfoApiKey: null, redeemableEmailTokenApiKey: null, redeemableTokenApiKey: null, stepUpApi: null, stepUpAuthKey: null, subscriptionApiAppId: null, subscriptionApiKey: null, createTestPaymentMethodKey: null, subscriptionHistoryApiKey: null, suspensionApiKey: null, transitionApiKey: null, userProfileServiceApiKey: null, userCredApiKey: null, zuoraApi: null, zuoraAccessKeyId: null, zuoraAccessKeySecret: null, customerSsoApiKey: null, requestUserPurgeEndpoint: null, requestUserPurgeApiKey: null, sessionApi: null, sessionApiKey: null, }; /** * Allow passing configuration at construct * @param config */ constructor(config = {}) { this.set(config); } /** * Set the config properties using either a property string or config object * @param config Configuration object or property string * @param [value] Used when a property string is supplied * @throws {ValidationError} When invalid config properties supplied * @throws {ValidationError} When incorrect first parameter type supplied * @example * const config = new Configuration(); * config.set('membershipApiKey', 'secret'); * config.set({ * membershipApiKey: 'secret', * }); */ public set(config: any | string, value?: string) { if (typeof config === 'string') { config = { [config]: value }; } if (config && config.constructor.name === 'Object') { for (let key in config) { if (!this.config.hasOwnProperty(key)) { throw new ValidationError(`Invalid configuration property ${key}`); } this.config[key] = config[key]; } } else { throw new ValidationError(`First parameter must be string or object, ${typeof config} given`); } } /** * Return the value of the property given * @param key Config property required * @throws {ValidationError} When invalid config properties supplied * @throws {EmptyResultError} When the config property value is not set * @returns config value for given key * @example * const config = new Configuration(); * const property = config.get('membershipApiKey'); */ public get(key: string): string { if (!this.config.hasOwnProperty(key)) { throw new ValidationError(`Invalid configuration property ${key}`); } if (this.config[key] === null) { throw new EmptyResultError(`Configuration property ${key} is empty`); } return this.config[key]; } } /** * Configuration with production defaults */ export class ProductionConfiguration extends Configuration { constructor(config = {}) { super(Object.assign({}, { membershipApi: 'https://api.ft.com', paypalPaymentGateway: 'Paypal Gateway', requestUserPurgeEndpoint: 'https://request-user-purge-svc-eu-prod.memb.ft.com', sessionApi: 'https://session-api.memb.ft.com', }, config)); } } /** * Configuration with test defaults */ export class TestConfiguration extends Configuration { constructor(config = {}) { super(Object.assign({}, { membershipApi: 'https://api-t.ft.com', zuoraApi: 'https://rest.apisandbox.zuora.com', paypalPaymentGateway: 'TEST - Paypal Gateway', requestUserPurgeEndpoint: 'https://request-user-purge-svc-eu-test.memb.ft.com', sessionApi: 'https://sessionapi-test.memb.ft.com', }, config)); } }