Source: ZEventsApiEventGroups/ZEventsApiEventGroups.js

import ifPromise from 'onyx-common/ifPromise'

const ZEventsApiEventGroups = ({ prototype }) => {
  prototype.normalizeEventGroup = function (_data) {
    const data = this.normalizeData(_data)

    const mapProps = {
      id: 'id',
      title: 'title'
    }

    const ret = this.filterAndMapProps(data, mapProps)
    return ret
  }

  prototype._getEventGroups = function ({ userId }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${userId}/event_groups`),
      method: 'GET'
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @typedef {object} EventGroup
   * @property {number} id - event group id
   * @property {string} title - event group id
   */

  /**
   * @typedef {object} getEventGroupsReturn
   * @property {EventGroup[]} eventGroups - list of event groups returned
   */

  /**
   * @function getEventGroups
   * @returns {getEventGroupsReturn} getEventGroupsReturn
   * @example
   * getEventGroups()
   */

  prototype.getEventGroups = function (payload = {}) {
    const finalPayload = {
      userId: this.normalizeUserId(payload.userId)
    }
    const raw = ifPromise(payload, () => this._getEventGroups(finalPayload))
    return raw
      .then(res => this.normalizeListData(res.data, this.normalizeEventGroup))
      .catch(error => this.onError('getEventGroups', error))
  }

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

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @typedef {object} EventGroup
   * @property {number} id - event group id
   * @property {string} title - group title
   */

  /**
   * @function createEventGroup
   * @param {object} payload - The event group payload
   * @param {string} [payload.userId='me'] - user id
   * @param {string} payload.title - title of group
   * @returns {EventGroup} - event group
   * @example
   *
   * createEventGroup({
   *   title: 'test'
   * })
   */

  prototype.createEventGroup = function (payload) {
    const {
      userId,
      title
    } = payload

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

    const raw = ifPromise(payload, () => this._createEventGroup(finalPayload))
    return raw
      .then(res => this.normalizeEventGroup(res.data))
      .catch(error => this.onError('createEventGroup', error))
  }

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

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function updateEventGroup
   * @param {object} payload - The event group payload
   * @param {string} [payload.userId='me'] - user id
   * @param {string} payload.id - event group id
   * @param {string} payload.title - event group title
   * @returns {EventGroup} - event group
   * @example
   *
   * updateEventGroup({
   *   id: 123,
   *   title: 'test'
   * })
   */

  prototype.updateEventGroup = function (payload) {
    const raw = ifPromise(payload, () => this._updateEventGroup(payload))
    return raw
      .then(res => this.normalizeEventGroup(res.data))
      .catch(error => this.onError('updateEventGroup', error))
  }

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

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function deleteEventGroup
   * @param {object} payload - The event group payload
   * @param {string} [payload.userId='me'] - user id
   * @param {number} payload.id - event group id
   * @returns {void}
   * @example
   *
   * deleteEventGroup({
   *   id: 123
   * })
   */

  prototype.deleteEventGroup = function (payload) {
    const finalPayload = {
      id: payload.id,
      userId: this.normalizeUserId(payload.userId)
    }
    const raw = ifPromise(payload, () => this._deleteEventGroup(finalPayload))
    return raw
      .catch(error => this.onError('deleteEventGroup', error))
  }
}

export default ZEventsApiEventGroups