Source

subscriptionForms.js

const common = require('./common');

/**
 * A module related to xMatters subscription forms.<br><br>
 * {@link https://help.xmatters.com/xmapi/index.html#subscription-forms}
 *
 * @module subscriptionForms
 */

/**
 * Get a subscription form from xMatters<br><br>
 *
 * {@link https://help.xmatters.com/xmapi/index.html#get-a-subscription-form}
 *
 * @param {module:environments.xMattersEnvironment} env The xmtoolbox representation of an xMatters instance.
 * @param {string} subscriptionFormId The unique identifier (id) of the subscription form.<br><br>
 * Examples:<br>
 * - b2341d69-8b83-4660-b8c8-f2e728f675f9<br>
 * @param {Object} query A json object representing the query string parameters for this request.
 * @returns {SubscriptionForm} Subscription Form Object Requested
 */
async function get(env, subscriptionFormId, query) {
  return common.get(env, '/api/xm/1/subscription-forms/', subscriptionFormId, query, 'Subscription Form');
}

/**
 * Get all subscription forms from xMatters matching the query. Please refer to the link below for the available query parameters.<br><br>
 *
 * {@link https://help.xmatters.com/xmapi/index.html#get-subscription-forms}
 *
 * @param {module:environments.xMattersEnvironment} env The xmtoolbox representation of an xMatters instance.
 * @param {Object} query A json object representing the query string parameters for this request.
 * @returns {Promise<SubscriptionForm[]>} Array of Subscription Form Objects Requested
 */
async function getMany(env, query) {
  return common.getMany(env, '/api/xm/1/subscription-forms', query, 'Subscription Forms');
}

/**
 * Get all subscription forms in a communication plan from xMatters matching the query. Please refer to the link below for the available query parameters.<br><br>
 *
 * {@link https://help.xmatters.com/xmapi/index.html#get-subscription-forms-in-a-plan}
 *
 * @param {module:environments.xMattersEnvironment} env The xmtoolbox representation of an xMatters instance.
 * @param {Object} query A json object representing the query string parameters for this request.
 * @param {string} planId The unique identifier (id) or name of the communication plan.<br><br>
 * Examples:<br>
 * - b2341d69-8b83-4660-b8c8-f2e728f675f9<br>
 * - MIM
 * @returns {Promise<SubscriptionForm[]>} Array of Subscription Form Objects Requested
 */
async function getManyInPlan(env, query, planId) {
  return common.getMany(
    env,
    `/api/xm/1/plans/${planId}/subscription-forms`,
    query,
    'Subscription Forms In Plan'
  );
}

/**
 * Create a subscription form in xMatters<br><br>
 *
 * {@link https://help.xmatters.com/xmapi/index.html#create-a-subscription-form}
 *
 * @param {module:environments.xMattersEnvironment} env The xmtoolbox representation of an xMatters instance.
 * @param {SubscriptionForm} subscriptionForm {@link https://help.xmatters.com/xmapi/index.html#subscription-form-objects}
 * @param {*} planId The UUID of the communication plan that is associated with the integration.
 * @returns {Promise<Site>} Site Object Created
 */
async function create(env, subscriptionForm, planId) {
  return common.create(
    env,
    `/api/xm/1/plans/${planId}/subscription-forms`,
    subscriptionForm,
    'Subscription Form',
    true
  );
}

/**
 * Update an subscription form in xMatters<br><br>
 *
 * {@link https://help.xmatters.com/xmapi/index.html#modify-a-subscription-form}
 *
 * @param {module:environments.xMattersEnvironment} env The xmtoolbox representation of an xMatters instance.
 * @param {*} integration {@link https://help.xmatters.com/xmapi/index.html#subscription-form-objects}
 * @param {*} subscriptionFormId The unique identifier (id) of the subscription form you want to modify.<br><br>
 * Examples:<br>
 * - 345c95ee-4abe-47ea-ae7c-ae84fb4bee4f<br>
 * @param {*} planId The UUID of the communication plan that is associated with the integration.
 * @returns {Promise<Integration>} Integration Object Updated
 */
async function update(env, subscriptionForm, subscriptionFormId, planId) {
  return common.update(
    env,
    `/api/xm/1/plans/${planId}/subscription-forms/`,
    subscriptionForm,
    subscriptionFormId,
    'Subscription Form'
  );
}

