向宁 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

55 lines
1.8 KiB
Go

package watermark
import (
"context"
"github.com/go-kratos/kratos/v2/log"
)
// CQRSHandler holds all Watermill event handlers.
type CQRSHandler struct {
log *log.Helper
}
// NewCQRSHandler creates a new CQRSHandler.
func NewCQRSHandler(logger log.Logger) *CQRSHandler {
return &CQRSHandler{log: log.NewHelper(logger)}
}
// OnFileUploaded handles the FileUploadedEvent.
func (h *CQRSHandler) OnFileUploaded(ctx context.Context, event *FileUploadedEvent) error {
h.log.Infof("event: file uploaded, bucket=%s key=%s size=%d", event.BucketName, event.ObjectKey, event.Size)
return nil
}
// OnFileDeleted handles the FileDeletedEvent.
func (h *CQRSHandler) OnFileDeleted(ctx context.Context, event *FileDeletedEvent) error {
h.log.Infof("event: file deleted, bucket=%s key=%s", event.BucketName, event.ObjectKey)
return nil
}
// OnFolderCreated handles the FolderCreatedEvent.
func (h *CQRSHandler) OnFolderCreated(ctx context.Context, event *FolderCreatedEvent) error {
h.log.Infof("event: folder created, id=%s name=%s owner=%s", event.FolderID, event.Name, event.OwnerID)
return nil
}
// OnFolderDeleted handles the FolderDeletedEvent.
func (h *CQRSHandler) OnFolderDeleted(ctx context.Context, event *FolderDeletedEvent) error {
h.log.Infof("event: folder deleted, id=%s owner=%s", event.FolderID, event.OwnerID)
return nil
}
// OnShareCreated handles the ShareCreatedEvent.
func (h *CQRSHandler) OnShareCreated(ctx context.Context, event *ShareCreatedEvent) error {
h.log.Infof("event: share created, id=%s token=%s resource=%s/%s by=%s",
event.ShareID, event.Token, event.ResourceType, event.ResourceID, event.CreatedBy)
return nil
}
// OnShareDownloaded handles the ShareDownloadedEvent.
func (h *CQRSHandler) OnShareDownloaded(ctx context.Context, event *ShareDownloadedEvent) error {
h.log.Infof("event: share downloaded, token=%s", event.Token)
return nil
}