Skip to content

JavaScript toolkit for REST, etc. for external UIs using Decisions as a back-end.

Notifications You must be signed in to change notification settings

decisions-com/api-helpers

Repository files navigation

api-helpers

JavaScript toolkit for REST, etc. for clients interacting with a Decisions back-end. Its only goal is to minimize boilerplate for these clients by DRYing up common logic into helper functions.

Helper Functions

This is essentially a collection of helper functions, all of which are opt-in.

  1. "ApiConfig" contains some configuration that other helper functions depend on. This is essentially a singleton config object.
  2. "ApiHelpers" contains commands and helpers related to managing a decisions session. Other helper funcitions also depend on this state.
  3. "AuthApi" contains helper functions to simplify and DRY up logic related to forming URLs for various types of decisions end-points, as well as some convenience methods for retrieving data via fetch.

Usage

_If you are inside a Decisions web host, the helper functions should load auth IDs, etc. for you. _

Otherwise:

Configuration

Tell the API Where to find your Decisions instance

<script>
  // create global config variable:
  var DecisionsRestConfig = {
    cors: false,
    restRoot: "/decisions/Primary/"
  };
</script>

Alternately, you can put a rest-config.json at the web host root, but then your UI has to handle the fact that it's loaded asynchronously.

In your app code, tell that config to load:

import { ApiConfig } from "@decisions/api-helpers/ApiConfig";
// ...
ApiConfig.loadConfig();

Create a Session

(This is only necessary outside a Decisions Web Host.)

AuthApi.login(this.state.username, this.state.password)
  .then(() => { /* Handle successful login */}))
  .catch(() => { /* Handle successful */ });

Use Helper Functions

Use helper functions to generate URLs

import {
  getFlowIdUrl,
  getWrappedPostFetch
} from "@decisions/api-helpers/ApiHelpers";

//...

/**
 * builds the URL with little boilerplate:
 */
const url = getFlowIdUrl("123-flow-4567-uuid-8901");
const body = {/* ... */};

/**
 * Make `fetch` API call,
 * with a chunk of `Promise` boilerplate tucked away. 
 * 
 * @returns a promise  "resultPropIWant" 
 */ 
return getWrappedPostFetch(url, body, "resultPropIWant");

Road Map

  1. Unit tests
  2. Add support for Decisions Webhooks
  3. Abstract which API is making the requests
    • The fetch methods are fairly standard, and opt in. Good start.
    • Adding modules for other popular tools would be great.