- 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
101 lines
3.2 KiB
Go
101 lines
3.2 KiB
Go
// Code generated by Wire. DO NOT EDIT.
|
|
|
|
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
|
|
//go:build !wireinject
|
|
// +build !wireinject
|
|
|
|
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"github.com/go-kratos/kratos/v2"
|
|
"github.com/go-kratos/kratos/v2/log"
|
|
"github.com/go-kratos/kratos/v2/transport/grpc"
|
|
"github.com/go-kratos/kratos/v2/transport/http"
|
|
"rag/file-system/internal/biz"
|
|
"rag/file-system/internal/conf"
|
|
"rag/file-system/internal/data"
|
|
"rag/file-system/internal/server"
|
|
"rag/file-system/internal/service"
|
|
"rag/file-system/internal/watermark"
|
|
)
|
|
|
|
// Injectors from wire.go:
|
|
|
|
// initApp wires up the entire dependency graph.
|
|
func initApp(bootstrap *conf.Bootstrap, logger log.Logger) (*appContext, func(), error) {
|
|
confServer := newConfServer(bootstrap)
|
|
auth := newConfAuth(bootstrap)
|
|
confData := newConfData(bootstrap)
|
|
fileRepo := data.NewFileRepo(confData)
|
|
dataData, cleanup, err := data.NewData(confData, logger)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
db, err := newSQLDB(dataData)
|
|
if err != nil {
|
|
cleanup()
|
|
return nil, nil, err
|
|
}
|
|
cqrsHandler := watermark.NewCQRSHandler(logger)
|
|
cqrsBus, err := watermark.NewCQRSBusWithHandlers(db, cqrsHandler, logger)
|
|
if err != nil {
|
|
cleanup()
|
|
return nil, nil, err
|
|
}
|
|
eventBusPublisher := watermark.NewEventBusPublisher(cqrsBus)
|
|
fileUsecase := biz.NewFileUsecase(fileRepo, eventBusPublisher, logger)
|
|
bucketUsecase := biz.NewBucketUsecase(fileRepo, logger)
|
|
folderRepo := data.NewFolderRepo(dataData, logger)
|
|
fileMetaRepo := data.NewFileMetaRepo(dataData, logger)
|
|
folderUsecase := biz.NewFolderUsecase(folderRepo, fileMetaRepo, fileRepo, eventBusPublisher, logger)
|
|
shareRepo := data.NewShareRepo(dataData, logger)
|
|
shareUsecase := biz.NewShareUsecase(shareRepo, fileMetaRepo, fileRepo, eventBusPublisher, logger)
|
|
fileService := service.NewFileService(fileUsecase, bucketUsecase, folderUsecase, shareUsecase, logger)
|
|
httpServer := server.NewHTTPServer(confServer, auth, fileService, logger)
|
|
grpcServer := server.NewGRPCServer(confServer, auth, fileService, logger)
|
|
app := newApp(logger, httpServer, grpcServer)
|
|
mainAppContext := newAppContext(app, cqrsBus)
|
|
return mainAppContext, func() {
|
|
cleanup()
|
|
}, nil
|
|
}
|
|
|
|
// wire.go:
|
|
|
|
// appContext holds the Kratos app and CQRS bus together for Wire.
|
|
type appContext struct {
|
|
App *kratos.App
|
|
CQRSBus *watermark.CQRSBus
|
|
}
|
|
|
|
// newApp creates a new Kratos application with HTTP and gRPC servers.
|
|
func newApp(logger log.Logger, hs *http.Server, gs *grpc.Server) *kratos.App {
|
|
return kratos.New(kratos.Name("file-system"), kratos.Logger(logger), kratos.Server(hs, gs))
|
|
}
|
|
|
|
// newAppContext wraps the app and CQRSBus into an appContext.
|
|
func newAppContext(app *kratos.App, bus *watermark.CQRSBus) *appContext {
|
|
return &appContext{App: app, CQRSBus: bus}
|
|
}
|
|
|
|
// newConfServer extracts the Server config from Bootstrap.
|
|
func newConfServer(bc *conf.Bootstrap) *conf.Server {
|
|
return bc.GetServer()
|
|
}
|
|
|
|
// newConfData extracts the Data config from Bootstrap.
|
|
func newConfData(bc *conf.Bootstrap) *conf.Data {
|
|
return bc.GetData()
|
|
}
|
|
|
|
// newConfAuth extracts the Auth config from Bootstrap.
|
|
func newConfAuth(bc *conf.Bootstrap) *conf.Auth {
|
|
return bc.GetAuth()
|
|
}
|
|
|
|
// newSQLDB extracts the underlying *sql.DB from Data for Watermill.
|
|
func newSQLDB(d *data.Data) (*sql.DB, error) {
|
|
return d.SqlDB()
|
|
}
|