Webhook 与事件

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 异步处理
  • 可通过配置开关控制监听器启用/禁用