Webhook 与事件
M-Doc 内置事件驱动架构,支持监听文档和文章的生命周期事件。
事件总线
M-Doc 使用同步事件总线(EventBus),在操作完成后触发事件通知所有注册的监听器。
Service 层操作完成
↓
EventBus.Dispatch(event)
↓
按优先级执行所有监听器
支持的事件
文档事件
| 事件名称 |
触发时机 |
document.created |
文档创建成功后 |
document.updated |
文档更新成功后 |
document.deleted |
文档删除成功后 |
文章事件
| 事件名称 |
触发时机 |
article.created |
文章创建成功后 |
article.updated |
文章内容更新后 |
article.deleted |
文章删除后 |
article.published |
文章发布后 |
article.merged |
文章合并成功后 |
article.reverted |
文章回退成功后 |
内置监听器
| 监听器 |
事件 |
作用 |
| ArticleLoggerListener |
所有文章事件 |
记录操作日志 |
| DocumentLoggerListener |
所有文档事件 |
记录操作日志 |
| SummarizeListener |
article.published |
生成 AI 摘要 |
| VectorizeListener |
article.created/updated/deleted/published |
管理向量索引 |
自定义监听器
实现接口
type MyListener struct{}
func (l *MyListener) Handle(evt event.Event) error {
switch e := evt.(type) {
case *types.ArticlePublishedEvent:
// 处理文章发布事件
fmt.Printf("文章 %d 已发布: %s\n", e.ArticleID, e.Title)
}
return nil
}
func (l *MyListener) Priority() int {
return 10 // 优先级(数字越小越先执行)
}
注册监听器
bus := event.GetEventBus()
bus.Register("article.published", &MyListener{})
使用函数注册
bus.RegisterFunc("article.published", 10, func(evt event.Event) error {
// 处理逻辑
return nil
})
优先级规范
| 范围 |
用途 |
| 0-9 |
系统级(日志记录) |
| 10-49 |
业务逻辑(通知、缓存) |
| 50-99 |
重量级操作(向量化、AI) |
事件数据
ArticlePublishedEvent
type ArticlePublishedEvent struct {
ArticleID uint
DocumentID uint
VersionID uint
ArticleVersionID uint
Title string
Content string // Markdown 内容
CommitHash string
ShortHash string
CommitMessage string
PublishedBy uint
PublishedAt time.Time
}
注意事项
- 监听器错误不会中断主请求
- 避免在监听器中触发循环事件
- 耗时操作建议使用 goroutine 异步处理
- 可通过配置开关控制监听器启用/禁用