Heroku AppLinkの使い方 (クエリ)
Heroku AppLinkのサンプルコードがもう少し欲しいところ...で、まずはクエリのサンプルでも備忘録として残してみる
※サンプルコードは Node.js 版のSDKを使ったものに限定です。SDKのリポジトリは https://github.com/heroku/heroku-applink-nodejs を参照してください。
1. 1つのオブジェクトだけクエリする
import * as salesforcesdk from "@heroku/applink";
const sfdc_id = 'xxxxx';
async function sample () {
const sdk = salesforcesdk.init();
// ※Authorized Userを使います
const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);
// 取引先を取得する
const accountQueryResult: salesforcesdk.RecordQueryResult = await org.dataApi.query(
`select id,name from account where id = '${sfdc_id}'`
);
// accountQueryResult:
// {
// records: (レコードの配列)
// totalSize: (クエリした全レコード件数)
// done: (falseだと、次のページリンクがある)
// nextRecordsUrl: (次ページのリンク)
// }
const accountRecords: salesforcesdk.QueriedRecord[] = accountQueryResult.records;
// accountRecords:
// [
// {
// type: (オブジェクトAPI)
// fields: (レコード内の属性がオブジェクトとして格納)
// subQueryResults: (サブクエリがあれば)
// }
// ]
const accountRecord: salesforcesdk.QueriedRecord = accountRecords[0];
const account: { [key: string]: unknown } = accountRecord.fields;
console.log(account.id);
console.log(account.name);
}
2. サブクエリも追加してみる
import * as salesforcesdk from "@heroku/applink";
const sfdc_id = 'xxxxx';
async function sample () {
const sdk = salesforcesdk.init();
const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);
// 取引先と、それに紐つく取引先責任者を取得する
const accountQueryResult: salesforcesdk.RecordQueryResult = await org.dataApi.query(
`select id,name,(select name from contacts) from account where id = '${sfdc_id}'`
);
const accountRecords: salesforcesdk.QueriedRecord[] = accountQueryResult.records;
const accountRecord: salesforcesdk.QueriedRecord = accountRecords[0];
// subQueryResults内に、子リレーション名をkeyにした RecordQueryResult があるのでそれを取得する
const contactQueryResult: salesforcesdk.RecordQueryResult = accountRecord.subQueryResults.contacts;
if (contactQueryResult.totalSize == 0) {
console.log('取引先責任者なし');
}
const contactRecords: salesforcesdk.QueriedRecord[] = contactQueryResult.records;
contactRecords.forEach((record) => {
// 取引先責任者名
console.log(record.fields.name);
});
}
3. 親オブジェクトへのリレーションを追加してみる
import * as salesforcesdk from "@heroku/applink";
const sfdc_id = 'xxxxx';
async function sample () {
const sdk = salesforcesdk.init();
const org = await sdk.addons.applink.getAuthorization(process.env.HEROKU_APPLINK_CONNECTION_NAME);
// 商談と、商談明細をクエリする
// 商談明細には、商品の商品名もクエリする
const opportunityQueryResult: salesforcesdk.RecordQueryResult = await org.dataApi.query(
`select id,name,(select id,product2.name from opportunitylineitems) from opportunity where id = '${sfdc_id}'`
);
const opportunityRecords: salesforcesdk.QueriedRecord[] = opportunityQueryResult.records;
const opportunityRecord: salesforcesdk.QueriedRecord = opportunityRecords[0];
const opportunitylineitemQueryResult: salesforcesdk.RecordQueryResult = opportunityRecord.subQueryResult.opportunitylineitems;
const opportunitylineitemRecord: salesforcesdk.QueriedRecord = opportunitylineitemQueryResult.records[0];
// opportunitylineitemRecord:
// {
// type: 'opportunitylineitem',
// fields: {
// id: '00kA...',
// product2: {
// type: 'product2',
// fields: {
// name: 'xxxxx...'
// }
// }
// }
// }
// 商談明細が参照する商品レコードを取得する
const productRecord: salesforcesdk.QueriedRecord = opportunitylineitemRecord.fields.product2;
// productRecord:
// {
// type: 'product2',
// fields: {
// name: 'xxxx'
// }
// }
console.log(productRecord.field.name);
}