Estructura del proyecto
Dentro del directorio /src se encuentran 5 carpetas y 4 archivos importantes, los cuales son :
- /controllers
- /inventario
- /middlewares
- /models
- /routes
- /service
- app.js
- database.js
- server.js
´
Dentro del directorio /src se encuentran 5 carpetas y 4 archivos importantes, los cuales son :
El archivo server.js crea una instancia de Express() y la exporta para que el script App.js lo incialize mediante el metodo asíncrono main().
El archivo database.js contiene la conexión a MongoDB mendiante mongoose.
El archivo firebase.js es donde se realiza la conexion y certificacion al SDK del proyecto de Firebase en cuestion. Exporta al administrador del SDK
La carpeta /routes contiene todas las rutas disponibles de la [API], cada archivo correspone con una unica entidad. La URL básica para acceder a un recurso es mediante: http://localhost:2021/api/v1/recurso
.
El formato de un archivo routes es el siguiente:
router.get(url,function);
Lista de vervos HTTP soportados :
El método [ GET ] tiene dos posibles intercaciones : http://localhost:2021/api/v1/recurso
o http://localhost:2021/api/v1/recurso/:id
.
El método [ POST ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso
.
El método [ GET ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso/:id
.
El método [ DELETE ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso/:id
.
El método [ PATCH ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso/:id
.
La carpeta /models contiene los modelos que corresponden con una unica entidad.
Ejemplo básico de un modelo :
Los modelos utilizados tienen propiedades en común que son :
import { Schema, model } from 'mongoose';
const schemaRecurso = new Schema({
propiedad1: String
});
export default model('recursoModel',schemaRecurso);
_id
creada automaticamente por mongooseactive
creada automaticamente en modelo, no nativa de mongoosedelete
creada automaticamente en modelo, no nativa de mongooseLa carpeta /controllers contiene los controladores para cada ruta disponibles de la [API], cada archivo corresponde con una unica entidad. La repsonsabilidad del controlador es unicamente gestionar las peticiones HTTP, por su parte cada método del controlador llama a una función del Servicio.
El formato de un archivo controlador es el siguiente:
import RecursoSvc from './root/services/recurso.service.js'
let getAll = async (req, res) => {
try {
let recurso = await recursoSvs.metodo(req);
res.status(200).json(recurso);
} catch (e) {
res.status(500).json({'error': error})
}
}
. . .
const RecursoCtrl = { getAllRecurso };
export default RecursoCtrl;
Cada controlador tiene cinco funciones básicas :
La carpeta /services contiene los servicios para cada controlador disponibles de la [API], cada archivo corresponde con una unica entidad. La repsonsabilidad del servicio es gestionar la lógica implícita, por su parte cada método del servicio llama a uno o varions model.
El formato de un archivo service es el siguiente:
import RecursoModel from './root/model/recurso.model.js'
let findAllRecurso = async (reqRecurso) => {
try {
let recurso = await RecursoModel.metodoMongoose(reqRecurso=null);
return recurso;
} catch (e) {
console.error(`Error Recurso Service : ${e}`);
}
}
. . .
const RecursoSvc = { findAllRecurso };
export default RecursoSvc;
Los metodos findAllRecurso()
y findOneRecurso()
retornar un arreglo o un objeto siempre y cuando este tenga la propiedad active: true
La función deleteOne[recurso] solo realiza un "soft delete" (baja lógica), cuyo paramatro deben ser el uid
del usuario, cambia la propiedad delete por un objeto {user_uid: uid, deleteAt: Date}
y modifica el estado de active a false
.
El método active realiza todo lo contrario cambia la propiedad delete por un objeto vacio { }
, que es ignorado automaticamente por mongoose a la hora de realizar operaciones. Por último cambia el estado de active a true
.
La función populate realiza un join de subdocumentos, en vez de retornar un atributo _id: id
devuelve el objeto en cuestion.
La carpeta /middlewares contiene el unico middleware llamado user.middleware. Verifica si existe el usuario en una coleccion de firestore (base de datos del proyecto de Firebase) mediante un request.body.uid dejandolo continuar si existe, en cambio si no existe no puede continuar.
El middleware crea una instancia de el archivo firebase.js para obtener el administrador.
Utiliza el request body de la ruta para obtener el id del usuario.
Es llamado antes de la ruta a utilizar.
La funciones existUser()
realiza una validacion de si el usuario existe , retorna un next() caso de encontrarlo , sino devuelve un status de 400.
La carpeta /inventario contiene el módulo del control de stock llamado inventario.js
Las funciones que exporta el módulo son restarStock()
y preValidate()
La función recibe un objeto pedido previamente validado que itera sobre las propiedade DetallePedido, para llamar a dos funciones auxliares que gestionan independientemente el stock de Artículo Insumo y Artículo Manufacturado .
La función recibe un objeto pedido que itera sobre las propiedade DetallePedido, para verificar si se puede realizar el pedido pasado por parametro.
Retorna un objeto que contiene un arreglo de ids y estados de stock para cada Artículo Insumo y Artículo Manufacturado respectivamente, junto a otra propiedad booleana llamada stock, que contiene el estado global del pedido.
stock = {
artInsumo: [
{ _id: id, stockStatus: boolean}
],
artManufact: [
{ _id: id, stockStatus: boolean}
],
status: boolean
};
Las funciones auxiliares se encuentran documentadas en el código
El archivo Gaia.index.js
contiene un código hecho en js ES2016 para el seeding (ver) de la base de datos.
Modo de uso :
Llamar al archivo dentro de la función main()
del archivo App.js
, ejecutar el método terraform()
introducir un parametro del tipo string
. Los cuales pueden ser `create`, `update`, `drop`, `purge`. La función solo adminte un parametro
Para más información ver la documentación de cada archivo
Parámetro | Descripción | Uso |
---|---|---|
'update' | Agrega los nuevos documentos en la base de datos. Las coleciones albergan a los documentos creados mediante Gaia y los creados mediante otros metodos |
Usar una única vez |
'create' | Borra los documentos si y solo sí fueron creados mediante Gaia mediante un mecanismo de rollback y luego agrega los nuevos documentos |
Multiples veces |
'drop' | Borra los documentos si y solo sí fueron creados mediante Gaia unicamente, en caso de existir otros documentos estos permanecen la base de datos |
Multiples veces |
'purge' | Borra los documentos de las coleciones sean creados mediante Gaia u otros medios, pero no borra las coleciones en si |
Multiples veces |
Nombre | Objetivo | Versión |
---|---|---|
Gaia | Seeding automático de la BD uso exclusivo del desarrollo del servidor | Beta 2021.0.1 |
Versionado usado [fase:año:major:minor]