はじめに
プリザンターには任意のWebAPIやWebページを追加することが可能な拡張ライブラリ機能が実装されています。今回は、拡張ライブラリ機能を使用してWebAPIを追加する方法を紹介します。
コードを書いてみよう
プリザンター側の既存実装を確認
プリザンター側では、アプリケーション起動時に外部のDLLを読み取る機能が実装されています。
ここですね。GetExtendedLibraryPathsで対象となるパスを取得しています。
Assembly.GetEntryAssembly().Location配下のExtendedLibrariesが対象になっています。プリザンターがマニュアル通りにインストールされている環境下であれば、wwwroot\ExtendedLibrariesが対象となります。その配下のDLLをまとめて読み込んで、MvcBuilderで読み込んでいます。
そのうち、名前空間がImplem.Pleasanter.NetCore.ExtendedLibrary.ExtendedLibraryとなっているものについては、Initializeメソッドの読み出しにも対応しています。今回はInitializeは使用しないので、名前空間は無視してしまってOKです。
プロジェクトを作成
では、プロジェクトを作成してみます。VSCodeで適当なプロジェクトを作成します。プリザンターはVer 1.5.0.0から.NET10になっているので、.NET10で、クラスライブラリを作成します。
dotnet new classlib -n MyExtendedLibrary -f net10.0
ライブラリを追加
プロジェクトを編集して外部ライブラリへの参照を追加します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup>
<!-- ASP.NET Core MVC参照 -->
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
APIコントローラを作成
適当なAPIコントローラを作成してみます。よくあるHelloとEchoを行うAPIです。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace MyExtendedLibrary.Controllers
{
[AllowAnonymous]
[ApiController]
[Route("api/[controller]")]
public class CustomApiController : ControllerBase
{
[HttpGet("hello")]
public IActionResult Hello()
{
return Ok(new { message = "Hello from Extended Library!" });
}
[HttpPost("echo")]
public IActionResult Echo([FromBody] object data)
{
return Ok(new { echo = data });
}
}
}
前述のInitializeを用いて初期化操作を行いたい時は下記のようなものを作れば対応が可能です。
namespace Implem.Pleasanter.NetCore.ExtendedLibrary
{
public static class ExtendedLibrary
{
public static void Initialize()
{
// 拡張DLL起動時の初期化処理
// バックグラウンドワーカーの起動など
Console.WriteLine("ExtendedLibrary initialized!");
}
}
}
ただし、実用しようとすると名前空間が固定されていることがかなり面倒な制約となるので、使用するケースはあまりないように思います。
DLLの配置
ビルドしたDLLを下記のいずれかに配置します。オススメはサブディレクトリに配置する方法です。この方法ならライブラリごとに配置場所を分けられるのでメンテナンスも楽に行えます。
| 配置場所 | パス |
|---|---|
| 基本 | wwwroot/ExtendedLibraries/ |
| サブディレクトリ | wwwroot/ExtendedLibraries/MyPlugin/ |
パスは便宜的にwwwrootと書いていますが、適時プリザンターのルートパスに書き換えてください。
認証付きにするには
APIを認証付きにすることも可能です。プリザンターの既存の実装を流用することで実現が可能です。
プリザンターのCommunity EditionのライセンスはAGPLです。作成したライブラリに対しても同条件での配布が必要になります。
Contextというモデルを使用することで、プリザンターに登録済みのユーザであることが確認出来ます。使い方は非常に簡単です。Implem.Pleasanterをプロジェクト参照に追加して、下記の方法でContextをコールします。
//リクエストでも埋込でも
var apiKey = "外部から与えられたAPIキー";
//Implem.Pleasanter.Libraries.Requests.Apiにデシリアライズ可能であること
var req = JsonSerializer.Serialize(new { ApiKey = apiKey });
var context = new Context(
sessionStatus: false,
sessionData: false,
apiRequestBody: req,
contentType: "application/json",
api: true);
こうするとContextが生成されます。context.Authenticatedがtrueであれば認証されています。その状態だと、context.UserIdであったりcontext.LoginIdなどのユーザ情報も取得することが可能です。contextの詳細については、コードを読んでみてください。
動作確認
/api/CustomApi/helloに対してGETでアクセスしてみてください。Hello from Extended Library!とメッセージが返却されます。
まとめ
今回はプリザンターの拡張ライブラリ機能を使用する方法を紹介しました。この方法を使用すると、カレンダーに対してiCalのインターフェースを追加したり、Webhookをうけるためのインターフェースを追加することが可能になり、外部の他システムとの接続性を拡大することが出来ます。是非試して見てください。