FoundryでRelational Databeseを使いデータベースとのやりとりを行う簡単なAPIを作成してみた

# 目次
1. はじめに
1. 実装方法
1. 最後に

# はじめに
Foundry（旧Fabric）のIntegration Serviceでは、
Service Typeにさまざまなアダプターを使用することができます。
![スクリーンショット 0004-12-22 18.23.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d32c9c09-ffe5-4c0a-7b23-beb25004a779.png)


その中でもRelational Databaseを選択すると、
自分で作成したデータベースをエンドポイントとして接続することができ、
テーブル内のデータに対してCRUD（作成、読み取り、更新、削除）操作を実行することができます。

今回は、Relational Databaseの活用方法についてご紹介したいと思います。

ご紹介する範囲は以下の赤枠部分となります。
個別に立てたデータベースから、Integration Serviceを使ってデータを取得し
フロントAppに表示する方法についてご紹介します。
![スクリーンショット (168).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/441ad949-bb95-bf72-0d98-4c57a5e1de31.png)

# 実装方法

では早速実装方法を紹介します。
今回独自に作成したテーブルは以下のような構成となっています。

![スクリーンショット 0004-12-22 18.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/8eb36992-15e4-5fd7-9fc2-d1fef1b18292.png)
ユーザー管理をするための`id`と`name`だけを追加したm_userテーブルを作成しました。

このm_userテーブルに対して、
Integration Serviceを使ってCRUD（作成、読み取り、更新、削除）処理を行うAPIを作成していきます。

## サービス作成
FoundryのIntegration Serviceタブをクリックし、
Add New Serviceをクリックします。
![スクリーンショット_0004-12-26_16_41_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/02334568-5445-2c20-bb79-3d0b55a06731.png)

Service Typeは、Relational Detabaseを選択します。
![スクリーンショット_0004-12-26_16_42_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/118fb0ba-0464-81b5-38e9-6972a6201bf6.png)

Relational Detabaseを選択すると以下のような表示になるので、
Detabaseに「Mysql」、
Database Connection URLに対象データベースの接続先、
UserIDとPasswordにデータベース作成時に設定したユーザーIDとパスワードと入力してください。
![db作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/72f22c47-ba7f-d84e-09fc-c222abc3ff19.png)

設定したら一度テスト接続をしてみます。
![DB作成＿テスト成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/54ce3c55-cce1-44e2-fdb7-e387e7384014.png)

接続ができたら一番下にあるSAVE&ADD OPERATIONで保存しましょう。


:::note info
AuthenticationにIdentity Serviceのサービス名を指定すると、
Identity Serviceで認証成功したユーザーのみアクセス可能となります。
必要に応じて使ってみてください。
![スクリーンショット 0004-12-26 16.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/ec03fa75-ebe5-65c7-5f29-26f7805b9165.png)
:::

## オペレーション作成
次にオペレーションの作成をします。
オペレーションのプルダウンをクリックすると、
作成可能な処理の一覧が表示されます。

作成したい処理にチェックを入れてAdd Operationをクリックしましょう。
今回は、CRUD処理を実行したいので次のようにチェックを入れました。  
![operation作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/8ef7cea8-2f20-c7e3-b96d-e6a2505fce7b.png)

しばらくすると、チェックを入れた処理が自動で作成されます。
Create処理の場合、`データベース名_テーブル名_create`のような名前でそれぞれ作成されます。
（後でオペレーションの名前を変更することも可能です）
![スクリーンショット_0004-12-26_17_02_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/559f936c-94e4-75a8-5f06-55bd0caf5806.png)

処理の中身を見てみると、自動的にカラムが追加されすぐに使える状態で作成されていることがわかります。
![スクリーンショット_0004-12-26_17_20_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/671e578c-4586-df1f-3b68-7e5451b31bf8.png)

これでAPIの作成は完了です！
チェックボックスを入れてボタンを押すだけなのでとっても簡単ですね👀

試しにちゃんと処理が動くか確認してみましょう！

## テスト実行
ユーザー取得
|GetUser|DB|
|--|--|
|![スクリーンショット 0004-12-26 17.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/aca85cc8-8599-145b-ff83-2fcf89bb0314.png)|![スクリーンショット_0004-12-26_17_09_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/294d81f7-e5b4-9d1c-02b0-e717bafe5fcc.png)
 


ユーザー追加
|CreateUser|DB|
|--|--|
|![スクリーンショット 0004-12-26 17.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a850a7dc-46f2-a8f1-a358-ef6ce5815fff.png)|![スクリーンショット_0004-12-26_17_12_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/ed436290-c205-49ae-06f1-cf6c9b9cd505.png)|


