Source: ZEventsApiAccountManagers/ZEventsApiAccountManagers.js

import ifPromise from 'onyx-common/ifPromise'

const ZEventsApi = ({ prototype }) => {
  prototype.normalizeAccountManager = function (_data) {
    const data = this.normalizeData(_data)

    const mapProps = {
      id: 'id',
      type: 'type',
      email: 'email',
      name: 'name',
      avatar_url: 'avatarUrl',
      role: 'role'
    }

    return this.filterAndMapProps(data, mapProps)
  }

  /**
   * @typedef {object} AccountManager
   * @property {number} id - id,
   * @property {string} type - type,
   * @property {string} name - name,
   * @property {string} email - email,
   * @property {string} avatarUrl - avatarUrl,
   * @property {string} role - role
   */

  prototype._createAccountManager = function ({ userId, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${userId}/account_managers`),
      method: 'POST',
      requestType: 'json',
      data: rest
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function createAccountManager
   * @param {object} payload - The event wait list payload
   * @param {string} [payload.userId='me'] - userid to assign
   * @returns {AccountManager} accountManager object
   * @example
   *
   * createEventWaitList({
   *   userId: 'me',
   *   eventId: 100
   * })
   */
  prototype.createAccountManager = function (payload) {
    const {
      userId
    } = payload

    const finalPayload = {
      userId: this.normalizeUserId(userId)
    }

    const raw = ifPromise(payload, () => this._createAccountManager(finalPayload))
    return raw
      .then(res => this.normalizeAccountManager(res.data))
      .catch(error => this.onError('createAccountManager', error))
  }

  prototype._deleteAccountManager = function ({ userId, id }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${userId}/account_managers/${id}`),
      method: 'DELETE'
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function deleteAccountManager
   * @param {object} payload - The account manager payload
   * @param {string} [payload.userId='me'] - userid to assign
   * @param {object} payload.id - The account manager id
   * @returns {void}
   * @example
   *
   * deleteAccountManager({
   *   userId: 'me',
   *   id: 100
   * })
   */
  prototype.deleteAccountManager = function (payload) {
    const {
      userId,
      id
    } = payload

    const finalPayload = {
      userId: this.normalizeUserId(userId),
      id: id
    }

    const raw = ifPromise(payload, () => this._deleteAccountManager(finalPayload))
    return raw
      .catch(error => this.onError('deleteAccountManager', error))
  }

  prototype._getAccountManagers = function ({ id, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${id}/account_managers`),
      method: 'GET',
      requestType: 'json',
      data: rest
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @typedef {object} getAccountManagersSummary
   * @property {number} page - page of results
   * @property {number} perPage - results per page
   * @property {boolean} hasMore - are more pages available?
   */

  /**
   * @typedef {object} getAccountManagersReturn
   * @property {AccountManager[]} accountManagers - list of account managers returned
   * @property {getAccountManagersSummary} listSummary - list summary object
   * @property {object} criteriaSummary - list summary object (empty)
   */

  /**
   * @function getAccountManagers
   * @param {object} payload - The payload
   * @param {string} [payload.userId='me'] - userid to assign
   * @param {number} [payload.page=1] - page
   * @returns {getAccountManagersReturn} getAccountManagersReturn
   * @example
   *
   * getAccountManagers({
   *   page: 2
   * })
   */
  prototype.getAccountManagers = function (payload) {
    const {
      userId,
      page = 1
    } = payload

    const finalPayload = {
      userId: this.normalizeUserId(userId),
      page
    }

    const raw = ifPromise(payload, () => this._getAccountManagers(finalPayload))
    return raw
      .then(res => this.normalizeListData(res.data, this.normalizeAccountManager))
      .catch(error => this.onError('getAccountManagers', error))
  }

  prototype._updateAccountManager = function ({ userId, id, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${userId}/account_managers/${id}`),
      method: 'PUT',
      requestType: 'json',
      data: rest
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function updateAccountManager
   * @param {object} payload - The user payload
   * @param {string} [payload.userId='me'] - user id
   * @param {string} payload.id - account manager id
   * @param {string} payload.role - role - moderator, ticket_taker
   * @returns {AccountManager} - account manager
   * @example
   *
   * updateAccountManager({
   *   userId: me,
   *   id: 123,
   *   role: 'ticket_taker'
   * })
   */
  prototype.updateAccountManager = function (payload) {
    const raw = ifPromise(payload, () => this._updateAccountManager(payload))
    return raw
      .then(res => this.normalizeAccountManager(res.data))
      .catch(error => this.onError('updateAccountManager', error))
  }
}

export default ZEventsApi