package app import ( "fmt" "gorm.io/gorm" "github.com/dhao2001/mygo/internal/config" "github.com/dhao2001/mygo/internal/repository" "github.com/dhao2001/mygo/internal/service" ) // WebApp contains application-wide runtime dependencies and metadata. type WebApp struct { Config *config.Config Version string DB *gorm.DB UserRepo repository.UserRepository SessionRepo repository.SessionRepository FileRepo repository.FileRepository CredentialRepo repository.CredentialRepository AuthService *service.AuthService } // Bootstrap creates a fully initialized WebApp from config. // It opens the database, runs migrations, and wires all repositories and services. func Bootstrap(cfg *config.Config) (*WebApp, error) { db, err := repository.Open(cfg.Database) if err != nil { return nil, fmt.Errorf("open database: %w", err) } if err := repository.AutoMigrate(db); err != nil { return nil, fmt.Errorf("migrate database: %w", err) } userRepo := repository.NewUserRepository(db) sessionRepo := repository.NewSessionRepository(db) fileRepo := repository.NewFileRepository(db) credentialRepo := repository.NewCredentialRepository(db) jwtSecret := []byte(cfg.JWT.Secret) authService := service.NewAuthService( userRepo, sessionRepo, credentialRepo, jwtSecret, cfg.JWT.AccessDuration(), cfg.JWT.RefreshDuration(), ) return &WebApp{ Config: cfg, Version: AppVersion, DB: db, UserRepo: userRepo, SessionRepo: sessionRepo, FileRepo: fileRepo, CredentialRepo: credentialRepo, AuthService: authService, }, nil } // NewWebApp creates a WebApp with pre-built dependencies (useful for testing). func NewWebApp(cfg *config.Config, db *gorm.DB, userRepo repository.UserRepository, sessionRepo repository.SessionRepository, fileRepo repository.FileRepository, credentialRepo repository.CredentialRepository, authService *service.AuthService, ) *WebApp { return &WebApp{ Config: cfg, Version: AppVersion, DB: db, UserRepo: userRepo, SessionRepo: sessionRepo, FileRepo: fileRepo, CredentialRepo: credentialRepo, AuthService: authService, } } // Close releases resources held by the application (e.g., database connections). func (w *WebApp) Close() error { if w.DB == nil { return nil } sqlDB, err := w.DB.DB() if err != nil { return err } return sqlDB.Close() }