package store import ( "fmt" "time" "gcy_hpc_server/internal/logger" "gcy_hpc_server/internal/model" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" ) // NewGormDB opens a GORM MySQL connection with sensible defaults. func NewGormDB(dsn string, zapLogger *zap.Logger, gormLevel string) (*gorm.DB, error) { gormCfg := &gorm.Config{ Logger: logger.NewGormLogger(zapLogger, gormLevel), } db, err := gorm.Open(mysql.Open(dsn), gormCfg) if err != nil { return nil, fmt.Errorf("failed to open gorm mysql: %w", err) } sqlDB, err := db.DB() if err != nil { return nil, fmt.Errorf("failed to get underlying sql.DB: %w", err) } sqlDB.SetMaxOpenConns(25) sqlDB.SetMaxIdleConns(5) sqlDB.SetConnMaxLifetime(5 * time.Minute) if err := sqlDB.Ping(); err != nil { return nil, fmt.Errorf("failed to ping mysql: %w", err) } return db, nil } // AutoMigrate runs GORM auto-migration for all models. func AutoMigrate(db *gorm.DB) error { return db.AutoMigrate( &model.Application{}, &model.FileBlob{}, &model.File{}, &model.Folder{}, &model.UploadSession{}, &model.UploadChunk{}, &model.Task{}, ) }