feat(app): wire file storage DI, cleanup worker, and integration tests
Add DI wiring with graceful MinIO fallback, background cleanup worker for expired sessions and leaked multipart uploads, and end-to-end integration tests. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -15,6 +15,7 @@ import (
|
||||
"gcy_hpc_server/internal/server"
|
||||
"gcy_hpc_server/internal/service"
|
||||
"gcy_hpc_server/internal/slurm"
|
||||
"gcy_hpc_server/internal/storage"
|
||||
"gcy_hpc_server/internal/store"
|
||||
|
||||
"go.uber.org/zap"
|
||||
@@ -22,10 +23,11 @@ import (
|
||||
)
|
||||
|
||||
type App struct {
|
||||
cfg *config.Config
|
||||
logger *zap.Logger
|
||||
db *gorm.DB
|
||||
server *http.Server
|
||||
cfg *config.Config
|
||||
logger *zap.Logger
|
||||
db *gorm.DB
|
||||
server *http.Server
|
||||
cancelCleanup context.CancelFunc
|
||||
}
|
||||
|
||||
// NewApp initializes all application dependencies: DB, Slurm client, services, handlers, router.
|
||||
@@ -41,13 +43,14 @@ func NewApp(cfg *config.Config, logger *zap.Logger) (*App, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
srv := initHTTPServer(cfg, gormDB, slurmClient, logger)
|
||||
srv, cancelCleanup := initHTTPServer(cfg, gormDB, slurmClient, logger)
|
||||
|
||||
return &App{
|
||||
cfg: cfg,
|
||||
logger: logger,
|
||||
db: gormDB,
|
||||
server: srv,
|
||||
cfg: cfg,
|
||||
logger: logger,
|
||||
db: gormDB,
|
||||
server: srv,
|
||||
cancelCleanup: cancelCleanup,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -83,6 +86,10 @@ func (a *App) Run() error {
|
||||
func (a *App) Close() error {
|
||||
var errs []error
|
||||
|
||||
if a.cancelCleanup != nil {
|
||||
a.cancelCleanup()
|
||||
}
|
||||
|
||||
if a.server != nil {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
@@ -138,7 +145,7 @@ func initSlurmClient(cfg *config.Config) (*slurm.Client, error) {
|
||||
return client, nil
|
||||
}
|
||||
|
||||
func initHTTPServer(cfg *config.Config, db *gorm.DB, slurmClient *slurm.Client, logger *zap.Logger) *http.Server {
|
||||
func initHTTPServer(cfg *config.Config, db *gorm.DB, slurmClient *slurm.Client, logger *zap.Logger) (*http.Server, context.CancelFunc) {
|
||||
jobSvc := service.NewJobService(slurmClient, logger)
|
||||
clusterSvc := service.NewClusterService(slurmClient, logger)
|
||||
jobH := handler.NewJobHandler(jobSvc, logger)
|
||||
@@ -148,12 +155,49 @@ func initHTTPServer(cfg *config.Config, db *gorm.DB, slurmClient *slurm.Client,
|
||||
appSvc := service.NewApplicationService(appStore, jobSvc, cfg.WorkDirBase, logger)
|
||||
appH := handler.NewApplicationHandler(appSvc, logger)
|
||||
|
||||
router := server.NewRouter(jobH, clusterH, appH, logger)
|
||||
// File storage initialization
|
||||
minioClient, err := storage.NewMinioClient(cfg.Minio)
|
||||
if err != nil {
|
||||
logger.Warn("failed to initialize MinIO client, file storage disabled", zap.Error(err))
|
||||
}
|
||||
|
||||
var uploadH *handler.UploadHandler
|
||||
var fileH *handler.FileHandler
|
||||
var folderH *handler.FolderHandler
|
||||
|
||||
if minioClient != nil {
|
||||
blobStore := store.NewBlobStore(db)
|
||||
fileStore := store.NewFileStore(db)
|
||||
folderStore := store.NewFolderStore(db)
|
||||
uploadStore := store.NewUploadStore(db)
|
||||
|
||||
uploadSvc := service.NewUploadService(minioClient, blobStore, fileStore, uploadStore, cfg.Minio, db, logger)
|
||||
folderSvc := service.NewFolderService(folderStore, fileStore, logger)
|
||||
fileSvc := service.NewFileService(minioClient, blobStore, fileStore, cfg.Minio.Bucket, db, logger)
|
||||
|
||||
uploadH = handler.NewUploadHandler(uploadSvc, logger)
|
||||
fileH = handler.NewFileHandler(fileSvc, logger)
|
||||
folderH = handler.NewFolderHandler(folderSvc, logger)
|
||||
|
||||
cleanupCtx, cancelCleanup := context.WithCancel(context.Background())
|
||||
go startCleanupWorker(cleanupCtx, uploadStore, minioClient, cfg.Minio.Bucket, logger)
|
||||
|
||||
router := server.NewRouter(jobH, clusterH, appH, uploadH, fileH, folderH, logger)
|
||||
|
||||
addr := ":" + cfg.ServerPort
|
||||
|
||||
return &http.Server{
|
||||
Addr: addr,
|
||||
Handler: router,
|
||||
}, cancelCleanup
|
||||
}
|
||||
|
||||
router := server.NewRouter(jobH, clusterH, appH, uploadH, fileH, folderH, logger)
|
||||
|
||||
addr := ":" + cfg.ServerPort
|
||||
|
||||
return &http.Server{
|
||||
Addr: addr,
|
||||
Handler: router,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user