enonic-event-manager について
Enonic Event Managerは、Enonic XPプロジェクトにイベントやWebhook連携を追加するためのエージェントスキルです。アウトバウンドのリスナーやWebhook、インバウンドHTTPエンドポイント、非同期タスクの設定を案内し、外部データとシークレットの安全な扱いも確認します。
主な機能
- 01Enonic XPプロジェクトの検出
- 02アウトバウンドイベントリスナーの設定案内
- 03アウトバウンドWebhook項目の設定
- 04インバウンドHTTPエンドポイントの作成
- 05長時間処理のタスクへの委譲
- 06セキュリティと連携設定の検証
活用シーン
- 01Enonic XPのコンテンツイベントへの対応
- 02外部システムへのイベントWebhook送信
- 03外部Webhookペイロードの受信と検証
- 04時間のかかるイベント処理の非同期実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ webmaxru/ enonic-agent-skills --skill enonic-event-managerインストール後、Claude Code で/enonic-event-managerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/event-listener.template.tshttp-service.template.tsreferences/event-reference.mdexamples.mdtroubleshooting.mdwebhook-reference.mdscripts/find-enonic-targets.mjs詳細
Enonic Event Manager
手順
ステップ 1:Enonic XP プロジェクトを検出する
node scripts/find-enonic-targets.mjs .を実行し、ワークスペース内の Enonic XP プロジェクトのルートを特定します。- スクリプトが空の配列を返した場合は処理を中止し、Enonic XP プロジェクトが見つからなかったことを説明します。
- 複数のプロジェクトが見つかった場合は、どのプロジェクトに統合するかを確認します。
gradle.properties(appName)またはbuild.gradleからアプリケーションキーを特定します。
ステップ 2:統合の方向を判断する
- タスクを次のいずれかに分類します。アウトバウンドイベントリスナー(XP が内部イベントに反応して外部システムを呼び出す)、アウトバウンド Webhook 設定(組み込み設定を使用して XP が Webhook ペイロードを送信する)、インバウンド Webhook エンドポイント(XP が外部システムからペイロードを受信する)、または 混合(これらの組み合わせ)。
- 適切なイベントタイプ、リスナーパターン、フィルタリング戦略を確認するために、
references/event-reference.mdを読みます。 - アウトバウンド Webhook の設定またはインバウンド HTTP サービスエンドポイントが関係する場合は、
references/webhook-reference.mdを読みます。
ステップ 3:アウトバウンドイベントリスナーを実装する(該当する場合)
- ひな形として
assets/event-listener.template.tsを読みます。 - lib-event の
listener()関数を使用して、アプリケーションのmain.ts(またはmain.js)コントローラーにイベントリスナーを登録します。 - 対象ノードイベントに一致するパターン(例:
node.pushed、node.created、node.updated、node.deleted)をtypeパラメーターに指定します。 - コールバック内で
event.data.nodes[].pathを確認してイベントをパスでフィルタリングし、意図したコンテンツツリーだけを処理するようにします。 - リスナーから外部 HTTP エンドポイントを呼び出す必要がある場合は、コールバック内で lib-httpClient の
request()関数を使用するか、バックグラウンドタスクに処理を委譲します。 - 長時間かかる処理は、イベントスレッドをブロックしないよう、lib-task の
executeFunction()を使用してイベントコールバックからバックグラウンドタスクに委譲します。 - CDN の無効化、検索インデックスの再構築、通知の送信を含む完全な統合パターンについては、
references/examples.mdを読みます。
ステップ 4:アウトバウンド Webhook を設定する(該当する場合)
com.enonic.xp.webhooks.cfgの設定形式について、references/webhook-reference.mdを読みます。- Webhook エントリーに送信先 URL とイベントタイプを指定し、
XP_HOME/config/com.enonic.xp.webhooks.cfgにファイルを作成するか、既存のファイルを更新します。 - 設定したイベントタイプが、意図するコンテンツのライフサイクルイベントと一致することを確認します。
- Webhook の送信先には HTTPS URL を使用します。
- 実際のシークレット値を設定ファイルやソースコードに記述しないでください。 説明的なプレースホルダートークン(例:
REPLACE_WITH_CDN_SECRET)を使用し、実際の認証情報は別途差し替えるよう運用担当者に指示します。シークレットはファイルにコミットせず、安全なデプロイパイプライン、環境変数、またはシークレット管理ツールを通じて運用担当者が管理する必要があります。 ステップ 5:受信 Webhook エンドポイントを実装する(該当する場合) - 出発点となるひな形として、
assets/http-service.template.tsを読みます。 src/main/resources/services/<serviceName>/<serviceName>.tsに HTTP サービスコントローラーを作成します。req.bodyから受信した JSON ペイロードを解析するpost(req)関数をエクスポートします。- 解析する前に、妥当なサイズ制限(例:1 MB)を超えるペイロードを拒否します。
- 処理の前に、必須フィールド、認証ヘッダー、または HMAC 署名を確認して、受信ペイロードを検証します。
- 外部ペイロードのすべての文字列フィールドを、コンテンツ操作で使用する前にサニタイズします。空白をトリミングし、最大長を適用し、HTML/スクリプトコンテンツを除去またはエスケープし、パストラバーサルシーケンス(
..、/、\)を含む値を拒否します。 - 生のペイロードオブジェクトをコンテンツ API に渡すのではなく、想定されるフィールド名の許可リストを使用します。
- 適切な HTTP ステータスコードを返します。成功時は
200、ペイロードの形式が不正な場合は400、認証に失敗した場合は401、ペイロードのサイズが大きすぎる場合は413、予期しないエラーの場合は500を返します。 - 受信ペイロードによってコンテンツの作成または変更が行われる場合は、適切な権限を確保するため、コンテキスト実行内で lib-content または lib-node API を使用します。サニタイズされていない外部の値を、コンテンツ名、パス、キーとして渡してはいけません。
ステップ 6:lib-task で非同期処理を連携する(該当する場合)
- イベント処理または Webhook 処理に負荷の高い作業や時間のかかる作業が必要な場合は、lib-task の
executeFunction()でラップします。 - 長時間実行されるタスクから
progress()で進捗を報告し、監視できるようにします。 - タスクのイベントライフサイクル(
task.submitted、task.updated、task.finished、task.failed)については、references/event-reference.mdを読みます。
ステップ 7:連携を検証する
node scripts/find-enonic-targets.mjs .を実行し、プロジェクトが引き続き正しく解決されることを確認します。- アプリケーションの起動時に実行される
main.tsまたはmain.jsファイルで、イベントリスナーが登録されていることを確認します。 - 外部向け HTTP 呼び出しで HTTPS が使用され、ネットワーク障害および 2xx 以外の応答に対するエラー処理が含まれていることを確認します。
- 生成されたソースコードまたは設定ファイルに、実際のシークレット値、API キー、認証情報が含まれておらず、プレースホルダートークンのみが使用されていることを確認します。
- 受信 Webhook エンドポイントで、コンテンツ API に渡す前に外部ペイロードのすべてのフィールドがサニタイズされ、許可リストに含まれていることを確認します。
- Webhook 設定ファイルを作成した場合は、イベントタイプのパターンが意図したトリガーと一致していることを確認します。
- ワークスペースのビルドを実行し、コンパイルエラーがないことを確認します。
- イベントが発生しない場合、Webhook の配信に失敗する場合、または受信リクエストが拒否される場合は、
references/troubleshooting.mdを読みます。
エラー処理
node scripts/find-enonic-targets.mjs .でプロジェクトが見つからない場合は、build.gradleがcom.enonic.xpプラグインを参照していること、またはsrc/main/resources/site/ディレクトリが存在することを確認します。- リスナーを登録した後もイベントが発生しない場合は、
references/troubleshooting.mdを読み、リスナーの登録場所、イベントタイプのパターン、クラスタースコープとローカルイベントスコープを確認します。 - 外部向け HTTP 呼び出しに失敗する場合は、接続先 URL、XP インスタンスからのネットワークアクセス、およびオペレーターがプレースホルダートークンを実際の認証情報に置き換えていることを確認します。
- 受信 Webhook リクエストが 404 を返す場合は、サービスコントローラーのパスが
services/<name>/<name>.tsになっていること、およびアプリケーションがデプロイされていることを確認します。 - バックグラウンドタスクが失敗しても何も記録されない場合は、
taskLib.list()を使ってタスクの状態を確認し、タスク関数内のエラーについてログを調べます。
コメント
Markdown 対応