eeg_certs/backend/README.md

130 lines
4.1 KiB
Markdown
Raw Permalink Normal View History

2023-11-21 22:04:13 +00:00
# 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).
2023-11-21 22:04:13 +00:00
## 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.