Files
mygo/internal/app/webapp.go
Huxley 901a769ee7 Complete foundational data layer with repository implementation
- Add GORM dependencies for SQLite and PostgreSQL
- Create domain models (User, Session, File) with common errors
- Implement repository interfaces and database layer with migrations
- Update WebApp to bootstrap with database and repositories
- Add comprehensive unit tests for repository methods
- Update config structure to support multiple database drivers
- Extend AGENTS.md with debugging principles and dependency rules
2026-04-28 13:32:33 +08:00

68 lines
1.7 KiB
Go

package app
import (
"fmt"
"gorm.io/gorm"
"github.com/dhao2001/mygo/internal/config"
"github.com/dhao2001/mygo/internal/repository"
)
// 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
}
// Bootstrap creates a fully initialized WebApp from config.
// It opens the database, runs migrations, and wires all repositories.
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)
}
return &WebApp{
Config: cfg,
Version: AppVersion,
DB: db,
UserRepo: repository.NewUserRepository(db),
SessionRepo: repository.NewSessionRepository(db),
FileRepo: repository.NewFileRepository(db),
}, 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) *WebApp {
return &WebApp{
Config: cfg,
Version: AppVersion,
DB: db,
UserRepo: userRepo,
SessionRepo: sessionRepo,
FileRepo: fileRepo,
}
}
// 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()
}