department-of-veterans-affairs/vets-website

View on GitHub
src/applications/post-911-gib-status/actions/post-911-gib-status.js

Summary

Maintainability
A
3 hrs
Test Coverage
import * as Sentry from '@sentry/browser';

import recordEvent from '@department-of-veterans-affairs/platform-monitoring/record-event';
import { apiRequest } from '@department-of-veterans-affairs/platform-utilities/api';

import {
  BACKEND_AUTHENTICATION_ERROR,
  BACKEND_SERVICE_ERROR,
  GET_ENROLLMENT_DATA_FAILURE,
  GET_ENROLLMENT_DATA_SUCCESS,
  NO_CHAPTER33_RECORD_AVAILABLE,
  SERVICE_AVAILABILITY_STATES,
  SET_SERVICE_AVAILABILITY,
  SET_SERVICE_UPTIME_REMAINING,
  SERVICE_DOWNTIME_ERROR,
} from '../utils/constants';

export function getEnrollmentData(apiVersion) {
  return dispatch =>
    apiRequest(
      '/post911_gi_bill_status',
      apiVersion,
      response => {
        recordEvent({ event: 'post911-status-success' });
        return dispatch({
          type: GET_ENROLLMENT_DATA_SUCCESS,
          data: response.data.attributes,
        });
      },
      response => {
        recordEvent({ event: 'post911-status-failure' });
        const error =
          response.errors.length > 0 ? response.errors[0] : undefined;
        if (error) {
          if (error.status === '503') {
            // LTS Service Downtime Error
            return dispatch({ type: SERVICE_DOWNTIME_ERROR });
          }
          if (error.status === '504') {
            // Either EVSS or a partner service is down or EVSS times out
            return dispatch({ type: BACKEND_SERVICE_ERROR });
          }
          if (error.status === '403') {
            // Backend authentication problem
            return dispatch({ type: BACKEND_AUTHENTICATION_ERROR });
          }
          if (error.status === '404') {
            // EVSS partner service has no record of this user
            return dispatch({ type: NO_CHAPTER33_RECORD_AVAILABLE });
          }
          return Promise.reject(
            new Error(
              `post-911-gib-status getEnrollmentData() received unexpected error: ${
                error.status
              }: ${error.title}: ${error.detail}`,
            ),
          );
        }
        return Promise.reject(
          new Error(
            'post-911-gib-status getEnrollmentData() received unexpected error (no status code available)',
          ),
        );
      },
    ).catch(error => {
      Sentry.captureException(error);
      return dispatch({ type: GET_ENROLLMENT_DATA_FAILURE });
    });
}

export function getServiceAvailability() {
  return dispatch => {
    dispatch({
      type: SET_SERVICE_AVAILABILITY,
      serviceAvailability: SERVICE_AVAILABILITY_STATES.pending,
    });

    return apiRequest('/backend_statuses/gibs')
      .then(response => {
        const availability = response.data.attributes.isAvailable;
        const uptimeRemaining =
          response.data.attributes.uptimeRemaining || null;

        dispatch({
          type: SET_SERVICE_AVAILABILITY,
          serviceAvailability: availability
            ? SERVICE_AVAILABILITY_STATES.up
            : SERVICE_AVAILABILITY_STATES.down,
        });

        dispatch({
          type: SET_SERVICE_UPTIME_REMAINING,
          uptimeRemaining,
        });
      })
      .catch(() => {
        dispatch({
          type: SET_SERVICE_AVAILABILITY,
          serviceAvailability: SERVICE_AVAILABILITY_STATES.down,
        });
      });
  };
}