add router switch and pgx changes

This commit is contained in:
Pedro Pérez 2025-05-29 13:06:48 +02:00
parent 48fe13eecc
commit 941deaf9df
2 changed files with 46 additions and 23 deletions

41
app.go
View File

@ -64,6 +64,9 @@ type Config struct {
// default map[string]DatabaseConfig{} // default map[string]DatabaseConfig{}
Databases map[string]DatabaseConfig Databases map[string]DatabaseConfig
// default false
CreateRouter bool
// default false // default false
CreateSSEBroker bool CreateSSEBroker bool
@ -87,9 +90,9 @@ type App struct {
} }
type Paseto struct { type Paseto struct {
AsymmetricKey paseto.V4AsymmetricSecretKey SecretKey paseto.V4AsymmetricSecretKey
PublicKey paseto.V4AsymmetricPublicKey PublicKey paseto.V4AsymmetricPublicKey
Duration time.Duration Duration time.Duration
} }
func NewApp(config ...Config) *App { func NewApp(config ...Config) *App {
@ -101,6 +104,7 @@ func NewApp(config ...Config) *App {
Timezone: "UTC", Timezone: "UTC",
Paseto: nil, Paseto: nil,
Databases: make(map[string]DatabaseConfig), Databases: make(map[string]DatabaseConfig),
CreateRouter: false,
CreateSSEBroker: false, CreateSSEBroker: false,
CreateSession: false, CreateSession: false,
CreateMailer: false, CreateMailer: false,
@ -162,11 +166,11 @@ func NewApp(config ...Config) *App {
var ak paseto.V4AsymmetricSecretKey var ak paseto.V4AsymmetricSecretKey
var err error var err error
if os.Getenv("PASETO_ASYMMETRIC_KEY") != "" { if os.Getenv("PASETO_SECRET_KEY") != "" {
slog.Debug("using paseto asymmetric key from env") slog.Debug("using paseto secret key from env")
ak, err = paseto.NewV4AsymmetricSecretKeyFromHex(os.Getenv("PASETO_ASYMMETRIC_KEY")) ak, err = paseto.NewV4AsymmetricSecretKeyFromHex(os.Getenv("PASETO_SECRET_KEY"))
if err != nil { if err != nil {
slog.Error("error creating asymmetric key", "error", err) slog.Error("error creating secret key", "error", err)
ak = paseto.NewV4AsymmetricSecretKey() ak = paseto.NewV4AsymmetricSecretKey()
} }
} else { } else {
@ -187,15 +191,24 @@ func NewApp(config ...Config) *App {
} }
cfg.Paseto = &Paseto{ cfg.Paseto = &Paseto{
AsymmetricKey: ak, SecretKey: ak,
PublicKey: pk, PublicKey: pk,
Duration: duration, Duration: duration,
} }
} }
app := &App{ app := &App{config: cfg}
config: cfg,
Router: newRouter(), if cfg.CreateRouter {
app.Router = newRouter()
}
// Create PGX pools automatically if there are entries in Databases with driver 'pgx'
for dbName, dbConfig := range cfg.Databases {
if dbConfig.DriverName == "pgx" {
slog.Debug("creating pgx pool", "database", dbName)
app.newPGXPool(dbName)
}
} }
slog.Info( slog.Info(
@ -215,7 +228,7 @@ func NewApp(config ...Config) *App {
) )
if cfg.EnvMode != EnvironmentProduction { if cfg.EnvMode != EnvironmentProduction {
slog.Debug("paseto_assymetric_key", "key", cfg.Paseto.AsymmetricKey.ExportHex()) slog.Debug("paseto_secret_key", "key", cfg.Paseto.SecretKey.ExportHex())
} }
if cfg.CreateSSEBroker { if cfg.CreateSSEBroker {

28
pgx.go
View File

@ -20,7 +20,7 @@ var (
pgxMutex sync.RWMutex pgxMutex sync.RWMutex
) )
func (a *App) NewPGXPool(name string) *pgxpool.Pool { func (a *App) newPGXPool(name string) *pgxpool.Pool {
pgxMutex.Lock() pgxMutex.Lock()
defer pgxMutex.Unlock() defer pgxMutex.Unlock()
@ -44,22 +44,32 @@ func (a *App) NewPGXPool(name string) *pgxpool.Pool {
return dbPool return dbPool
} }
func (a *App) GetPGXPool(name string) (*pgxpool.Pool, bool) { func (a *App) GetPGXPool(name string) *pgxpool.Pool {
pgxMutex.RLock() pgxMutex.RLock()
defer pgxMutex.RUnlock() defer pgxMutex.RUnlock()
pool, exists := pgxPools[name] pool, exists := pgxPools[name]
return pool, exists if !exists {
slog.Error("database connection not found", "name", name)
return nil
}
return pool
} }
func (a *App) ClosePGXPools() { func (a *App) ClosePGXPool(name string) {
pgxMutex.Lock() pgxMutex.Lock()
defer pgxMutex.Unlock() defer pgxMutex.Unlock()
for name, pool := range pgxPools { pool, exists := pgxPools[name]
pool.Close() if !exists {
delete(pgxPools, name) slog.Error("database connection not found", "name", name)
slog.Info("closed database connection", "name", name) return
} }
pool.Close()
delete(pgxPools, name)
slog.Info("closed database connection", "name", name)
} }
func NumericToFloat64(n pgtype.Numeric) float64 { func NumericToFloat64(n pgtype.Numeric) float64 {
@ -90,7 +100,7 @@ func NumericToInt64(n pgtype.Numeric) int64 {
func FloatToNumeric(number float64, precision int) (value pgtype.Numeric) { func FloatToNumeric(number float64, precision int) (value pgtype.Numeric) {
parse := strconv.FormatFloat(number, 'f', precision, 64) parse := strconv.FormatFloat(number, 'f', precision, 64)
slog.Info("parse", "parse", parse) slog.Debug("parse", "parse", parse)
if err := value.Scan(parse); err != nil { if err := value.Scan(parse); err != nil {
slog.Error("error scanning numeric", "error", err) slog.Error("error scanning numeric", "error", err)