Salesforce B2C Commerce のヘッドレス API のカスタマイズ

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回の記事では、Salesforce B2C Commerce のヘッドレスコマースのカスタマイズ方法について紹介します。
ヘッドレスコマースについては下記の記事を参考にしてもらえればいいかと思います。

* [Salesforce B2C CommerceのヘッドレスAPIを呼んでみる(ショッパー系API - SCAPIパブリッククライアント編)](https://qiita.com/syunyama/items/89b204486ace9fd10440)
* [Salesforce B2C CommerceのヘッドレスAPIを呼んでみる(ショッパー系API - SCAPIプライベートクライアント編)](https://qiita.com/syunyama/items/34bd2a11dabb93bb1dc1)
* [Salesforce B2C CommerceのヘッドレスAPIを呼んでみる(データ系API編)](https://qiita.com/syunyama/items/060f5777b0fc04e4cea1)
* [Salesforce B2C CommerceのヘッドレスAPIを呼んでみる(ショッパー系API - OCAPI編)](https://qiita.com/syunyama/items/0bb4a6e095a53dac7267)


## カスタム属性の追加

特定の API に対応するシステムオブジェクトに対して追加されたカスタム属性は API 経由で取得、編集、削除が可能です。
今回は例として Profile オブジェクトにカスタム属性を追加して、それをAPIから操作していきたいと思います。

まず、Business Manager から **管理 > サイトの開発 > システムオブジェクトタイプ > 顧客プロフィール** に遷移し、下記のように `sample` と言うIDを持つカスタム属性を作成します。
![スクリーンショット 2022-10-28 17.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/f7fe9d24-4ec9-c85b-346b-923f999e0375.png)
さらに、`Sample` と言う名前の属性グループを作成し、`sample` カスタム属性を紐付けます。
![スクリーンショット 2022-10-28 17.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/268bd74e-c4b0-46e8-2ef9-f4b5cac1d126.png)

API で顧客を登録してみます。

```sh
REQUEST:
POST /customer/shopper-customers/v1/organizations/{orgID}/customers
?siteId={siteID} 
Host: {shortCode}.api.commercecloud.salesforce.com
Authorization: Bearer {token}
Content-Type: application/json

BODY:
{
    "customer": {
        "login": "sample01@test.com",
        "email": "sample01@test.com",
        "last_name": "山田",
        "first_name": "太郎",
        "c_sample": "テスト"
    },
    "password": "Test-Password0000"
}
```

API で顧客を取得してみます。

```sh
REQUEST:
GET /customer/shopper-customers/v1/organizations/{orgID}/customers
?siteId={siteID} 
Host: {shortCode}.api.commercecloud.salesforce.com
Authorization: Bearer {token}
Content-Type: application/json
```

レスポンスに `c_sample` と言うプロパティが追加されていることが確認できます。
![スクリーンショット 2022-10-28 17.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/1cd52d7b-55e7-aebf-a1ea-975d6ca3f567.png)
### ポイント

ポイントなのが、リクエストする際もレスポンス内にも属性IDに加えて `c_` がプリフィックスとして追加された形でプロパティとして扱うことです。

## API に処理を挟む

特定のAPIにはAPIが呼ばれたときに実行される Hooks があり、それを利用してAPI実行時に追加のロジックを実行することができます。 Hooks については前回紹介した記事「[Salesforce B2C Commerce で Hooks を使ってみる](https://qiita.com/syunyama/items/7cea968880505ec303db)」をご覧ください。
どのような引数が Hook の関数に渡されるかは、確認したいリソースを[一覧](https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/OCAPI/current/shop/Resources/index.html)から選択して、それぞれの API の 「Customization」 項目を参照してください。
![スクリーンショット 2022-10-28 18.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/c012c25e-a62c-e3e3-11a7-43498a0c058e.png)

## レスポンスボディへのプロパティの追加
特定の API にはレスポンスとしてプロパティを追加することができます。
可能な API は、下記の Hooks の一覧で `modify{メソッド名}Response`　がついているものです。

* [SCAPI の Hooks 一覧](https://developer.salesforce.com/docs/commerce/commerce-api/guide/hook_list.html)
* [OCAPI の Hooks 一覧](https://documentation.b2c.commercecloud.salesforce.com/DOC2/index.jsp?topic=%2Fcom.demandware.dochelp%2FOCAPI%2Fcurrent%2Fusage%2FHooks.html&resultof=%22%48%6f%6f%6b%73%22%20%22%68%6f%6f%6b%73%22%20)

方法については前回紹介した記事、「Salesforce B2C Commerce で Hooks を使ってみる」の「[Hooks の使い方](https://qiita.com/syunyama/items/7cea968880505ec303db#hooks%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)」をご覧ください。

## SCAPI か OCAPI かの判定
Hooks のなかで OCAPI なのか SCAPI なのか判定したいこともあるかと思います。
その場合は、下記の API を利用して判定することができます。( [Help](https://documentation.b2c.commercecloud.salesforce.com/DOC1/index.jsp?topic=%2Fcom.demandware.dochelp%2FDWAPI%2Fscriptapi%2Fhtml%2Fapi%2Fclass_dw_system_Request.html&resultof=%22%69%73%73%63%61%70%69%22%20&anchor=dw_system_Request_isSCAPI_DetailAnchor) 
 参照)


```js
request.isSCAPI()
```



## カスタムオブジェクトの利用
現状、OCAPI のみですが、カスタムオブジェクトも操作できますので紹介しておきます。データ系 API では保持範囲が「組織」のカスタムオブジェクトの CRUD 操作や検索、定義の取得ができますが、ショッパー系 API では保持範囲が「サイト」のカスタムオブジェクトを取得するのみです。


今回は保持範囲が組織のカスタムオブジェクトを OCAPI で作成する方法を紹介します。`sampleText` と言う属性を持つ `sample` と言うカスタムオブジェクトを作成しました。
![スクリーンショット 2022-10-28 18.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/dc0a12cb-fd84-f52c-7809-f32a5327f1ad.png)
API で ID `001` のカスタムオブジェクトにレコードを作成します。
```sh
REQUEST:
PUT /s/-/dw/data/v21_10/custom_objects/sample/001
Host: {realmID}.dx.commercecloud.salesforce.com
Authorization: Bearer {token}
Content-Type: application/json

BODY:
{
    "c_sampleText": "テスト"
}
```
API で取得してみると下記のように登録されていることがわかります。
```sh
REQUEST:
GET /s/-/dw/data/v21_10/custom_objects/sample/001
Host: {realmID}.dx.commercecloud.salesforce.com
Authorization: Bearer {token}
Content-Type: application/json
```
![image (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/aa1a9102-4ddd-8962-e123-aab1b98015a0.png)