关于 enonic-event-manager
Enonic Event Manager 是用于在 Enonic XP 项目中添加事件和 Webhook 集成的 Agent 技能。它指导配置出站监听器与 Webhook、入站 HTTP 端点和异步任务,并强调外部负载与密钥的安全处理。
主要功能
- 01检测 Enonic XP 项目根目录
- 02指导配置出站事件监听器
- 03配置出站 Webhook 条目
- 04搭建入站 HTTP 端点
- 05将长任务交由后台任务处理
- 06验证安全与集成配置
适用场景
- 01响应 Enonic 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,将其作为初始脚手架。 - 在应用程序的
main.ts(或main.js)控制器中,使用 lib-event 的listener()函数注册事件监听器。 - 使用
type参数设置与目标节点事件匹配的模式(例如node.pushed、node.created、node.updated、node.deleted)。 - 在回调中检查
event.data.nodes[].path,按路径过滤事件,以将处理范围限制在目标内容树中。 - 如果监听器需要调用外部 HTTP 端点,请在回调中使用 lib-httpClient 的
request()函数,或将任务委派给后台任务。 - 对于耗时较长的处理,请使用 lib-task 的
executeFunction()将工作从事件回调委派给后台任务,以免阻塞事件线程。 - 阅读
references/examples.md,了解完整的集成模式,包括 CDN 缓存失效、搜索重新索引和通知分发。
步骤 4:配置出站 webhook(如适用)
- 阅读
references/webhook-reference.md,了解com.enonic.xp.webhooks.cfg配置格式。 - 在
XP_HOME/config/com.enonic.xp.webhooks.cfg创建或更新文件,添加指定目标 URL 和事件类型的 webhook 条目。 - 验证配置的事件类型与预期的内容生命周期事件相匹配。
- webhook 目标地址请使用 HTTPS URL。
- 切勿将实际密钥值写入配置文件或源代码。 使用描述性的占位符令牌(例如
REPLACE_WITH_CDN_SECRET),并指示操作人员通过其他渠道替换为真实凭据。密钥必须由操作人员通过安全部署流水线、环境变量或密钥管理工具进行管理,不得提交到文件中。 步骤 5:实现入站 webhook 端点(如适用) - 阅读
assets/http-service.template.ts,将其作为起始脚手架。 - 在
src/main/resources/services/<serviceName>/<serviceName>.ts创建 HTTP 服务控制器。 - 导出
post(req)函数,从req.body解析传入的 JSON 负载。 - 在解析前,拒绝超出合理大小限制(例如 1 MB)的负载。
- 在处理入站负载前,通过检查必需字段、身份验证标头或 HMAC 签名来验证负载。
- 在内容操作中使用外部负载中的字符串字段之前,先对其进行清理:去除首尾空格、限制最大长度、剥离或转义 HTML/脚本内容,并拒绝包含路径遍历序列(
..、/、\)的值。 - 使用预期字段名称的允许列表,而不要将原始负载对象传递给内容 API。
- 返回适当的 HTTP 状态码:成功时返回
200,负载格式错误时返回400,身份验证失败时返回401,负载过大时返回413,出现意外错误时返回500。 - 当入站负载触发内容创建或修改时,在上下文运行中使用 lib-content 或 lib-node API,以确保权限正确。绝不要将未经清理的外部值用作内容名称、路径或键。
步骤 6:使用 lib-task 接入异步处理(如适用)
- 当事件处理或 webhook 处理需要执行繁重或耗时的工作时,将其封装在 lib-task 的
executeFunction()中。 - 使用
progress()报告长时间运行的任务进度,以便监控。 - 阅读
references/event-reference.md,了解任务事件生命周期(task.submitted、task.updated、task.finished、task.failed)。
步骤 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