package store import ( "fmt" "os" "gorm.io/driver/postgres" "gorm.io/gorm" "alterminal/internal/application" "alterminal/internal/auth" "alterminal/internal/jwk" "alterminal/internal/oidc" ) func Open() (*gorm.DB, error) { dsn := fmt.Sprintf( "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable TimeZone=UTC", EnvOr("DB_HOST", "localhost"), EnvOr("DB_PORT", "5432"), EnvOr("DB_USER", "postgres"), EnvOr("DB_PASSWORD", "postgres"), EnvOr("DB_NAME", "alterminal"), ) // TranslateError 讓唯一鍵違規轉為 gorm.ErrDuplicatedKey,create-account 等指令以此辨識重複。 db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{TranslateError: true}) if err != nil { return nil, err } if err := db.AutoMigrate( &auth.User{}, &auth.Session{}, &jwk.SigningKey{}, &application.Application{}, &oidc.AuthorizationCode{}, &oidc.RefreshToken{}, &oidc.Consent{}, ); err != nil { return nil, fmt.Errorf("auto migrate: %w", err) } return db, nil } func EnvOr(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback }