feat: 添加事件驱动规则和生成结构说明

This commit is contained in:
2025-12-22 22:35:04 +08:00
parent a869540d9c
commit 201c55f055

View File

@@ -222,6 +222,29 @@ In this case:
- 在业务结构体中注入 `*job.Job`(见 `backend/providers/job`),然后调用 `obj.job.Add(jobs.XXXJob{...})` 入队。 - 在业务结构体中注入 `*job.Job`(见 `backend/providers/job`),然后调用 `obj.job.Add(jobs.XXXJob{...})` 入队。
---
## EventsWatermill
本项目使用 `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 <Name>`
- 会在 `backend/app/events/topics.go` 中新增 topic 常量(形如 `event:<snake_case>`)。
- 会生成:
- `backend/app/events/publishers/<snake_case>.go`publisher实现 `contracts.EventPublisher`,负责 `Marshal()` + `Topic()`
- `backend/app/events/subscribers/<snake_case>.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 ### 2.2 Enum strategy
- DO NOT use native DB ENUM. - DO NOT use native DB ENUM.