create-organization-api.js

/**
 * Contentful Organization API. Contains methods to access any operations at a organization level.
 * @namespace ContentfulOrganizationAPI
 */

import { createRequestConfig } from 'contentful-sdk-core'
import errorHandler from './error-handler'
import entities from './entities'

/**
 * @memberof ContentfulOrganizationAPI
 * @typedef {object} ContentfulOrganizationAPI
 * @prop {function} createAppDefinition
 * @prop {function} getAppDefinition
 * @prop {function} getAppDefinitions
 * @prop {function} getOrganizationMembership
 * @prop {function} getOrganizationMemberships
 */

/**
 * Creates API object with methods to access the Organization API
 * @private
 * @param {object} params - API initialization params
 * @prop {object} http - HTTP client instance
 * @prop {object} entities - Object with wrapper methods for each kind of entity
 * @return {ContentfulOrganizationAPI}
 */
export default function createOrganizationApi ({ http }) {
  const {wrapAppDefinition, wrapAppDefinitionCollection} = entities.appDefinition
  const {wrapOrganizationMembership, wrapOrganizationMembershipCollection} = entities.organizationMembership
  const {wrapSpaceMembership, wrapSpaceMembershipCollection} = entities.spaceMembership

  /**
   * Organization instances.
   * @namespace Organization
   */

  /**
   * Gets an Organization Membership
   * @memberof ContentfulOrganizationAPI
   * @param {string} id - Organization Membership ID
   * @return {Promise<OrganizationMembership.OrganizationMembership>} Promise for an Organization Membership
   * @example
   * const contentful = require('contentful-management')
   *
   * client.getOrganizations()
   * .then((organization) => organization.getOrganizationMembership('organizationMembership_id'))
   * .then((organizationMembership) => console.log(organizationMembership))
   * .catch(console.error)
   */
  function getOrganizationMembership (id) {
    return http.get('organization_memberships/' + id)
      .then(response => wrapOrganizationMembership(http, response.data), errorHandler)
  }

  /**
   * Gets a collection of Organization Memberships
   * @memberof ContentfulOrganizationAPI
   * @param {object=} query - Object with search parameters. Check the <a href="https://www.contentful.com/developers/docs/javascript/tutorials/using-js-cda-sdk/#retrieving-entries-with-search-parameters">JS SDK tutorial</a> and the <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">REST API reference</a> for more details.
   * @return {Promise<OrganizationMembership.OrganizationMembershipCollection>} Promise for a collection of Organization Memberships
   * @example
   * const contentful = require('contentful-management')
   *
   * client.getOrganizations()
   * .then((organization) => organization.getOrganizationMemberships({'limit': 100})) // you can add more queries as 'key': 'value'
   * .then((response) => console.log(response.items))
   * .catch(console.error)
   */
  function getOrganizationMemberships (query = {}) {
    return http.get('organization_memberships', {
      query
    })
      .then(response => wrapOrganizationMembershipCollection(http, response.data), errorHandler)
  }

  /**
   * Gets an Space Membership in Organization
   * @memberof ContentfulOrganizationAPI
   * @param {string} id - Organiztion Space Membership ID
   * @return {Promise<SpaceMembership>} Promise for a Space Membership in an organization
   * @example
   * const contentful = require('contentful-management')
   *
   * client.getOrganizations()
   * .then((organization) => organization.getOrganizationSpaceMembership('organizationSpaceMembership_id'))
   * .then((organizationMembership) => console.log(organizationMembership))
   * .catch(console.error)
   */
  function getOrganizationSpaceMembership (id) {
    return http.get('space_memberships/' + id)
      .then(response => wrapSpaceMembership(http, response.data), errorHandler)
  }

  /**
   * Gets a collection Space Memberships in organization
   * @memberof ContentfulOrganizationAPI
   * @param {object=} query - Object with search parameters. Check the <a href="https://www.contentful.com/developers/docs/javascript/tutorials/using-js-cda-sdk/#retrieving-entries-with-search-parameters">JS SDK tutorial</a> and the <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">REST API reference</a> for more details.
   * @return {Promise<SpaceMembership[]>} Promise for a Space Membership collection across all spaces in the organization
   * @example
   * const contentful = require('contentful-management')
   *
   * client.getOrganizations()
   * .then((organization) => organization.getOrganizationSpaceMemberships()) // you can add queries like 'limit': 100
   * .then((response) => console.log(response.items))
   * .catch(console.error)
   */
  function getOrganizationSpaceMemberships (query = {}) {
    return http.get('space_memberships', {
      query
    })
      .then((response) => wrapSpaceMembershipCollection(http, response.data), errorHandler)
  }

  /**
   * Gets all app definitions
   * @memberof ContentfulOrganizationAPI
   * @return {Promise<AppDefinition.AppDefinitionCollection>} Promise for a collection of App Definitions
   * @example
   * const contentful = require('contentful-management')
   *
   * const client = contentful.createClient({
   *   accessToken: '<content_management_api_key>'
   * })
   *
   * client.getOrganization('<org_id>')
   * .then((org) => org.getAppDefinitions())
   * .then((response) => console.log(response.items))
   * .catch(console.error)
   */
  function getAppDefinitions (query = {}) {
    return http.get('app_definitions', createRequestConfig({query: query}))
      .then((response) => wrapAppDefinitionCollection(http, response.data), errorHandler)
  }

  /**
   * Gets an app definition
   * @memberof ContentfulOrganizationAPI
   * @return {Promise<AppDefinition.AppDefinition>} Promise for an App Definition
   * @example
   * const contentful = require('contentful-management')
   *
   * const client = contentful.createClient({
   *   accessToken: '<content_management_api_key>'
   * })
   *
   * client.getOrganization('<org_id>')
   * .then((org) => org.getAppDefinition('<app_definition_id>'))
   * .then((appDefinition) => console.log(appDefinition))
   * .catch(console.error)
   */
  function getAppDefinition (id) {
    return http.get('app_definitions/' + id)
      .then((response) => wrapAppDefinition(http, response.data), errorHandler)
  }

  /**
   * Creates an app definition
   * @memberof ContentfulOrganizationAPI
   * @see {AppDefinition}
   * @param {object=} data - Object representation of the App Definition to be created
   * @return {Promise<AppDefinition.AppDefinition>} Promise for the newly created AppDefinition
   * @example
   * const contentful = require('contentful-management')
   *
   * const client = contentful.createClient({
   *   accessToken: '<content_management_api_key>'
   * })
   *
   * client.getOrganization('<org_id>')
   * .then((org) => org.createAppDefinition({
   *    name: 'Example app',
   *    locations: [{ location: 'app-config' }],
   *    src: "http://my-app-host.com/my-app"
   *  }))
   * .then((appDefinition) => console.log(appDefinition))
   * .catch(console.error)
   */
  function createAppDefinition (data = {}) {
    return http.post('app_definitions', data)
      .then((response) => wrapAppDefinition(http, response.data), errorHandler)
  }

  return {
    getAppDefinition,
    getAppDefinitions,
    createAppDefinition,
    getOrganizationMembership,
    getOrganizationMemberships,
    getOrganizationSpaceMembership,
    getOrganizationSpaceMemberships
  }
}