130 lines
4.1 KiB
Markdown
130 lines
4.1 KiB
Markdown
# eeg-system: Backend
|
|
|
|
Programa escrito en Rust que contiene toda la lógica de negocios.
|
|
Expose únicamente rutas bajo `/api/`, todas se comunican mediante JSON.
|
|
|
|
Contiene el Modelo y Controlador de `MVC`. La vista está en la carpeta `frontend`.
|
|
|
|
## Lanzamiento
|
|
|
|
Para lanzar se requiere lo siguiente en el entorno:
|
|
|
|
- Sistema operativo Linux (no se desarrolló ni se probó el programa en windows/mac/bsd)
|
|
- Libreria Imagemagick instalada y accesible mediante el binario `convert`,
|
|
capaz de convertir archivos a PDF (en *buntu puede haber problemas de conversión,
|
|
ver [link en StackOverflow](https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion))
|
|
- Una carpeta `ESCANEOS` accesible, con permisos de lectura y escritura para
|
|
el usuario que ejecuta el backend. La ruta de esta carpeta está definida en
|
|
`/src/controller/scans/mod.rs`, en la variable `SCAN_PATH`
|
|
- Un archivo `.env` con las variables de entorno necesarias. Los nombres de las
|
|
claves están en el archivo `.env.example` de este repositorio
|
|
|
|
|
|
|
|
|
|
### Lanzamiento mediante Jenkins
|
|
|
|
Si se quiere lanzar mediante Jenkins ya hay un `Jenkinsfile` una carpeta arriba.
|
|
Modificar lo que sea necesario para ejecutar en el entorno objetivo.
|
|
|
|
|
|
## Base de datos
|
|
|
|
**IMPORTANTE**: Este sistema (backend y frontend) depende de que la base de datos tenga ciertos
|
|
registros con ciertos ids, estos valores estan escritos en el código (hard coded)
|
|
|
|
- La tabla `custom_label` debe tener una fila con id: `0` y valor `<vacio>`
|
|
- La tabla `course` debe tener filas para los cursos matpel:
|
|
- Matpel 1 con id `10`
|
|
- Matpel 2 con id `11`
|
|
- Matpel 3 con id `12`
|
|
|
|
Estos valores deben estar en la base de datos. Si se cambiaron, es necesario
|
|
cambiarlos en el código (sería bueno sacarlos de .env).
|
|
|
|
|
|
## Funcionamiento
|
|
|
|
Básicamente, al iniciar el backend realiza lo siguiente:
|
|
|
|
- Cargar variables de entorno
|
|
- Inicializar el logger
|
|
- Conectar a la base de datos y crear un `pool` de conexiones
|
|
- Inicializar las rutas
|
|
|
|
Luego, las rutas brindan la siguiente funcionalidad:
|
|
|
|
- Buscar y crear personas
|
|
- CRUD de certificados
|
|
- Crear y gestionar accesos a aula virtual
|
|
- Automatizar escaneo de certificados
|
|
|
|
|
|
## Componentes del sistema
|
|
|
|
|
|
### `controller`
|
|
|
|
Los controladores, definen las rutas, reciben y envían datos al frontend
|
|
|
|
### `model`
|
|
|
|
Contiene todas las operaciones referentes a la base de datos.
|
|
|
|
El SQL se escribe manualmente, se usa la librería [sqlx](https://github.com/launchbadge/sqlx).
|
|
|
|
Sqxl brinda los sig. beneficios:
|
|
|
|
- Verificar tipos de datos correctos
|
|
- Verificar las consultas SQL
|
|
- Si hay algún problema en los tipos de datos o las consultas SQL, `sqlx` lanzará errores de compilación.
|
|
De este modo no es posible lanzar el backend si hay errores en el SQL.
|
|
|
|
Por estas razones no se usa un ORM (se intento SeaORM, es demasiado complicado y no brinda ningún beneficio
|
|
importante frente a sqlx).
|
|
|
|
|
|
### `online_classroom`
|
|
|
|
Contiene código que realiza scrapping del aula virtual de EEGSAC.
|
|
|
|
|
|
## Componentes dentro de `controller`
|
|
|
|
### `classroom`
|
|
|
|
Operaciones respecto al aula virtual. Se comunica con el aula virtual mediante scrapping.
|
|
|
|
### `course`
|
|
|
|
Devuelve una lista con todos los cursos del sistema
|
|
|
|
### `custom_label`
|
|
|
|
Devuelve una lista con las denominaciones de los certificados de maquinarias.
|
|
|
|
### `person`
|
|
|
|
CRUD de personas. La operación más importante es buscar una persona por DNI: Busca en la base de datos, si no encuentra
|
|
busca en API de RENIEC.
|
|
|
|
### `register`
|
|
|
|
CRUD de certificados.
|
|
|
|
### `scans`
|
|
|
|
Automatiza el escaneo de certificados. Realiza lo siguiente:
|
|
|
|
- Lee los archivos de la carpeta `ESCANEOS` de forma no recursiva.
|
|
- Cambia de nombre los archivos a `eeg_<unix timestamp>.jpg`. Esto se hace para que solo 1 persona pueda escanear
|
|
a la vez.
|
|
- Abre cada escaneo y busca el código QR: recorta la imagen a la sección donde se encuentra el QR, aplica [thresholding](https://en.wikipedia.org/wiki/Thresholding_%28image_processing%29) y detecta el QR.
|
|
- Según los datos del QR, busca en la base de datos nombres, apellidos y nombre del curso del escaneo
|
|
- Convierte a PDF, rota y renombra los escaneos.
|
|
|
|
---
|
|
|
|
Las operaciones a más detalles están detalladas en el código.
|
|
|