2025-11-14 08:42:26 +08:00
package postgres
import (
"caatsm/internal/infra/config"
"context"
"fmt"
"time"
"github.com/jackc/pgx/v5/pgxpool"
2025-11-17 12:58:40 +08:00
"go.uber.org/zap"
2025-11-14 08:42:26 +08:00
)
// ProvideDB creates a PostgreSQL connection pool
2025-11-17 12:58:40 +08:00
func ProvideDB ( cfg * config . Config , logger * zap . Logger ) ( * pgxpool . Pool , error ) {
2025-11-14 08:42:26 +08:00
ctx := context . Background ()
2025-11-17 12:58:40 +08:00
2025-11-14 08:42:26 +08:00
poolConfig , err := pgxpool . ParseConfig ( cfg . Postgres . URL )
if err != nil {
2025-11-17 12:58:40 +08:00
logger . Error ( "failed to parse postgres URL" ,
zap . String ( "url" , cfg . Postgres . URL ),
zap . Error ( err ),
)
2025-11-14 08:42:26 +08:00
return nil , fmt . Errorf ( "failed to parse postgres URL: %w" , err )
}
2025-11-17 12:58:40 +08:00
2025-11-14 08:42:26 +08:00
poolConfig . MaxConns = int32 ( cfg . Postgres . MaxConns )
poolConfig . MinConns = int32 ( cfg . Postgres . MinConns )
poolConfig . MaxConnLifetime = time . Hour
poolConfig . MaxConnIdleTime = time . Minute * 30
2025-11-17 12:58:40 +08:00
2025-11-14 08:42:26 +08:00
pool , err := pgxpool . NewWithConfig ( ctx , poolConfig )
if err != nil {
2025-11-17 12:58:40 +08:00
logger . Error ( "failed to create connection pool" ,
zap . String ( "url" , cfg . Postgres . URL ),
zap . Int32 ( "max_conns" , cfg . Postgres . MaxConns ),
zap . Int32 ( "min_conns" , cfg . Postgres . MinConns ),
zap . Error ( err ),
)
2025-11-14 08:42:26 +08:00
return nil , fmt . Errorf ( "failed to create connection pool: %w" , err )
}
2025-11-17 12:58:40 +08:00
2025-11-14 08:42:26 +08:00
// Test connection
if err := pool . Ping ( ctx ); err != nil {
2025-11-17 12:58:40 +08:00
logger . Error ( "failed to ping database" ,
zap . String ( "url" , cfg . Postgres . URL ),
zap . Error ( err ),
)
2025-11-14 08:42:26 +08:00
return nil , fmt . Errorf ( "failed to ping database: %w" , err )
}
2025-11-17 12:58:40 +08:00
// Log the connection pool
logger . Info ( "Connected to PostgreSQL" , zap . Int32 ( "max_conns" , cfg . Postgres . MaxConns ), zap . Int32 ( "min_conns" , cfg . Postgres . MinConns ), zap . String ( "url" , cfg . Postgres . URL ))
2025-11-14 08:42:26 +08:00
return pool , nil
}