All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 16s
Eliminados hacks de autenticación md5 y configuración manual de pg_hba.conf. Ahora usa NUXT_POSTGRES_URL como secret de Gitea para conexión directa.
108 lines
2.6 KiB
TypeScript
108 lines
2.6 KiB
TypeScript
import pg from 'pg'
|
|
import { useRuntimeConfig } from '#imports'
|
|
|
|
const { Pool } = pg
|
|
|
|
let pool: pg.Pool | null = null
|
|
|
|
function buildConnectionString(): string {
|
|
const config = useRuntimeConfig()
|
|
if (config.postgresUrl) {
|
|
return config.postgresUrl
|
|
}
|
|
|
|
// Fallback para entornos locales si no se pasó NUXT_POSTGRES_URL
|
|
const user = process.env.POSTGRES_USER || 'seguidor'
|
|
const password = process.env.POSTGRES_PASSWORD || 'seguidor_password'
|
|
const host = process.env.POSTGRES_HOST || 'postgres'
|
|
const port = process.env.POSTGRES_PORT || '5432'
|
|
const db = process.env.POSTGRES_DB || 'seguidor_lotes'
|
|
return `postgres://${user}:${password}@${host}:${port}/${db}`
|
|
}
|
|
|
|
/**
|
|
* Obtiene o crea el pool de conexiones a PostgreSQL.
|
|
* Usa cadena de conexión única para mantener consistencia.
|
|
*/
|
|
export function getPool(): pg.Pool {
|
|
if (!pool) {
|
|
const connectionString = buildConnectionString()
|
|
|
|
pool = new Pool({
|
|
connectionString,
|
|
max: 10,
|
|
idleTimeoutMillis: 30000,
|
|
connectionTimeoutMillis: 10000,
|
|
})
|
|
|
|
pool.on('error', (err) => {
|
|
console.error('Error inesperado en el pool de PostgreSQL:', err)
|
|
})
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
pool.on('connect', () => {
|
|
console.log('Nueva conexión establecida con PostgreSQL')
|
|
})
|
|
}
|
|
}
|
|
|
|
return pool
|
|
}
|
|
|
|
/**
|
|
* Ejecuta una query SQL con parámetros.
|
|
*/
|
|
export async function query<T = any>(
|
|
text: string,
|
|
params?: any[]
|
|
): Promise<pg.QueryResult<T>> {
|
|
const pool = getPool()
|
|
const start = Date.now()
|
|
|
|
try {
|
|
const result = await pool.query<T>(text, params)
|
|
const duration = Date.now() - start
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log('Query ejecutada:', { text, duration: `${duration}ms`, rows: result.rowCount })
|
|
}
|
|
|
|
return result
|
|
} catch (error) {
|
|
console.error('Error ejecutando query:', { text, params, error })
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtiene un cliente del pool para ejecutar transacciones.
|
|
*/
|
|
export async function getClient(): Promise<pg.PoolClient> {
|
|
const pool = getPool()
|
|
return await pool.connect()
|
|
}
|
|
|
|
/**
|
|
* Cierra el pool de conexiones (tests o shutdown).
|
|
*/
|
|
export async function closePool(): Promise<void> {
|
|
if (pool) {
|
|
await pool.end()
|
|
pool = null
|
|
console.log('Pool de PostgreSQL cerrado')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Verifica que la conexión a la base de datos esté funcionando.
|
|
*/
|
|
export async function checkConnection(): Promise<boolean> {
|
|
try {
|
|
const result = await query('SELECT NOW() as now')
|
|
return result.rows.length > 0
|
|
} catch (error) {
|
|
console.error('Error verificando conexión a PostgreSQL:', error)
|
|
return false
|
|
}
|
|
}
|