ユーザー更新
|UpdateUser|DB|
|--|--|
|![スクリーンショット 0004-12-26 17.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/daa70a36-c746-6203-6c83-826337a19f30.png)|![スクリーンショット_0004-12-26_17_14_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/b50eacef-dd23-76e4-4f82-f508f27dbb48.png)|



ユーザー削除
|DeleteUser|DB|
|--|--|
|![スクリーンショット 0004-12-26 17.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/11e2f725-3a0a-363c-fa11-4dcbc51f2e91.png)|![スクリーンショット 0004-12-26 17.15.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/ac843827-a0db-b49a-8264-184aea677d10.png)|


全ての処理が追加の設定不要で、正常に動かすことができました！
最後にアプリとの接続もうまく行くかどうか見ていきましょう👌

## フロントアプリでの確認
それぞれの処理が動作しているかわかるよう、簡単な画面を作成しました。
![スクリーンショット 0004-12-26 17.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/8ad21ec0-f30d-d088-b667-840ed93ca47f.png)

Controllerには、GetやUpdateのボタンを押下した際に、
それぞれのオペレーションが実行されるよう関数を定義しています。
```Form1.controller.js
define({ 

 //Type your controller code here 
  GetUser : function(){
    UtilIntegration.invokeOperation(
      "DBService", "GetUser",
      {},{},
      function(result){
        alert(JSON.stringify(result.m_user));
      },
      function(error){
        alert("情報取得に失敗しました。");
      });   
  },
  
  UpdateUser : function(){
    let self = this;
    let Id = self.view.txtUpdateId.text;
    let name = self.view.txtUpdateName.text;
    const param = {
      "id" : Id,
      "name" : name
    };
    UtilIntegration.invokeOperation(
      "DBService", "UpdateUser",
      {},param,
      function(){
        alert("更新しました。");
      },
      function(error){
        alert("更新に失敗しました。");
      });   
  },
  
  CreateUser : function(){
    let self = this;
    let name = self.view.txtAddUser.text;
    const param = {"name" : name};
    UtilIntegration.invokeOperation(
      "DBService", "CreateUser",
      {},param,
      function(){
        alert("登録しました。");
      },
      function(error){
        alert("登録に失敗しました。");
      });   
  },

  DeleteUser : function(){
    let self = this;
    let id = self.view.txtDeleteUser.text;
    const param = {"id" : id};
    UtilIntegration.invokeOperation(
      "DBService", "DeleteUser",
      {},param,
      function(){
        alert("削除しました。");
      },
      function(error){
        alert("削除に失敗しました。");
      });       
  }
 });
```
※Integration Serviceの呼び出しの際、UtilIntegrationという独自のモジュールを呼び出していますが、
中身は、以下の公式ドキュメントと同様の内容となっています。
Integration Serviceを呼び出す場合は、公式ドキュメントをご参照ください。

https://docs.kony.com/konylibrary/konyfabric/kony_fabric_user_guide/Content/KonyStudio/Invoking_Integration_Service_Viz.htm

関数を定義後にそれぞれのボタンにアクション設定することも忘れないようにしましょう。
![スクリーンショット_0004-12-26_17_48_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f09849cc-9ee1-509b-dc0d-42f7eaddb829.png)
![スクリーンショット 0004-12-28 14.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/2579e091-993c-0520-489c-1e00ae2d8f65.png)

それでは、ビルドして確認してみましょう！
（アプリとの接続やビルドの方法がわからない方は下記をご参照ください。）

https://qiita.com/Kony_Team/items/80d6bbab808699ab7bef#2visualizer%E3%81%A8fabric%E3%81%AE%E6%8E%A5%E7%B6%9A



![ezgif-3-d9354c5404.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/cc37a659-db87-9e73-fa84-2a27ddf1201f.gif)
Getボタンでレコード全てを取得、Updateでユーザーの名前を更新、
Createでユーザーの追加、Deleteでユーザー削除ができていることがわかりますね！

# 最後に
今回は、Relational Detabaseを使ってデータ取得などをする方法をご紹介しました。
簡単なデータベースの構造であれば、
すぐにAPIが完成するので便利な機能だと思います！
是非、活用してみてくださいね！

# 参考
https://opensource.hcltechsw.com/volt-mx-docs/docs/documentation/Iris/iris_user_guide/Content/Configure_Database_Service.html