department-of-veterans-affairs/vets-website

View on GitHub
src/applications/personalization/profile/util/direct-deposit.js

Summary

Maintainability
A
0 mins
Test Coverage
import cloneDeep from 'lodash/cloneDeep';
import set from 'lodash/set';
import capitalize from 'lodash/capitalize';
import recordAnalyticsEvent from '~/platform/monitoring/record-event';

export class DirectDepositClient {
  #LH_ENDPOINT = '/profile/direct_deposits/disability_compensations';

  #DEFAULT_FIELDS = {
    accountType: '',
    accountNumber: '',
    routingNumber: '',
  };

  constructor({ recordEvent = recordAnalyticsEvent } = {}) {
    this.recordAnalyticsEvent = recordEvent;
  }

  get endpoint() {
    return this.#LH_ENDPOINT;
  }

  formatDirectDepositResponseFromLighthouse = response => {
    const result = cloneDeep(response);

    set(result, 'paymentAccount', {
      financialInstitutionName: result?.paymentAccount?.name || undefined,
      financialInstitutionRoutingNumber:
        response?.paymentAccount?.routingNumber || undefined,
      accountNumber: response?.paymentAccount?.accountNumber || undefined,
      accountType:
        capitalize(response?.paymentAccount?.accountType) || undefined,
    });

    return result;
  };

  generateApiRequestOptions(fields) {
    const formattedFields = {
      accountType: fields.accountType,
      accountNumber: fields.accountNumber,
      routingNumber: fields.financialInstitutionRoutingNumber,
    };
    return {
      headers: {
        'Content-Type': 'application/json',
      },
      method: 'PUT',
      body: JSON.stringify({ ...this.#DEFAULT_FIELDS, ...formattedFields }),
      mode: 'cors',
    };
  }

  recordDirectDepositEvent({ status, method = 'GET', extraProperties = {} }) {
    const payload = {
      event: 'api_call',
      'api-name': `${method} ${this.endpoint}`,
      'api-status': status,
    };

    const errorKey = extraProperties?.['error-key'];

    if (errorKey) {
      payload['error-key'] = errorKey;
    }

    this.recordAnalyticsEvent(payload);
  }
}