Compare commits

..

No commits in common. "941deaf9df0d9a1534d8e9fb3defe82dec3b15a1" and "d54fbcacf0ad21edfa78d0a02e53929aa79c077d" have entirely different histories.

3 changed files with 24 additions and 60 deletions

41
app.go
View File

@ -64,9 +64,6 @@ type Config struct {
// default map[string]DatabaseConfig{}
Databases map[string]DatabaseConfig
// default false
CreateRouter bool
// default false
CreateSSEBroker bool
@ -90,9 +87,9 @@ type App struct {
}
type Paseto struct {
SecretKey paseto.V4AsymmetricSecretKey
PublicKey paseto.V4AsymmetricPublicKey
Duration time.Duration
AsymmetricKey paseto.V4AsymmetricSecretKey
PublicKey paseto.V4AsymmetricPublicKey
Duration time.Duration
}
func NewApp(config ...Config) *App {
@ -104,7 +101,6 @@ func NewApp(config ...Config) *App {
Timezone: "UTC",
Paseto: nil,
Databases: make(map[string]DatabaseConfig),
CreateRouter: false,
CreateSSEBroker: false,
CreateSession: false,
CreateMailer: false,
@ -166,11 +162,11 @@ func NewApp(config ...Config) *App {
var ak paseto.V4AsymmetricSecretKey
var err error
if os.Getenv("PASETO_SECRET_KEY") != "" {
slog.Debug("using paseto secret key from env")
ak, err = paseto.NewV4AsymmetricSecretKeyFromHex(os.Getenv("PASETO_SECRET_KEY"))
if os.Getenv("PASETO_ASYMMETRIC_KEY") != "" {
slog.Debug("using paseto asymmetric key from env")
ak, err = paseto.NewV4AsymmetricSecretKeyFromHex(os.Getenv("PASETO_ASYMMETRIC_KEY"))
if err != nil {
slog.Error("error creating secret key", "error", err)
slog.Error("error creating asymmetric key", "error", err)
ak = paseto.NewV4AsymmetricSecretKey()
}
} else {
@ -191,24 +187,15 @@ func NewApp(config ...Config) *App {
}
cfg.Paseto = &Paseto{
SecretKey: ak,
PublicKey: pk,
Duration: duration,
AsymmetricKey: ak,
PublicKey: pk,
Duration: duration,
}
}
app := &App{config: cfg}
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)
}
app := &App{
config: cfg,
Router: newRouter(),
}
slog.Info(
@ -228,7 +215,7 @@ func NewApp(config ...Config) *App {
)
if cfg.EnvMode != EnvironmentProduction {
slog.Debug("paseto_secret_key", "key", cfg.Paseto.SecretKey.ExportHex())
slog.Debug("paseto_assymetric_key", "key", cfg.Paseto.AsymmetricKey.ExportHex())
}
if cfg.CreateSSEBroker {

28
pgx.go
View File

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

View File

@ -29,25 +29,12 @@ func (r *Router) Use(mw ...Middleware) {
}
}
func (r *Router) Group(basePath string, fn func(r *Router)) {
func (r *Router) Group(fn func(r *Router)) {
sub := &Router{
ServeMux: r.ServeMux,
routeChain: slices.Clone(r.routeChain),
isSub: true,
}
// Añadir middleware para manejar el basePath
sub.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
if !strings.HasPrefix(req.URL.Path, basePath) {
http.NotFound(w, req)
return
}
req.URL.Path = strings.TrimPrefix(req.URL.Path, basePath)
next.ServeHTTP(w, req)
})
})
fn(sub)
}