´ Documentación

Documentación Backend

Delivery App Backend

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

App.js, Server.js, Database.js y Firebase.js


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

Routes


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 :

  • DELETE
  • GET
  • POST
  • PUT
  • PATH

Peticiones

GET

El método [ GET ] tiene dos posibles intercaciones : http://localhost:2021/api/v1/recurso o http://localhost:2021/api/v1/recurso/:id.

POST

El método [ POST ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso.

PUT

El método [ GET ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso/:id.

DELETE

El método [ DELETE ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso/:id.

PATCH

El método [ PATCH ] tiene una posible intercacion : http://localhost:2021/api/v1/recurso/:id.

Models


La carpeta /models contiene los modelos que corresponden con una unica entidad.

Ejemplo básico de un modelo :

                                    import { Schema, model } from 'mongoose';

                                    const schemaRecurso = new Schema({
                                        propiedad1: String
                                    });

                                    export default model('recursoModel',schemaRecurso);
                                
Los modelos utilizados tienen propiedades en común que son :
  • _id creada automaticamente por mongoose
  • active creada automaticamente en modelo, no nativa de mongoose
  • delete creada automaticamente en modelo, no nativa de mongoose

Más información sobre Schema y model

Controllers


La 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 :

  • GetAll
  • GetOne
  • PostOne
  • UpdateOne
  • DeleteOne
  • Active

Services


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;
                                

Aclaraciones

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.

Middleware


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.

Inventario


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()

Función : restarStock()

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 .

Función : preValidate()

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
                                    };
                                
                            

Funciones auxiliares

Las funciones auxiliares se encuentran documentadas en el código

Herramienta de desarrollo para la prueba el servidor


Módulo : Gaia

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

Información del Programa

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]