Source: XnatDataMgmt/Workflow.js

import queryString from 'query-string';
import debug from 'debug';
import { APP_NAME, CONTENT_TYPES, RESPONSE_FORMAT } from '../Common/Constant';
import Requestable from '../Common/Requestable';
import XmlParser from '../Common/XmlParser';
import { IllegalArgumentsError } from '../Error';
import Resource from './Resource';

const log = debug(`${APP_NAME}:Workflow`);

/**
 * Wrapper class for the Workflow related APIs
 */
class Workflow extends Requestable {
  /**
   * Constructor
   * @param {JsXnat} jsXnat
   */
  constructor(jsXnat) {
    super(jsXnat);
  }

  /**
   * Create A Workflow Entry From An XML Descriptor File
   * @param {string} xml Workflow Description XML
   * @param {function} [cb] Callback function
   * @returns none
   */
  createWorkflowWithRawXml(xml, cb = undefined) {
    return this._request(
      'PUT',
      `/data/workflows?inbody=true`,
      xml,
      cb,
      CONTENT_TYPES.xml
    );
  }

  /**
   * Create A New Workflow Entry With Querystring Parameters
   * @param {object} json a map of workflow fields
   * @param {function} [cb] Callback function
   * @returns none
   */
  createWorkflow(json, cb = undefined) {
    if (typeof json !== 'object') {
      throw new IllegalArgumentsError(`a map of workflow entry is not valid`);
    }
    return this._request(
      'PUT',
      `/data/workflows?${queryString.stringify(json)}`,
      undefined,
      cb
    );
  }

  /**
   * Change the Status Of A Workflow Entry
   * @param {string} workflowId Workflow id
   * @param {string} status Workflow status
   * @param {function} cb optional callback function
   * @returns none
   */
  updateWorkflowStatus(workflowId, status, cb = undefined) {
    return this._request(
      'PUT',
      `/data/workflows/${workflowId}?wrk:workflowData/status=${status}`,
      undefined,
      cb
    );
  }

  /**
   * Get A Workflow Entry By Querystring Parameters
   * @param {object} json a map of workflow fields
   * @param {string} format Optional. Set the format of the response. json by default
   * @param {function} cb optional callback function
   */
  getWorkflow(json, format = RESPONSE_FORMAT.json, cb = undefined) {
    if (typeof json !== 'object') {
      throw new IllegalArgumentsError(`a map of workflow entry is not valid`);
    }

    return this._request('GET', `/data/workflows`, { ...json, format }, cb);
  }

  /**
   * Get A Workflow Entry By ID
   * @param {string} workflowId Workflow id
   * @param {string} format Optional. Set the format of the response. json by default
   * @param {function} cb optional callback function
   */
  getWorkflowById(workflowId, format = RESPONSE_FORMAT.json, cb = undefined) {
    return this._request(
      'GET',
      `/data/workflows/${workflowId}`,
      { format },
      cb
    );
  }
}

export default Workflow;