PleasanterのAPIの呼び出しコードを生成するツールを作った(Glue code生成プログラムを作ってみた)

### 概要

- PleasanterのAPIを呼び出すコードは型に守られたいと思いますよね?
- PleasanterをAPIから呼び出すときに、画面上に表示される名称を指定して呼び出して呼び出したいと思いますよね?
- サイトパッケージのエクスポートファイルから呼び出しコードを生成するプログラムを作成しました
- TypeScript,C#,SQLからの呼び出しコードを生成してくれます

---

### 使い方

#### 0.環境

コマンドはdocker環境として配布されています。
docker環境を用意してください。

#### 1.サイトのエクスポートのエクトポート

コードを生成する対象となるサイトパッケージをエクスポートしてJSON形式のファイルを作成してください。

[サイト機能：サイトパッケージのエクスポート](https://pleasanter.org/manual/site-package-export)


#### 2.コードの生成

以下、コマンドはカレントディレクトリを作業用ディレクトリとして想定しています。
コマンドはbashを想定して書いています。dos環境の方は$(pwd)を%CD%に置換してください。
`export.json`というファイルがサイトパッケージをエクスポートしたファイルです。カレントディレクトリに配置されていると想定します。

```bash
docker run --rm -v $(pwd):/local yamada28go/hack-pleasanter-api-cli2:latest /local Generation export.json
```

コマンドを実行すると、コードが生成されます。
生成されたコードは以下となります。

```
├── HackPleasanterApi.Csharp.git
│   └── PleasanterApiLib
│       ├── Models
│       │   └── 記録テーブルModel.cs
│       ├── PleasanterApiLib.csproj
│       ├── Services
│       │   └── 記録テーブルService.cs
├── HackPleasanterApi.PostgreSQL
│   └── Generated
│       ├── CreateView
│       │   └── _記録テーブル_TempView.sql
│       └── DropView
│           └── _記録テーブル_DropTempView.sql
├── HackPleasanterApi.pleasanter-web-script.git
│   └── Generated
│       ├── Models
│       │   └── 記録テーブルModel.ts
│       └── Services
│           └── 記録テーブルService.ts
```

生成コマンドの動作は設定ファイルでカスタマイズする事が出来ます。
コードの生成に使用するテンプレートファイルのバージョンを固定する事も出来ますので、
長期的に使用するコードを生成する場合は、設定ファイルでバージョン指定する事をお勧めします。
設定方法は[Readme](https://github.com/yamada28go/HackPleasanterApiCli)を参照してください。

#### 3.ライブラリ

生成されたコードのを実行するためには、補助ライブラリが必用です。
各言語と補助ライブラリの関係を以下に示します。

##### 3.1 ライブラリ C#

C#の場合、以下パッケージをnugetから入れてください。

[HackPleasanterApi.Csharp](https://www.nuget.org/packages/HackPleasanterApi.Csharp)

コードの実装イメージは以下です。
詳細な説明は[pleasanter API接続用　Glue code生成プログラムを作ってみた　C# ライブラリの説明](https://qiita.com/yamada28go/items/98db1e9f6f69f8ccb07b)を参照してください。

```C#
var s = new 記録テーブルService(cfg);

// テストデータはすべて消去する
var del = await s.DeleteALL(true);


var data = new CsharpSamples.Generated.Models.記録テーブルModel();

data.BasicItemData.Title = "タイトルてすと";
data.BasicItemData.Body = "本文";

// 個別の試験用データを設定する
data.ExtensionElements.CheckA = true;
data.ExtensionElements.TypeA = "TypeA";

// itemを生成する
var x = await s.CreateItem(data);
```

##### 3.2 ライブラリ PostgreSQL

PostgreSQLの場合、CREATE VIEWが生成されます。
view経由でdbを操作する事で画面上に表示される名称と同一の名称でデータを操作する事が出来ます。

```SQL
CREATE VIEW "V__記録テーブル" as
SELECT
  "SiteId",
  "ResultId" as "_記録テーブルId",

-- ・・・
  
  -- ユーザー定義項目
  "AttachmentsA" as "テストデータ_添付ファイルA" -- テストデータ_添付ファイルA,
  "CheckA" as "CheckA",
  "ClassB" as "テストデータ_分類B" -- テストデータ_分類B,
  -- ユーザー定義項目
FROM
  "public"."Results"
where
  "SiteId" = 2;
```

##### 3.3 ライブラリ TypeScript

画面スクリプト用のコードが生成されます。
TypeScriptのコードであるため、[TypeScriptのビルド環境](https://qiita.com/yamada28go/items/1dde681e915edacebea1)が必用です。
ビルド環境を構築してください。


このコードを実行するためには、サポートライブラリが必用です。
以下パッケージを入れてください。

[@yamada28go/pleasanter-web-script-type-helper](https://www.npmjs.com/package/@yamada28go/pleasanter-web-script-type-helper)

コードの実装例は以下となります。

```TypeScript

  const s = new 記録テーブルService();
  const data = await s.apiGet(5223);
 
  const a = data.CheckA;
  const ta = data.TypeA;

```

また、このライブラリにはpleasanterの非同期処理をasyncに置き換えるラッパー関数がも実装されています。
こちらを使う事で以下のように、asyncを使う事が出来るようになります。

```TypeScript
// オリジナルAPI
$p.apiGet({
  id: 1545,
  done: (data) => {
    console.log(data);
    debugger;
  },
});

// ラッパーAPI
const tt = await apiGetAsync(5223);

```