json_api/errors.js

import { ServerErrorBase } from '../errors'
import { toCamelCaseDeep } from '../utils/case_converter'

/**
 * Generic JSON API error response.
 */
export class JsonApiError extends ServerErrorBase {
  /**
   * Wrap a raw JsonApi error response.
   *
   * @constructor
   *
   * @param {Error} originalError Original error response.
   * @param {axios} axios Axios instance used for the request.
   */
  constructor (originalError, axios) {
    super(originalError, axios)
    let unwrappedError = originalError.response.data.errors[0]
    this._title = unwrappedError.title
    this._detail = unwrappedError.detail
    this._code = unwrappedError.code
    this._meta = toCamelCaseDeep(unwrappedError.meta || {})
  }

  get code () {
    return this._code
  }
}

/**
 * "Bad Request" error.
 * `error.nestedErrors` may contain per-field errors.
 *
 * @export
 * @class
 */
export class JsonApiBadRequestError extends JsonApiError {
  /**
   * Wrap a raw JsonApi error response.
   *
   * @constructor
   *
   * @param {Error} originalError Original error response.
   * @param {axios} axios Axios instance used for the request.
   */
  constructor (originalError, axios) {
    super(originalError, axios)
    let errors = originalError.response.data.errors
    if (errors.length > 1) {
      this._title = 'Request contains some errors.'
      this._detail = 'Request contains some errors. Check "nestedErrors"'
      this._nestedErrors = errors.map(err => ({
        title: err.title,
        detail: err.detail,
        meta: toCamelCaseDeep(err.meta)
      }))
    }
  }

  /**
   * Errors for every invalid field.
   */
  get nestedErrors () {
    return this._nestedErrors
  }
}

/**
 * User is not allowed to perform this action.
 *
 * @export
 * @class
 */
export class JsonApiNotAllowedError extends JsonApiError {}

/**
 * Forbidden.
 *
 * @export
 * @class
 */
export class JsonApiForbiddenRequestError extends JsonApiError {}

/**
 * The requested resource was not found.
 *
 * @export
 * @class
 */
export class JsonApiNotFoundError extends JsonApiError {}

/**
 * The request could not be completed due to a conflict with the current state of the target resource.
 *
 * @export
 * @class
 */
export class JsonApiConflictError extends JsonApiError {}

/**
 * Internal server error.
 *
 * @export
 * @class
 */
export class JsonApiInternalServerError extends JsonApiError {}