向宁 11315fd00b feat: wire Watermill CQRS — EventBus in usecases, event handlers, router lifecycle
- Add EventPublisher interface in biz layer for domain event publishing
- Wire EventBusPublisher (Watermill EventBus adapter) into FileUsecase, FolderUsecase, ShareUsecase
- Publish events after UploadFile, DeleteFile, CreateFolder, DeleteFolder, CreateShare
- Implement CQRSHandler with logging event handlers for all 6 event types
- Register event handlers via CQRSBus.RegisterHandlers using Watermill EventProcessor
- Store subscriber and wmLogger in CQRSBus for EventProcessor wiring
- Expose SqlDB() on Data struct for Watermill SQL pub/sub
- Start Watermill router in goroutine alongside Kratos app with graceful close
- Use appContext wrapper struct to pass CQRSBus through Wire DI graph
2026-05-25 13:52:05 +08:00

66 lines
1.2 KiB
Go

package main
import (
"context"
"flag"
"os"
"rag/file-system/internal/conf"
"github.com/go-kratos/kratos/v2/config"
fileconfig "github.com/go-kratos/kratos/v2/config/file"
"github.com/go-kratos/kratos/v2/log"
)
var (
flagconf string
)
func init() {
flag.StringVar(&flagconf, "conf", "configs/config.yaml", "config path, eg: -conf config.yaml")
}
func main() {
flag.Parse()
logger := log.With(log.NewStdLogger(os.Stdout),
"ts", log.DefaultTimestamp,
"caller", log.DefaultCaller,
"service.kind", "file-system",
)
c := config.New(
config.WithSource(
fileconfig.NewSource(flagconf),
),
)
if err := c.Load(); err != nil {
panic(err)
}
var bc conf.Bootstrap
if err := c.Scan(&bc); err != nil {
panic(err)
}
ctx, cleanup, err := initApp(&bc, logger)
if err != nil {
panic(err)
}
defer cleanup()
// Start Watermill router alongside the Kratos app.
if ctx.CQRSBus != nil {
go func() {
if err := ctx.CQRSBus.Router.Run(context.Background()); err != nil {
logger.Log(log.LevelError, "msg", "watermill router error", "error", err)
}
}()
defer ctx.CQRSBus.Router.Close()
}
if err := ctx.App.Run(); err != nil {
panic(err)
}
}