minervajs-helmet
Version:
Modulo para la gestion de coneccion a la base de datos, de diferentes tipos mediante el uso de sobre Carga y Herencia de clases
232 lines (161 loc) • 4.66 kB
Markdown
# MinervaJS-Helmet
## 🛡️ Descripción
**MinervaJS-Helmet** es el módulo encargado de la **gestión unificada de conexiones y operaciones de base de datos** dentro del ecosistema **MinervaJS**.
Su función principal es abstraer el motor de base de datos (MySQL, PostgreSQL, Oracle, etc.) y exponer una **API homogénea**, permitiendo que el resto del sistema funcione de forma **JSON-driven**, desacoplada y extensible.
## 🎯 Objetivos
* Centralizar la gestión de conexiones a bases de datos
* Soportar múltiples motores de forma transparente
* Proveer una API común para:
* Consultas de lectura (SELECT)
* Operaciones de escritura (INSERT / UPDATE / DELETE / DDL)
* Procedimientos almacenados
* Facilitar la construcción de backends genéricos y dinámicos
## 🧱 Arquitectura
```
MinervaJS
└── Helmet
├── db_mysql.js
├── db_postgres.js
├── db_oracle.js
└── connections (cache interno)
```
Helmet actúa como un **dispatcher**, delegando la ejecución a proveedores específicos que implementan un contrato estándar.
## 🔌 Contrato estándar de proveedores
Cada proveedor de base de datos debe implementar las siguientes funciones:
```js
connect(config)
query(connection, sql, params = [])
execute(connection, sql, params = [])
call(connection, procedureName, params = {})
close(connection)
closeAll(config)
```
Este contrato garantiza que Helmet pueda operar sin conocer los detalles del motor subyacente.
## 📦 Instalación
```bash
npm install minervajs-helmet
```
> *(o incluir el módulo directamente dentro del proyecto MinervaJS)*
## ⚙️ Configuración de base de datos
Ejemplo de archivo `database.json`:
```json
{
"mysqlMain": {
"type": "mysql",
"host": "localhost",
"port": 3306,
"user": "user",
"password": "password",
"database": "minerva"
}
}
```
En la instalacion, puedes hacer uso del archivo muestra que esta en *\node_modules\minervajs-helmet\example\settings.js*
## 🚀 Uso básico
```js
const helmet = require('./helmet');
const config = require('./database.json');
```
### 🔍 Consultas de lectura (SELECT)
```js
const rows = await helmet.query(
'mysqlMain',
'SELECT * FROM pais WHERE iso3 = ?',
['SLV'],
config
);
```
### ✏️ Operaciones de escritura
```js
const result = await helmet.execute(
'mysqlMain',
'UPDATE pais SET nombre = ? WHERE iso3 = ?',
['El Salvador', 'SLV'],
config
);
console.log(result.rowsAffected);
```
### 🧠 Procedimientos almacenados
```js
const result = await helmet.call(
'mysqlMain',
'sp_pais_insert',
{
p_iso3: 'SLV',
p_nombre: 'El Salvador',
p_leyenda: 'Centroamérica',
p_iso2: 'SV',
p_existe: { out: true }
},
config
);
```
**Resultado estándar:**
```js
{
resultSets: [...],
out: {
p_existe: 0
}
}
```
## 🔐 Gestión de conexiones
* Una conexión por perfil de base de datos
* Reutilización automática
* Cache interno
* Cierre explícito
```js
await helmet.close('mysqlMain', config);
await helmet.closeAll(config);
```
## ⚠️ Manejo de errores
Helmet agrega contexto a los errores:
```
[Helmet][mysql][execute] Duplicate entry
```
Esto facilita el logging y el diagnóstico.
## 🧩 Integración JSON-driven (MinervaJS)
Helmet está diseñado para ejecutarse a partir de manifiestos JSON:
```json
{
"database": "mysqlMain",
"procedure": "sp_pais_insert",
"params": {
"p_iso3": "$body.iso3",
"p_nombre": "$body.nombre",
"p_existe": { "out": true }
}
}
```
La API ejecuta la operación sin conocer SQL ni lógica de negocio.
## ✅ Buenas prácticas
* Usar `query()` exclusivamente para SELECT
* Usar `execute()` para DML / DDL
* Encapsular lógica compleja en Stored Procedures
* Cerrar conexiones en shutdown de la aplicación
* Mantener la configuración desacoplada
## 🔮 Evolución futura
* Pooling de conexiones
* Transacciones (`begin / commit / rollback`)
* Multi-tenant
* Logging estructurado
* Métricas
* Soporte para nuevos motores
## 📌 Conclusión
**MinervaJS-Helmet** es el pilar de acceso a datos de MinervaJS.
Su diseño modular, homogéneo y desacoplado permite construir aplicaciones dinámicas, escalables y mantenibles, donde la lógica de negocio puede definirse de forma declarativa y evolucionar sin reescribir el backend.