Heroku AppLinkの使い方(DML)

Heroku AppLinkの使い方のサンプル第2弾でも。

※サンプルコードは Node.js 版のSDKを使ったものに限定です。SDKのリポジトリは https://github.com/heroku/heroku-applink-nodejs を参照してください。

1. レコードの作成

※もちろん添付ファイルを作成することも可能

import * as salesforcesdk from "@heroku/applink";


async function sample () {
  const sdk = salesforcesdk.init();
  // ※Authorized Userを使います
  const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);

  //----------------------------------------------------------
  // (1)レコードを作成
  //  - 参照先を設定する際には、外部キーの指定も可能
  const new_record = await org.dataApi.create({
    type: "customobject__c", // オブジェクトAPI
    fields: {
      key__c: ulid(),
      text01__c: 'xxxxx',
      longtextarea01__c: description,
      num01__c: 123,
      datetime01__c: new Date().toISOString(),
      check01__c: false,
      other_object__r: { key__c: 'other_key' },
    },
  });

  //----------------------------------------------------------
  // (2)contentversionの場合も
  //   JSONファイルを作成してBase64エンコード
  const jsonData = JSON.stringify(someobject, null, 2);
  const base64Data = Buffer.from(jsonData, 'utf-8').toString('base64');
  const fileName = 'xxx.json';

  // ContentVersionを直接作成
  const contentVersionResult = await org.dataApi.create({
    type: 'ContentVersion',
    fields: {
      Title: fileName,
      PathOnClient: fileName,
      VersionData: base64Data,
      ContentLocation: 'S'
    }
  });
  
  // ContentDocumentIdを取得するためにContentVersionをクエリ
  const contentVersionQuery = await org.dataApi.query(`SELECT ContentDocumentId FROM ContentVersion WHERE Id = '${contentVersionResult.id}'`);
  const contentDocumentId = contentVersionQuery.records[0]?.fields?.ContentDocumentId;

  // ContentDocumentLinkを直接作成してレコードに関連付け
  const linkResult = await org.dataApi.create({
    type: 'ContentDocumentLink',
    fields: {
      ContentDocumentId: contentDocumentId,
      LinkedEntityId: '(record id)',
      ShareType: 'V',
      Visibility: 'AllUsers'
    }
  });
  
}

2. レコードの更新

import * as salesforcesdk from "@heroku/applink";


async function sample () {
  const sdk = salesforcesdk.init();
  // ※Authorized Userを使います
  const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);
  
  // レコードを更新
  //  - 参照先を設定する際には、外部キーの指定も可能
  const new_record = await org.dataApi.update({
    type: "customobject__c", // オブジェクトAPI
    fields: {
      id: '(オブジェクトid)',
      text01__c: 'xxxxx',
      longtextarea01__c: description,
      num01__c: 123,
      datetime01__c: new Date().toISOString(),
      check01__c: false,
      other_object__r: { key__c: 'other_key' },
    },
  });

}

3. レコードの削除

typeid を指定するだけ

import * as salesforcesdk from "@heroku/applink";


async function sample () {
  const sdk = salesforcesdk.init();
  // ※Authorized Userを使います
  const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);
  
  // レコードを削除
  const new_record = await org.dataApi.delete({
    type: "customobject__c", // オブジェクトAPI
    fields: {
      id: '(オブジェクトid)',
    },
  });

}

そんなにややこしいAPIになってないので、素直に利用できる。
が、upsert がないのが残念...

ちなみに、dataApi.insert() の中身を掘り下げていくと、こんな記述をお目にかかります。

import { Connection } from "jsforce/lib/connection";

Heroku AppLinkのNode.js SDKの内部では、stomita先生のjsforceが使われている、ということでした。さすが。

Read more

heroku

Dancing with Heroku AppLink / 2

(ローカルアプリと組み合わせる...?) 構成の概要 Heroku AppLinkの活用例として、こんな構成を試してみた。 * 個別に作成したElectronアプリケーションがあって、そのアプリケーションはSalesforceのデータを参照したり、データを作成する。 * Electronアプリケーションに、Salesforceのアクセストークンを持たせてアクセスできるようにしたい。 * しかし、Electronアプリケーション内にSalesforceのアカウント情報を持たせたくないし、個別のログイン機能なんて作りたくない。 * Electronアプリケーションに渡す情報にはSalesforce外の情報もあり、その諸々の情報をまとめるためにHerokuアプリケーションを設置した。 * (Apexコードを書くのがやや面倒...) といったあたりで、上のような構成を試してみた。 Heroku AppLinkの活用ポイント など ※主に②で大活躍するので、そこに絞った話をしてみよう。 まず、Heroku側の実装としては以下を前提として、Node.jsアプリケ

By Takahiro Yonei

heroku

Dancing with Heroku AppLink / 1

(まずはよくありそうなパターンでも) 構成の概要 Heroku AppLinkの活用例として、こんな構成を試しているところ。 * HerokuとSalesforceを組み合わせて上のようなWebシステムを構築してる。 * HerokuはFrontend(Next.js)とBackend(Medusa.js)を使ってアプリケーションを作成している。 * Salesforceで作成したデータをHeroku Backendに連携する。BackendのAPIを外部サービスとしてSalesforceに登録しておいて、SalesforceからはFlowを使って連携する。 * Fronendから送信されたデータは、Backendを介してSalesforceに連携する。Heroku AppLinkを使ってSalesforceへのアクセストークンを取得してSalesforceにデータを書き込む。 構成としては、よくありそうなパターンではなかろうか。 しかし、Heroku BackendにAppLinkを組み込むことで、BackendとSalesforceの実装工数を削減で

By Takahiro Yonei

Dancing with Heroku vibes / 2

heroku vibesの画面操作を見るに、プロンプトを入力しつつ1つのherokuアプリを自動生成していくように見える。 1つのアプリで完結するようなものであれば、それでも良さそうに思える。 しかし、複数のherokuアプリを組み合わせてシステムを構築することもあるので、その場合はどうサポートしてくれるだろうか? プログラマの視点からすると、アプリの自動生成については...あまり優位性が見出せない。 pipelineを使いたいとかgithubとの連携とかあるので、自分でやった方が良いかなぁと思う。その辺りはむしろheroku MCPサーバの方がやりやすいかもしれない。 ボンヤリとしたアイディアから、構成や使用するadd onをいい感じに提案してくれる壁打ち相手として使えそうだろうか?と思う。 プログラマでない人からすれば、herokuアプリを自動生成してくれるのは助かる場面はありそうだ。 ただの想像だけど、salesforceを拡張する機能としてheroku applinkを使ったherokuアプリを自動生成する...みたいな場面であれば、プログラマでない人には有益かもしれない

By Takahiro Yonei