- fix: The AccessTTL and RefreshTTL fields in JWTConfig now use time.Duration type directly instead of string with ParseDuration methods. The config validation now checks for positive durations rather than parsing strings.
94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
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.AccessTTL,
|
|
cfg.JWT.RefreshTTL,
|
|
)
|
|
|
|
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()
|
|
}
|