minervajs-mochuelo
Version:
Modulo para la gestión del Modelo de Datos, muy util para desarrollos basados en 'Base de Datos Primero'
309 lines (274 loc) • 11.5 kB
Markdown
# MinervaJS.Mochuelo
Modulo para la gestión del Modelo de Datos, muy util para desarrollos basados en "Base de Datos Primero".
Permite Gestionar tu modelo de datos, con funciones como:
* loadModels - Listar las Entidades (Tablas), Carga los modelos desde el archivo JSON, por defecto desde 'models.json'
* getModel - Obtiene un modelo por su nombre, Obtener el detalle de entidades como sus atributos (columnas) y otras caracteristicas (pk, fk, columnas, longitud y precision)
* getModelList - Devuelve un array con la lista de nombres de todos los modelos cargados.
* addModel - Agrega un nuevo modelo al archivo JSON y a la instancia de ModelManager. Adiciona metadatos o caracteristicas personalizados junto a los atributos o dentro de las entidades.
* updateModel - Actualiza un modelo existente en el archivo JSON y en la instancia de ModelManager.
* deleteModel - Elimina un modelo del archivo JSON y de la instancia de ModelManager.
* addModelAttribute - Agrega un nuevo atributo a la definición de un modelo.
* updateModelAttribute - Actualiza el valor de un atributo existente en la definición de un modelo.
* deleteModelAttribute - Elimina un atributo de la definición de un modelo.
* hasModelAttribute - Verifica si un atributo existe en la definición de un modelo (fuera de la sección de columnas).
* addColumnAttribute - Agrega un nuevo atributo a una columna específica dentro de la definición de un modelo.
* editModelAttribute - Edita un atributo de una columna específica dentro de la definición de un modelo.
* deleteColumnAttribute - Elimina un atributo de una columna específica dentro de la definición de un modelo.
* hasColumnAttribute - Verifica si una columna específica dentro de la definición de un modelo tiene un atributo determinado.
* Crear Objetos o Clases basados en las entidades del Modelo, para manipulacion de tuplas (Registros) ***IMPLEMENTADO ver Ejemplo***
**Todo lo anterior es guardado y gestionado en un archivo con formato .JSON**
Ejemplo: Partiendo de un proyecto en blanco recien creado
`$ npm i minervajs-mochuelo `
#### Archivo: ./models.js
```json
{
"tables": [ // Listado de tablas del Modelo
{
"name": "pais", // Nombre de 1 modelo, dentro de la lista de Modelos
"title": "Pais",
"table": "pais",
"primary_key": [
"iso3"
],
"sql_select": " SELECT * FROM pais ",
"sql_edit": " SELECT * FROM pais WHERE iso3 = ? ",
"sql_new": " SELECT * FROM pais ",
"sql_delete": " DELETE FROM pais WHERE iso3 = ? ",
"columns": [ // Listado de Columnas del Modelo
{
"col": "iso3",
"type": "string", // Un atributo dentro de la Columna del Modelo
"length": 3,
"minLength": 3,
"required": true,
"visible": true,
"searchable": true,
"label": "Nombre Corto (ISO 3)",
"toUpperLowerCase": true,
"allowNoEdit": true,
"remote_check": "SELECT count(1) as existe FROM pais WHERE iso3 = ? "
},
{
"col": "nombre",
"type": "string",
"length": 80,
"minLength": 2,
"required": true,
"visible": true,
"searchable": true,
"label": "Nombre",
"placeholder": "Ingrese un Nombre"
},
{
"col": "leyenda",
"type": "string",
"length": 80,
"minLength": 0,
"required": false,
"visible": true,
"searchable": false,
"label": "Leyenda",
"placeholder": "Ingrese una Leyenda"
},
{
"col": "iso2",
"type": "string",
"length": 2,
"minLength": 2,
"required": false,
"visible": true,
"searchable": true,
"label": "Nombre Corto (ISO 2)",
"toUpperLowerCase": true,
"allowNoEdit": true,
"remote_check": "SELECT count(1) as existe FROM pais WHERE iso2 = ? "
}
]
}
]
}
```
#### Archivo: ./index.js
Recupera la entidad 'pais' de nuestro modelo, crea una nueva tupla basado en nuestra entidad como un objeto.
Posteriormente intenta repetir el proceso, pero omitiendo un atributo obligatorio.
```javascript
// Ejemplo de uso del paquete minervajs-mochuelo
const { ModelManager } = require('minervajs-mochuelo');
// Inicializar el administrador de modelos
// Si no se define un nombre de archivo, Se asume que sera el archivo 'models.js' en el directorio raiz del proyecto
const modelManager = new ModelManager('MyModels.json');
// Obtener el modelo "pais"
const paisModel = modelManager.getModel('pais');
// Si el modelo es valido
if (paisModel)
{
console.log('Modelo "pais" encontrado:', paisModel.definition);
// Datos para crear un nuevo objeto "pais"
const nuevoPaisData = {
iso3: 'USA',
nombre: 'Estados Unidos',
leyenda: 'Tierra de las oportunidades',
iso2: 'US',
};
// Intentar crear un objeto "pais"
const nuevoPaisObjeto = paisModel.createObject(nuevoPaisData);
if (nuevoPaisObjeto)
{
console.log('Nuevo objeto "pais" creado:', nuevoPaisObjeto);
} else {
console.log('Los datos del nuevo país no son válidos según el modelo.');
}
// Intentar crear un objeto "pais" con datos inválidos (faltando un campo requerido)
console.log('creando un objeto "pais" con datos inválidos');
const paisInvalidoData = {
iso3: 'CAN',
leyenda: 'La hoja de maple',
iso2: 'CA',
};
const paisInvalidoObjeto = paisModel.createObject(paisInvalidoData);
if (!paisInvalidoObjeto)
{ console.log('La validación detectó datos inválidos para el modelo "pais".'); }
} else
{ console.log('El modelo "pais" no se encontró.'); }
```
#### Salida:
Para lo anterior, lo siguiente seria una salida despues de ejecutar `node index.js `
```
Modelo "pais" encontrado: {
name: 'pais',
title: 'Pais',
table: 'pais',
primary_key: [ 'iso3' ],
sql_select: ' SELECT * FROM pais ',
sql_edit: ' SELECT * FROM pais WHERE iso3 = ? ',
sql_new: ' SELECT * FROM pais ',
sql_delete: ' DELETE FROM pais WHERE iso3 = ? ',
columns: [
{
col: 'iso3',
type: 'string',
length: 3,
minLength: 3,
required: true,
visible: true,
searchable: true,
label: 'Nombre Corto (ISO 3)',
toUpperLowerCase: true,
allowNoEdit: true,
remote_check: 'SELECT count(1) as existe FROM pais WHERE iso3 = ? '
},
{
col: 'nombre',
type: 'string',
length: 80,
minLength: 2,
required: true,
visible: true,
searchable: true,
label: 'Nombre',
placeholder: 'Ingrese un Nombre'
},
{
col: 'leyenda',
type: 'string',
length: 80,
minLength: 0,
required: false,
visible: true,
searchable: false,
label: 'Leyenda',
placeholder: 'Ingrese una Leyenda'
},
{
col: 'iso2',
type: 'string',
length: 2,
minLength: 2,
required: false,
visible: true,
searchable: true,
label: 'Nombre Corto (ISO 2)',
toUpperLowerCase: true,
allowNoEdit: true,
remote_check: 'SELECT count(1) as existe FROM pais WHERE iso2 = ? '
}
]
}
Nuevo objeto "pais" creado: {
iso3: 'USA',
nombre: 'Estados Unidos',
leyenda: 'Tierra de las oportunidades',
iso2: 'US'
}
La validación detectó datos inválidos para el modelo "pais".
```
#### Archivo: ./index.js
Si desea agregar modelos personalizados, para manipulacion, el siguiente fragmento de codigo, le permitira adicionar la entidad 'Ciudad' y posteriormente recuperarla
```javascript
// Ejemplo de cómo agregar un nuevo modelo
const nuevoModeloDefinicion = {
"name": "ciudad",
"title": "Ciudad",
"table": "ciudad",
"primary_key": ["id"],
"columns": [
{ "col": "id", "type": "number", "required": true },
{ "col": "nombre", "type": "string", "required": true },
{ "col": "pais_iso3", "type": "string", "required": true }
]
};
modelManager.addModel(nuevoModeloDefinicion);
console.log('Se ha agregado el modelo "ciudad".');
// Intentar obtener el nuevo modelo "ciudad"
const ciudadModel = modelManager.getModel('ciudad');
if (ciudadModel)
{
console.log('Modelo "ciudad" encontrado:', ciudadModel.definition);
}
```
#### Salida:
Para lo anterior, lo siguiente seria una salida despues de ejecutar `node index.js `
```
Se ha agregado el modelo "ciudad".
Modelo "ciudad" encontrado: {
name: 'ciudad',
title: 'Ciudad',
table: 'ciudad',
primary_key: [ 'id' ],
columns: [
{ col: 'id', type: 'number', required: true },
{ col: 'nombre', type: 'string', required: true },
{ col: 'pais_iso3', type: 'string', required: true }
]
}
```
Ejemplo, cómo utilizar los métodos para agregar, eliminar y verificar la existencia de atributos de las columnas de un modelo.
#### Archivo: ./index.js
Edite el archivo index.js
```javascript
// Agregar el atributo 'searchable: false' a la columna 'nombre' del modelo 'ciudad'
const addAttrResult = modelManager.addColumnAttribute('ciudad', 'nombre', 'searchable', false);
if (addAttrResult)
{
console.log("Se agregó el atributo 'searchable' a la columna 'nombre' del modelo 'ciudad'.");
const ciudadModel = modelManager.getModel('ciudad');
console.log("Definición actualizada del modelo 'ciudad':", ciudadModel.definition);
}
else
{ console.log("No se pudo agregar el atributo a la columna 'nombre' del modelo 'ciudad'."); }
// Verificar si la columna 'nombre' del modelo 'ciudad' tiene el atributo 'searchable'
const hasAttrResult = modelManager.hasColumnAttribute('ciudad', 'nombre', 'searchable');
console.log("¿La columna 'nombre' del modelo 'ciudad' tiene el atributo 'searchable'?", hasAttrResult);
// Eliminar el atributo 'searchable' de la columna 'nombre' del modelo 'ciudad'
const deleteAttrResult = modelManager.deleteColumnAttribute('ciudad', 'nombre', 'searchable');
if (deleteAttrResult)
{
console.log("Se eliminó el atributo 'searchable' de la columna 'nombre' del modelo 'ciudad'.");
const ciudadModel = modelManager.getModel('ciudad');
console.log("Definición actualizada del modelo 'ciudad':", ciudadModel.definition);
} else
{ console.log("No se pudo eliminar el atributo 'searchable' de la columna 'nombre' del modelo 'ciudad'."); }
// Verificar nuevamente si la columna 'nombre' del modelo 'ciudad' tiene el atributo 'searchable'
const hasAttrResultAgain = modelManager.hasColumnAttribute('ciudad', 'nombre', 'searchable');
console.log("¿La columna 'nombre' del modelo 'ciudad' tiene el atributo 'searchable' ahora?", hasAttrResultAgain);
```