diff --git a/backend/llm.txt b/backend/llm.txt index e872473..dc1bbd7 100644 --- a/backend/llm.txt +++ b/backend/llm.txt @@ -222,6 +222,29 @@ In this case: - 在业务结构体中注入 `*job.Job`(见 `backend/providers/job`),然后调用 `obj.job.Add(jobs.XXXJob{...})` 入队。 +--- + +## Events(Watermill) + +本项目使用 `ThreeDotsLabs/watermill` 做事件驱动,并通过框架封装在 `backend/providers/event/` 中(支持 `Go`/`Kafka`/`Redis`/`Sql` 等 channel)。 + +- MUST:事件发布(调用 `PubSub.Publish(...)` 等)只能在 `service` / `controller` / `event` 层编写;其它位置(例如 `middlewares` / `database` / `models` / `providers` 等)禁止发布事件,避免耦合与隐式副作用。 +- MUST:事件订阅处理(subscriber handler)保持“薄”:只做反序列化/幂等与边界校验 → 调用 `services.*` 完成业务。 + +### 生成与结构 + +- 新增事件:`atomctl new event ` + - 会在 `backend/app/events/topics.go` 中新增 topic 常量(形如 `event:`)。 + - 会生成: + - `backend/app/events/publishers/.go`(publisher:实现 `contracts.EventPublisher`,负责 `Marshal()` + `Topic()`) + - `backend/app/events/subscribers/.go`(subscriber:实现 `contracts.EventHandler`,负责 `Topic()` + `Handler(...)`) +- 生成后:按项目约定运行一次 `atomctl gen provider`(用于刷新 DI/provider 生成文件)。 + +### Topic 约定 + +- 统一在 `backend/app/events/topics.go` 维护 topic 常量,避免散落在各处形成“字符串协议”。 +- topic 字符串建议使用稳定前缀(例如 `event:`),并使用 `snake_case` 命名。 + ### 2.2 Enum strategy - DO NOT use native DB ENUM.