/**
 * Transforms an array of records exported from xMatters to the format needed to import into xMatters.
 * @param {module:environments.xMattersEnvironment} destination The xmtoolbox representation of the target or destination xMatters instance.
 * @param {SubscriptionForm[]} subscriptionForms Array of subscription form objects to transform.
 * @returns {Promise}
 */
async function exportToImport(destination, subscriptionForms, destinationData) {
  const destinationPlans = (destinationData.all ? destinationData.all.plans : null) || destinationData.plans;
  const destinationForms = (destinationData.all ? destinationData.all.forms : null) || destinationData.forms;
  return common.convertDefaultInitial(subscriptionForms, convert);

  function convert(subscriptionForm) {
    {
      //if plan, set plan
      if (subscriptionForm.plan) {
        //plan can be supplied as a string representing the name of the plan or an object with name key.
        const planName = subscriptionForm.plan.name;
        subscriptionForm.plan = common.AssignParentObject(subscriptionForm.plan, destinationPlans, 'name');

        //if the planName was returned rather than the id.
        if (planName === subscriptionForm.plan) {
          destination.log.warn(
            `DATA INTEGRITY ISSUE: Subscription Plan [${subscriptionForm.name}] has plan [${planName}] but a plan with that name was not found in the provided destination data.`
          );
        }
      }

      //if form, set form
      if (subscriptionForm.form) {
        //form can be supplied as a string representing the name of the form or an object with name key.
        const formName = subscriptionForm.form.name;
        const id = common.AssignParentObject(subscriptionForm.form, destinationForms, 'name', ['plan']);
        subscriptionForm.form = { id };

        //if the formName was returned rather than the id.
        if (formName === subscriptionForm.form) {
          destination.log.warn(
            `DATA INTEGRITY ISSUE: Subscription Form [${subscriptionForm.name}] has form [${formName}] but a form with that name was not found in the provided destination data.`
          );
        }
      }

      if (subscriptionForm.roles && subscriptionForm.roles.data) {
        subscriptionForm.roles = subscriptionForm.roles.data.map(({ name }) => ({ name }));
      }

      if (subscriptionForm.propertyDefinitions && subscriptionForm.propertyDefinitions.data) {
        subscriptionForm.propertyDefinitions = subscriptionForm.propertyDefinitions.data.map(({ name }) => ({
          name,
        }));
      }

      if (subscriptionForm.notificationDelay) {
        subscriptionForm.notificationDelay = Number(subscriptionForm.notificationDelay);
      }

      if (subscriptionForm.targetDeviceNames) {
        subscriptionForm.targetDeviceNames = subscriptionForm.targetDeviceNames.data.map(
          ({ name, visible, selected }) => ({ name, visible, selected })
        );
      }

      {
        return subscriptionForm;
      }
    }
  }
}

/**
 * The key values from the object that can be synchronized.
 */
const fields = [
  //'id',
  'name',
  'description',
  'devicesSectionCollapsed',
  'devicesSectionVisible',
  'notificationDelay',
  'propertyDefinitions',
  'oneWay',
  'roles',
  'scope',
  'form',
  'subscribeOthers',
  'targetDeviceNames',
];

/**
 * Synchronizes an array of objects from a source with destination objects and updates the destination as necessary.
 * @param {module:environments.xMattersEnvironment} destination The xmtoolbox representation of the target or destination xMatters instance.
 * @param {SubscriptionForm[]} sourceSubscriptionForms An array of the  subscription form objects to synchronize from the source data.
 * @param {SubscriptionForm[]} destinationSubscriptionForm An array of the subscription form objects to synchronize from the destination data.
 * @param {Object} options
 */
async function sync(destination, sourceSubscriptionForms, destinationSubscriptionForms, options) {
  return common.syncObject(
    'Subscription Form',
    sourceSubscriptionForms,
    destinationSubscriptionForms,
    destination,
    'name',
    fields,
    create,
    update,
    undefined,
    options,
    'plan'
  );
}

module.exports = {
  get,
  getMany,
  getManyInPlan,
  create,
  update,
  exportToImport,
  fields,
  sync,
};