@luxuryescapes/povoconnect

A persistence agnostic replacement for Heroku Connect.

Usage no npm install needed!

<script type="module">
  import luxuryescapesPovoconnect from 'https://cdn.skypack.dev/@luxuryescapes/povoconnect';
</script>

README

Povo Connect

A persistence agnostic replacement for Heroku Connect.

npm install @luxuryescapes/povoconnect

Before using Povo Connect make some rough API request calculations and check that you will not exceed the Salesforce API limits.

Credentials

Create credentials for connection:

export const credentials = {
  clientId: "ABCDEFG",
  clientSecret: "123456",
  loginUrl: "https://cs6.salesforce.com",
  password: "password",
  username: "foo@bar.com"
}

Create Topic

import { connect, upsertTopic } from "@luxuryescapes/povoconnect";
import { credentials } from "./config";

async function createTopic() {
  const conn = await connect(credentials);

  const topic = await upsertTopic(conn, "OpportunityUpdates")
}

Subscribe To Topic

Subscribe to the topic to sync data in real time.

Note: store message.data.replayId of the latest processed message for use next time you run a job.

import { connect, subscribe } from "@luxuryescapes/povoconnect";
import { credentials } from "./config";

const timeout = Infinity;

async function onReceive(message) {
  // do something here 
}

async function subscribeToOpportunityUpdates() {
  const conn = await connect(credentials);

  const subscription = {
    topic: "OpportunityUpdates",
    replayId: null
  }

  await subscribe(
    conn,
    subscription,
    timeout,
    onReceive
  );
}

Find

Retrieves the object to sync.

import { connect, findOne } from "@luxuryescapes/povoconnect";
import { credentials } from "./config";

const fields = ["Id", "Name"]

function mapper(sobject) {
  return {
    sfid: sobject.Id,
    name: sobject.Name
  }
}

async function findOpportunityById(sfid) {
  const conn = await connect(credentials);
  
  const model = await findOne(
    conn,
    "Opportunity",
    sfid,
    mapper,
    onReceive,
    fields
  );

  return model
}

Find All

When you make a schema change or you had an outage findAll will fetch all objects of a type so you can update your data. After this is done events should keep your data in sync.

import { connect, findAll } from "@luxuryescapes/povoconnect";
import { credentials } from "./config";

const maxFetch = 60000;

function mapper(sobject) {
  return {
    sfid: sobject.Id,
    name: sobject.Name
  }
}

const query = {
  fields: ["Id", "CreatedDate"],
  where: "foo = 'bar'",
  limit: 100
}

async function findAllOpportunity() {
  const conn = await connect(credentials);

  const models = await findAll(
    conn,
    "Opportunity",
    maxFetch,
    mapper,
    query
  );
}

Describe Object

Describe the SO object for mapping:

import { connect, describe } from "@luxuryescapes/povoconnect";
import { credentials } from "./config";

async function describeObject() {
  const conn = await connect(credentials);

  const meta = await describe(conn, "Opportunity");
}