# Backend Application Este proyecto es una aplicación backend que utiliza Node.js, Docker, MariaDB y worker threads para gestionar la impresión de etiquetas ZPL. ## Contenido - [Instalación](#instalación) - [Uso](#uso) - [Descripción de Archivos](#descripción-de-archivos) - [index.js](#indexjs) - [docker-compose.yml](#docker-composeyml) - [Dockerfile](#dockerfile) - [worker.js](#workerjs) - [workerPool.js](#workerpooljs) - [pool.js](#pooljs) - [zplTemplate.js](#zpltemplatejs) - [package.json](#packagejson) - [label.json](#labeljson) - [Dependencias](#dependencias) ## Instalación 1. Clona el repositorio: ```sh git clone http://gitlab.agc.local/agc/verdnatura/etiquetas/servidor cd /backend ``` 2. Instala las dependencias de Node.js: ```sh npm install ``` 3. Asegúrate de tener Docker y Docker Compose instalados en tu máquina. 4. Crea un archivo `.env` en el directorio raíz del proyecto y configura las variables de entorno necesarias: ```env DB_HOST=mariadb DB_PORT=3306 DB_USER=user DB_PASSWORD=password DB_NAME=database ``` ## Uso 1. Levanta los servicios de Docker: ```sh docker-compose up --build ``` 2. La aplicación backend estará disponible en `http://localhost:3000`. ## Descripción de Archivos ### `index.js` Este es el archivo de entrada principal que inicializa y comienza el procesamiento del pool de workers. - **WorkerPool**: Se importa la clase `WorkerPool` desde el archivo `worker/workerPool`. - **threads**: Se define el número de threads/workers que se van a utilizar. - **workerPool**: Se instancia un nuevo `WorkerPool` con el número de threads definido. - **assignTasks**: Se llama al método `assignTasks` para asignar las tareas iniciales a los workers. ### `docker-compose.yml` Define los servicios de Docker necesarios para la aplicación. - **version**: Especifica la versión del formato de `docker-compose`. - **services**: Define los servicios que se ejecutarán. - **mariadb**: Servicio para la base de datos MariaDB. - **backend**: Servicio para el backend de la aplicación. ### `Dockerfile` Define cómo construir la imagen Docker para el servicio de backend. - **FROM**: Utiliza la imagen base de Node.js más reciente. - **WORKDIR**: Establece el directorio de trabajo en `/backend`. - **COPY**: Copia los archivos de configuración y el código de la aplicación al contenedor. - **RUN**: Instala las dependencias necesarias. - **EXPOSE**: Expone el puerto 3000. - **CMD**: Comando por defecto para iniciar la aplicación. ### `worker.js` Maneja el procesamiento de registros de impresión y la comunicación con las impresoras. - **Configuración de logger**: Se configura `log4js` para la salida de logs. - **getConnectionWithRetries**: Intenta obtener una conexión a la base de datos con reintentos. - **sendZPL**: Envía el contenido ZPL a la impresora con reintentos. - **getPrinterIpAddress**: Obtiene la dirección IP de una impresora basada en su ID. - **getRecordForProcessing**: Obtiene un registro para procesamiento, con manejo de transacciones y reintentos. - **processRecord**: Procesa un registro específico, generando el contenido ZPL y enviándolo a la impresora. Actualiza la base de datos con el estado de impresión. ### `workerPool.js` Maneja un pool de workers, creando y asignando tareas a los workers. - **initWorkers**: Inicializa el número especificado de workers. - **createWorker**: Crea un nuevo worker y maneja sus mensajes, errores y su finalización. - **replaceWorker**: Reemplaza un worker fallido creando uno nuevo. - **assignTasks**: Asigna tareas iniciales a todos los workers. - **closeAllWorkers**: Termina todos los workers. ### `pool.js` Configura y exporta un pool de conexiones MySQL. - **dotenv**: Carga las variables de entorno desde un archivo `.env`. - **mysql.createPool**: Crea un pool de conexiones MySQL usando las variables de entorno. ### `zplTemplate.js` Genera las etiquetas ZPL basadas en los registros y la plantilla de etiquetas. - **generateZPL**: Genera el código ZPL para una etiqueta específica basada en el registro y la plantilla de etiquetas. - **rf_id_venature**: Un valor fijo agregado al ID de expedición. - **id_venature**: Formatea el ID de expedición para que tenga una longitud de 20 caracteres. - **upperCaseRecord**: Convierte todos los valores de texto del registro a mayúsculas. - **result**: Contiene el ZPL generado para cada etiqueta. ### `package.json` Este archivo define las configuraciones básicas de tu proyecto backend, las dependencias necesarias para su funcionamiento, y las herramientas de desarrollo necesarias para mantener la calidad del código. Cada dependencia tiene un rol específico que ayuda a la aplicación a operar de manera eficiente y segura tanto en el desarrollo como en la producción. ### `label.json` Este archivo define el formato y los mapeos necesarios para la generación de etiquetas ZPL. Si deseas cambiar los datos que se pasan a ZPL para la impresión de etiquetas, siempre debes seguir este formato. El `label.json` tiene la siguiente estructura: - **name**: Nombre de la etiqueta. - **mappings**: Definición de los campos que serán reemplazados en la plantilla ZPL. - **val1, val2, ...**: Claves que se corresponden con los campos del registro. - **zpl**: Código ZPL que define el diseño de la etiqueta. Dentro del código ZPL, los valores de los mapeos se deben utilizar para ser reemplazados dinámicamente. - **density**: La densidad de impresión. - **width**: Ancho de la etiqueta. - **height**: Altura de la etiqueta. ### `devDependencies` Estas son las bibliotecas necesarias solo durante el desarrollo y no en producción. - **eslint: ^7.32.0** - **Función**: Una herramienta para encontrar y arreglar problemas en el código JavaScript. Ayuda a mantener un código limpio y consistente. - **Uso en tu proyecto**: Analizar el código y asegurar que sigue las convenciones de codificación especificadas. - **eslint-plugin-import: ^2.29.1** - **Función**: Un plugin para ESLint que ayuda a validar la importación/exportación de módulos ES6+. - **Uso en tu proyecto**: Asegurar que las importaciones en tu proyecto sean válidas y que no haya problemas de módulos no encontrados.