npm package: @phonal-technologies/drafterai-js
Description: Javascript SDK for Drafter AI
Author: Dmitry Tuzenkov
Latest version: 1.0.6

# drafterai-js

[![npm (scoped)](https://img.shields.io/npm/v/@phonal-technologies/drafterai-js)](https://www.npmjs.com/package/@phonal-technologies/drafterai-js)
[![npm](https://img.shields.io/npm/dy/@phonal-technologies/drafterai-js)](https://www.npmjs.com/package/@phonal-technologies/drafterai-js)
[![license](https://img.shields.io/github/license/phonal-technologies/drafter-js)](https://www.npmjs.com/package/@phonal-technologies/drafterai-js)

Javascript SDK for Drafter AI

```js
// example.js
import fetch from 'node-fetch'
import {
  initialize,
  WORKFLOW_EXAMPLE,
  WORKFLOW_EXECUTION_EXAMPLE,
} from '@phonal-technologies/drafterai-js'

// Init an API with apikey and fetch provider
const accessKey = process.env.DRAFTER_ACCESS_KEY
const drafterApi = initialize(accessKey, {
  fetch,
  url: 'http://localhost:3030',
})

/**
 * Example
 * const drafterApi = initialize(
 * 'pro_Vs1zz0Le.fX1F5KlLvqeZzzzeLhot6lXEE',
 * { fetch: fetch, }
 * )
 */

;(async () => {
  console.log('WORKFLOW_EXAMPLE', WORKFLOW_EXAMPLE)
  console.log('WORKFLOW_EXECUTION_EXAMPLE', WORKFLOW_EXECUTION_EXAMPLE)

  const workflows = await drafterApi.workflows.find(
    { $limit: 10, '$sort[id]': -1 },
    { all: true }
  )

  const workflowExecutions = await drafterApi.workflowExecutions.find(
    { $limit: 10, '$sort[id]': -1 },
    { all: true }
  )

  console.log('First 10 workflows', workflows)
  console.log('First 10 workflowExecutions', workflowExecutions)

  const [queuedExecution] = await drafterApi.workflowExecutions.create({
    workflowId: 88,
    context: {
      url: 'https://drafter.ai',
    },
  })

  console.log('queuedExecution', queuedExecution)

  const intervalId = setInterval(async () => {
    const [execution] = await drafterApi.workflowExecutions.find(
      { $limit: 10, '$sort[id]': -1, datagroup: queuedExecution.datagroup },
      { all: true }
    )

    if (['completed', 'failed'].includes(execution.status)) {
      clearInterval(intervalId)
    }

    console.log('execution', execution)
  }, 3000)
})()
```

## Alternative example with axios

```js
const axios = require('axios');

const DRAFTER_EXECUTION_COMPLETED_STATUS = 'completed'
const DRAFTER_EXECUTION_FAILED_STATUS = 'failed'
const DRAFTER_FINAL_STATUS = [DRAFTER_EXECUTION_COMPLETED_STATUS, DRAFTER_EXECUTION_FAILED_STATUS]
const DRAFTER_WORKFLOW_ID = 1269
​
/* Utils */
​
const objectToQueryStringUtil = (query) => {
  return Object.entries(query)
    .map(([key, value]) =>`${key}=${value}`)
  	.join('&')
}
​
​
/* Drafter Api Methods */
/* Drafter Executions Create */
const drafterAiWorkflowExecutionsCreate = async (xAccessKey, data) => {
  const resp = await axios({
    url: 'https://api.drafter.ai/workflow-executions',
    method: 'POST',
    headers: {
      'User-Agent': `DrafterAI jssdk/1.0 (nodejs18)`,
      'Content-Type': 'application/json',
      'X-Access-Key': xAccessKey,
    },
    data,
  })
  
  return resp.data
}
​
/* Drafter Executions Find All */
const drafterAiWorkflowExecutionsFindAll = async (xAccessKey, query) => {
  const resp = await axios({
    url: `https://api.drafter.ai/workflow-executions?${objectToQueryStringUtil(query)}`,
    method: 'GET',
    headers: {
      'User-Agent': `DrafterAI jssdk/1.0 (nodejs18)`,
      'Content-Type': 'application/json',
      'X-Access-Key': xAccessKey,
      'X-No-Paginate': 1
    },
  })
  
  return resp.data
}
;(async () => {
    const drafterAiAccessKey = '...'
    // Payload for Drafter AI
    const payload = {
      "workflowId": DRAFTER_WORKFLOW_ID,
      "context": {
        "yourName_": ownerName,
        "yourProspectsName_": firstName,
        "yourWebsite_": userWebsite,
        "prospectWebsite_": prospectWebsite,
      },
    };
    ​
    console.log('Executing Drafter AI workflow with payload:', payload);
    const queuedExecution = await drafterAiWorkflowExecutionsCreate(drafterAiAccessKey, payload);
    console.log('Workflow execution queued:', queuedExecution);
​
    // Poll for execution status
    console.log('Polling for execution status...');
    const intervalId = setInterval(async () => {
      const [execution] = await drafterAiWorkflowExecutionsFindAll(
        drafterAiAccessKey,
        { $limit: 1, datagroup: queuedExecution.datagroup },
      );
​
      console.log('Execution status:', execution.status);
      if (DRAFTER_FINAL_STATUS.includes(execution.status)) {
        clearInterval(intervalId);
		
        if (execution.status === DRAFTER_EXECUTION_FAILED_STATUS) {
          console.error('Execution Failed')
          return
        }
        
        console.log('Execution completed. Updating HubSpot contact properties...');
        // Update HubSpot contact properties
        const { subjectline, emailbody, emailsignature } = execution.pipeline[0]; // Adjust according to response structure
        
        console.log('Got response:', { subjectline, emailbody, emailsignature } );
   
      }
    }, 3000);
  })(); // Immediately invoke the function
```