【HULFT Square】RDSから在庫データをAPIでじゃんじゃか動的に取得

## はじめに

本記事では "ゆる～く" HULFT Squareのご紹介をします。
HULFT Squareはセゾンテクノロジーが提供する国産[iPaaS](https://www.hulft.com/column/glossary-05)です。

是非こちらの[公式HP](https://www.hulft.com/service/hulft-square)、[公式マニュアル](https://www.hulft.com/help/ja-jp/HULFTSquare/homeindex.htm)へお越しください。

:::note warn
以下内容はご参考となりますので、実際にご検証、マニュアルのご参照をお願い致します。
:::
:::note warn
また弊社サポートへお問い合わせいただいても
お答えできない場合がございます🙇
是非コメント欄でご意見いただけますｔ幸いです。
:::
## きっかけ
とあるお客様（複数社様）とお話をしている中で
在庫データをハンディからAPI経由で取得したいと。
非常にiPaaSらしい使い方かもしれません。

もちろんこの仕組みはAWS API GatewayとLambdaを
統合して作成することは可能です。
ただし今回はこれをHULFT Squareで作ることで、
（今回は作り込みませんが）<font color="MediumSeaGreen">**APIでデータを返す前に加工変換処理をノーコードで追加**</font>
することができます。
その他に処理完了時のメール通知やslack通知も可能です。

今回はやってみた記事なので、APIでDBの在庫情報を
じゃんじゃか取得するだけにしようと思います。

## 今日やることイメージ
こんな感じ
![構成イメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/bf78e6dc-6051-2ade-549d-3caec193ff11.jpeg)

作っていった順番に解説していく～～

## RDSにてテーブル作成
今回はRDS PostgreSQL 15を利用しています。
PL/pgSQLにてテーブル作成しました。

```SQL:テーブル作成のサンプル
-- テーブルの作成
CREATE TABLE stock (
    ShohinCd text PRIMARY KEY,
    Zaiko bigint,
    OrosiKakaku bigint,
    DeliveryDate date
);

-- データの挿入
DO $$
DECLARE
    i int;
    shohin_cd text;
    zaiko bigint;
    delivery_date date := CURRENT_DATE + INTERVAL '3 days';
BEGIN
    FOR i IN 1..10000 LOOP
        shohin_cd := LPAD(i::text, 5, '0');
        zaiko := FLOOR(RANDOM() * 90 + 10)::bigint; -- ランダムな2桁の数字
        INSERT INTO stock (ShohinCd, Zaiko, OrosiKakaku, DeliveryDate)
        VALUES (shohin_cd, zaiko, 500, delivery_date);
    END LOOP;
END $$;
```

こんな感じで10000レコードできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/895906cf-f2bb-bbbd-3355-4bbbaf9b2a80.png)


- 商品コード（shohincd）は00001〜10000まで連番で作成
- 在庫数（zaiko）はランダムな2桁の数字
- 卸値（orosikakaku）は全て500
- 配達日（deliverydate）は全てデータ入力日から3日後を設定

## HULFT Squareの処理作成

![HSQ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/2f48065a-dc3d-816d-e951-c13c37d100b0.jpeg)

RDSに対してSELECTをかけ、XML変換(マッピング)にて
テーブル型からXML形式のデータへ変換しております。
API Client(今回はApidog)からHULFT Squareへリクエストを投げると
↑のスクリプトが動きます。

つまりHULFT SquareのAPIマネジメント機能では
皆様が作成された<font color="MiGreen">**固有の処理をAPIとして公開できます。**</font>
もちろんセキュリティ設定(IPフィルタ・Bearer認証)も可能です。

:::note info
APIマネジメントの設定方法は
[こちらのQiita記事](https://qiita.com/sugimon/items/3d3e407381298ac18312)や[公式マニュアル](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/HULFT_Square/HS_API/square_api.htm)をご確認ください。
:::

## Apidogの設定
細かい設定は他の方にお任せするとして。
（※弊社メンバーも[Qiita記事](https://qiita.com/ibuki_hada/items/a3e7ecf9fd1c18d1959a)書いてました。）

今回はクエリパラメータに格納する値を動的に変更しますので、以下の設定をしています。

:::note info
半年ほど前にApidogのDiscordで教えて貰った内容になります。
今はもっと簡単な方法があるかもです。
:::

まずクエリパラメータに
{{paddedNumber}}という変数を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/97138db0-95d0-1e9c-a0df-6ab0c436051c.png)

そして前処理にカスタムスクリプトを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763794/dfe318cc-b31b-f7f8-57a8-a1dc97346854.png)

```
let randomNumber = Math.floor(Math.random() * 10000) + 1;
let paddedNumber = randomNumber.toString().padStart(5, '0');
pm.variables.set("paddedNumber", paddedNumber);
```

これで設定は以上です。
（だいぶ端折りましたが・・・）

## こんな感じで動きますの

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">在庫データをAPIでじゃんじゃか取得するぞ<br>DB：RDS for PostgreSQL 15<br>ETL&amp;API Gateway：HULFT Square<br>API Client ：Apidog <a href="https://t.co/ojX6SaxwSR">pic.twitter.com/ojX6SaxwSR</a></p>&mdash; さんまの塩焼き (@sanmashioy4ki) <a href="https://twitter.com/sanmashioy4ki/status/1869311132063924478?ref_src=twsrc%5Etfw">December 18, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以上！