プリザンターに独自のエンドポイントを追加する

本エントリはOSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2024の7日目の記事です。

https://qiita.com/advent-calendar/2024/pleasanter

# 独自のエンドポイントを追加する拡張コントローラ

プリザンターには、独自に実装したコントローラ（以降、拡張コントローラと呼びます）をプラグインとして追加する機能があります。
この機能を使うことで例えば、下記のような拡張エンドポイントを追加することが可能になります。

- チャットボットサービスと連携するWebhookのエンドポイント
- 特定のデータを集計し、カスタムレポートを生成するエンドポイント
- 他のシステムやサービスとデータをやり取りするためのエンドポイント

この記事では、拡張コントローラプラグインの開発方法について解説いたします。

## 前提
- この記事ではWindows PCでの開発、デバッグを想定しています
- Visual Studioがインストールされていること
- .NET8.0のSKDがインストールされていること

:::note info
MacやLinux と VSCodeでも同様の開発は可能です。ご利用の環境に合わせて適宜読み替えて試してみてください。
:::


## 事前準備
下記の手順でWindows PCにPleasanterのインストールをしておきます。

https://pleasanter.org/ja/manual/getting-started-pleasanter-windows

## サンプルコードで試してみる


### サンプルコードの取得
GitHubより下記リポジトリのソースコードをCloneします。

- 独自のエンドポイントを追加するクラスライブラリ `PleasanterWebHook`

https://github.com/pleasanter-developer-community/PleasanterWebHook

- デバッグに使用するPleasanterの本体

https://github.com/Implem/Implem.Pleasanter

ここでは、Clone先のローカルフォルダを `C:\work\pleasanter-dev` とした場合を前提として進めます。
```posh
cd c:\work\pleasanter-dev
git clone https://github.com/Implem/Implem.Pleasanter.git
git clone https://github.com/pleasanter-developer-community/PleasanterWebHook.git
```
### Plesanterのデバッグ実行
- `C:\work\pleasanter-dev\Implem.Pleasanter\Implem.Pleasanter.sln` をVisual Studioで開きます

- プリザンターインストール時の設定に合わせて　`App_Data\Parameters\Rds.json`を修正します

```json
{
    "Dbms": "PostgreSQL",
    "Provider": "Local",
    "SaConnectionString": "Server=localhost;Database=postgres;UID=postgres;PWD=SetSaPWD",
    "OwnerConnectionString": "Server=localhost;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD",
    "UserConnectionString": "Server=localhost;Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD",
    "SqlCommandTimeOut": 0,
    "MinimumTime": 3,
    "DeadlockRetryCount": 4,
    "DeadlockRetryInterval": 1000,
    "DisableIndexChangeDetection": true,
    "SysLogsSchemaVersion": 1
}
```

- デバッグ実行してログイン画面が表示されることを確認してください
- 確認出来たら、デバッグ実行を停止します


### PleasanterWebHookのビルドと配置
- `C:\work\pleasanter-dev\PleasanterWebHook\PleasanterWebHook.sln` をVisual Studioで開きます
- メニューバーから「ビルド」-「PleasanaterWebHookの発行」を選択
- 「＋新しいプロファイル」をクリック
- 公開のターゲットを「フォルダー」として「次へ」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/78172103-1f2e-a6b9-7111-9935c2406eb5.png)

- 「フォルダーの場所」を下記の通りに設定し、「完了」をクリックします
   `C:\Work\pleasanter-dev\Implem.Pleasanter\Implem.Pleasanter\bin\Debug\net8.0\ExtendedLibraries`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/9f77c067-00d0-e2a1-6b75-9aa90f0985cc.png)

- 公開プロファイルが作成されたら、「全ての設定を表示」のリンクをクリックしてダイアログを開き「構成」をDebugに変更して「保存」します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/92b4fa2a-4e6a-6f95-570f-5689c7898e93.png)


- 「発行」 ボタンをクリックし、PleasanterWebHookのモジュール一式を設定したフォルダーに発行します


### 動作確認
もう一度プリザンターをデバッグ実行し、ブラウザのアドレスバーに `{サーバー名}/webhook` を入力します。
ブラウザに下記の文字列が表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/7893c593-cccd-1c7f-f23e-af9e2a2b9bb7.png)

## 解説
新しいエンドポイントは、MVCコントローラを実装した.NETクラスライブラリを用意することで追加可能です。下記の手順でクラスライブラリのモジュールを作成します。

### .NETクラスライブラリを作成する
まず、C#のプロジェクトをクラスライブラリのテンプレートから作成します。
作成後、プロジェクトファイル（.csproj)を開き、`Project Sdk`を`Microsoft.NET.Sdk.Web` に変更します。

```xml
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <OutputType>Library</OutputType>
  </PropertyGroup>
</Project>

```

### `ControllerBase`を継承したコントローラクラスを実装する
次に`Microsoft.AspNetCore.Mvc.ControllerBase`を継承したクラスを作成し、そこに追加したいエンドポイントの処理を実装します。

```cs
[Route("[controller]")]
[ApiController]
[AllowAnonymous]
public class WebHookController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok($"{nameof(WebHookController)} is available !");
    }
}
```

上記クラスライブラリをビルドして生成されたモジュール一式を下記場所に配置することで、拡張コントロールとして動作します。

`{プリザンターのインストールフォルダ}\ExtendedLibraries`

:::note info
`{プリザンターのインストールフォルダ}`は`Implem.Pleasanter.dll`などのバイナリファイルが格納されているフォルダを指します。また、`ExtendedLibraries`フォルダの下にサブフォルダを作成してその中に配置してもOKです。
- 例: `C:\web\pleasanter\Implem.Pleasanter\ExtendedLibraries\webhook\`
:::


## デバッグ方法

追加モジュール側のデバッグにはVisual Studioの「プロセスのアタッチ」機能を使います。

1. デバッグ用プリザンターをVisual Studioから「デバッグなしで開始（Ctrl + F5）」で実行します
1. PleasanterWebHook側のVisual Studioで「デバッグ」-「プロセスにアタッチ」をメニューから選択します
1. プロセスのアタッチダイアログで「iisexpress.exe」を探し、これを選択して「アタッチ」します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/4a8ef454-1ce9-8ebf-52a9-1a9b47df7c6b.png)


:::note info
`iisexpress.exe`は、`プリザンターのデバッグの構成で「IIS Express」を選んだ場合にアタッチするプロセス名です。
`Implem.Pleasanter.NetCore`を選択して実行している場合は「Implem.Pleasanter.exe」にアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/402cd2e0-664b-9241-a100-155aadecc268.png)
:::


アタッチ後はPleasanterWebHook側のソースコードにブレークポイントを設定してステップ実行などのデバッグが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28805/46ccda37-8473-bedf-e43d-15e64a91d511.png)

## 次回へ続く
これでプリザンターに新しいエンドポイントを追加するモジュールを開発するための準備が整いました。

次回はもう少し実用的な例として、LINE BotのWebhookを実装してみたいと思います。