# 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.


## 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.

