rest/organizations.js

/**
 * Create a Meraki REST API wrapper for the organization ressource. See the
 * [online documentation]{@link https://dashboard.meraki.com/api_docs#organizations} for more information.
 *
 * @module meraki/rest/organizations
 * @param { string } [apiKey='']     The Meraki api key
 * @param { string } [target='api']  The Meraki target
 * @param { string } [basePath='/']  The Meraki base path for the organization ressource
 * @param { string } rateLimiter     The rate limiter (bottleneck) configuration
 * @param { object } [logger]          Logger to use if logging is enabled
 * @return { Object } The initialized Meraki REST API wrapper for the organization ressource
 * @example
 * const apiKey = 'secret meraki api key'
 * const organizationId = 'meraki organization id'
 * const version = 'v0'
 * const target = 'n12'
 * const basePath = `/${target}/${version}/organizations`
 * const rateLimiter = {
 *  enabled: true
 * }
 * const organizationEndpoints = require('./lib/rest/organization')({ apiKey, target, basePath, baseUrl, rateLimiter })
 */
function createOrganizationsEndpoints ({
  apiKey = '',
  target = 'api',
  basePath = '/',
  baseUrl = 'https://api.meraki.com',
  rateLimiter,
  logger
}) {
  const axios = require('./axios')({ baseUrl, rateLimiter, logger })

  /**
   * List the organizations that the user has privileges on.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @return { Promise } A promise holding the organizations this user has privileges on
   * @example <caption>Example response</caption>
   * [
   *   {
   *     "id":1234,
   *     "name":"My org"
   *   }
   * ]
   */
  function listOrganizations (data = {}) {
    const { apiKey: localApiKey, target: localTarget, scope } = data
    delete data.apiKey
    delete data.target
    delete data.scope

    return axios._get(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      basePath
    )
  }

  /**
   * Return an organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The organization id
   * @return { Promise } A promise holding the organization for this id
   * @example <caption>Example response</caption>
   * {
   *   "id":1234,
   *   "name":"My org"
   * }
   */
  function showOrganization ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    return axios._get(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}`
    )
  }

  /**
   * Update an organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The organization id
   * @param { string } name       The name of the organization
   * @return { Promise } A promise holding the updated organization
   * @example <caption>Example response</caption>
   * {
   *   "id":1234,
   *   "name":"My org"
   * }
   */
  function updateOrganization ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId,
    name
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    const data = { name }
    return axios._put(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}`,
      data
    )
  }

  /**
   * Create a new organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } name       The name of the organization
   * @return { Promise } A promise holding the newly created organization
   * @example <caption>Example response</caption>
   * {
   *   "id":1234,
   *   "name":"My org"
   * }
   */
  function createOrganization ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    name
  }) {
    const data = { name }
    return axios._post(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      basePath,
      data
    )
  }

  /**
   * Create a new organization by cloning the addressed organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The id of the organization to clone
   * @param { string } name       The name of the new organization
   * @return { Promise } A promise holding the newly created / cloned organization
   * @example <caption>Example response</caption>
   * {
   *   "id":1234,
   *   "name":"My cloned org"
   * }
   */
  function cloneOrganization ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId,
    name
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    const data = { name }
    return axios._post(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/clone`,
      data
    )
  }

  /**
   * Claim a device, license key, or order into an organization. When claiming by order, all devices
   * and licenses in the order will be claimed; licenses will be added to the organization and devices
   * will be placed in the organization's inventory. These three types of claims are mutually exclusive
   * and cannot be performed in one request.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]     Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]     Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]      Optional custom scope for rate limiter
   * @param { string } orgId        The id of the organization to claime
   * @param { string } order        The order number that should be claimed
   * @param { string } serial       The serial of the device that should be claimed
   * @param { string } licenseKey   The license key that should be claimed
   * @param { string } licenseMode  Either `renew` or `addDevices`. `addDevices` will increase the license limit, while `renew` will extend the amount of time until expiration. This parameter is required when claiming by licenseKey
   * @return { Promise } A promise with no data
   */
  function claimOrganization ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId,
    order,
    serial,
    licenseKey,
    licenseMode
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    const data = { order, serial, licenseKey, licenseMode }
    return axios._post(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/claim`,
      data
    )
  }

  /**
   * Return the license state for an organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The id of the organization
   * @return { Promise } A promise holding the license state for this organization
   * @example <caption>Example response</caption>
   * {
   *   "status": "OK",
   *   "expirationDate": "Nov 16, 2016 UTC",
   *   "licensedDeviceCounts": {
   *     "MS": 100
   *   }
   * }
   */
  function showOrganizationLicense ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    return axios._get(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/licenseState`
    )
  }

  /**
   * Return the inventory for an organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The id of the organization
   * @return { Promise } A promise holding the inventory for this organization
   * @example <caption>Example response</caption>
   * [
   *   {
   *     "mac": "00:11:22:33:44:55:66",
   *     "serial": "Q2XX-XXXX-XXXX",
   *     "networkId": "N_1234",
   *     "model": "MR34",
   *     "claimedAt": "1477958158.69776",
   *     "publicIp": "1.2.3.4",
   *   }
   * ]
   */
  function listOrganizationInventory ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    return axios._get(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/inventory`
    )
  }

  /**
   * Return the SNMP settings for an organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The id of the organization
   * @return { Promise } A promise holding then SNMP settings for this organization
   * @example <caption>Example response</caption>
   * {
   *   "v2cEnabled":false,
   *   "v3Enabled":false,
   *   "v3AuthMode":null,
   *   "v3PrivMode":null,
   *   "hostname":"n1.meraki.com",
   *   "port":16100
   * }
   */
  function showOrganizationSNMP ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    return axios._get(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/snmp`
    )
  }

  /**
   * Update the SNMP settings for an organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]     Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]     Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]      Optional custom scope for rate limiter
   * @param { string } orgId        The id of the organization
   * @param { boolean } v2cEnabled  Boolean indicating whether SNMP version 2c is enabled for the organization
   * @param { boolean } v3Enabled   Boolean indicating whether SNMP version 3 is enabled for the organization
   * @param { string } v3AuthMode   The SNMP version 3 authentication mode either MD5 or SHA
   * @param { string } v3AuthPass   The SNMP version 3 authentication password. Must be at least 8 characters if specified
   * @param { string } v3PrivMode   The SNMP version 3 privacy mode DES or AES128
   * @param { string } v3PrivPass   The SNMP version 3 privacy password. Must be at least 8 characters if specified
   * @param { string } peerIps      The IPs that are allowed to access the SNMP server. This list should be IPv4 addresses separated by semi-colons (ie. "1.2.3.4;2.3.4.5")
   * @return { Promise } A promise holding then updated SNMP settings for this organization
   * @example <caption>Example response</caption>
   * {
   *   "v2cEnabled":false,
   *   "v3Enabled":false,
   *   "v3AuthMode":null,
   *   "v3PrivMode":null,
   *   "hostname":"n1.meraki.com",
   *   "port":16100,
   *   "peerIps":null
   * }
   */
  function updateOrganizationSNMP (data = {}) {
    const { orgId, target: localTarget, scope } = data
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }
    delete data.orgId
    delete data.target
    delete data.scope

    return axios._put(
      data.apiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/snmp`,
      data
    )
  }

  /**
   * List the status of every Meraki device in the organization.
   *
   * @memberof module:meraki/rest/organizations
   * @param { string } [apiKey]   Optional custom apiKey for this request (if not set will take the inital apiKey)
   * @param { string } [target]   Optional custom target for this request (if not set will take the inital target)
   * @param { string } [scope]    Optional custom scope for rate limiter
   * @param { string } orgId      The id of the organization
   * @return { Promise } A promise holding then device statues for this organization
   * @example <caption>Example response</caption>
   * [
   *   {
   *     "name": "My AP",
   *     "serial": "Q234-ABCD-5678",
   *     "mac": "00:11:22:33:44:55",
   *     "status": "only",
   *     "lanIp": "1.2.3.4",
   *     "publicIp": "123.123.123.1",
   *     "networkId": "N_24329156"
   *   }
   * ]
   */
  function showOrganizationDeviceStatuses ({
    apiKey: localApiKey,
    target: localTarget,
    scope,
    orgId
  }) {
    if (!orgId) {
      return Promise.reject(new Error('The parameter orgId is mandatory'))
    }

    return axios._get(
      localApiKey || apiKey,
      localTarget || target,
      scope,
      `${basePath}/${orgId}/deviceStatuses`
    )
  }

  return {
    listOrganizations,
    showOrganization,
    updateOrganization,
    createOrganization,
    cloneOrganization,
    claimOrganization,
    showOrganizationLicense,
    listOrganizationInventory,
    showOrganizationSNMP,
    updateOrganizationSNMP,
    showOrganizationDeviceStatuses
  }
}

module.exports = createOrganizationsEndpoints