En este documento veremos cómo funciona el registro de auditorías en Keeper, qué modelos se ven afectados y cómo se procesan los datos para su almacenamiento en BigQuery.
¿Qué son las auditorías?
El sistema de auditoría en Keeper permite registrar los cambios en los modelos de datos de la aplicación, manteniendo un historial detallado de las modificaciones realizadas. Esto permite rastrear quién realizó un cambio, qué datos fueron alterados y cuándo ocurrió.
¿En qué archivo de APIs se ejecutan?
El registro de auditorías en Keeper se maneja principalmente a través de los siguientes archivos en el proyecto de APIs:
¿Cómo funciona el sistema de auditoría?
Interceptación de eventos en LoopBack
Las auditorías se registran mediante observadores de modelos en LoopBack, interceptando los eventos before save, after save y before delete.
- Antes de guardar (
before save)
- Si es una actualización (UPDATE), se obtiene el estado previo del registro (
oldData) antes de ser modificado y se almacena en ctx.hookState.oldData.
- Si es una creación (CREATE), no hay
oldData ya que el registro no existía previamente.
- Después de guardar (
after save)
- Se obtiene el nuevo estado del registro (
newData).
- Si es una eliminación (DELETE), no hay
newData, ya que el registro ha sido eliminado.
- Antes de eliminar (
before delete)
- Se guarda el estado del registro (
oldData) antes de ser eliminado.
Generación de la Cloud Task
Desde el proyecto de APIs, en lugar de insertar directamente en la base de datos, se genera una Cloud Task con el objeto de auditoría. Esta Cloud Task se envía a una cola de procesamiento para su ejecución asincrónica.
Esto se hace llamando a la funcion createAuditoriaTask(urlCloudFunction, dataAuditoria), y se le pasa como parametros la url de la cloud function (que proviene de las envs y la data que adutoria generada en el archivo 027-aduitorias.js).
Ejemplo:
const CLOUD_RUN_FUNCTIONS_AUDITORIAS =
process.env.CLOUD_RUN_FUNCTIONS_AUDITORIAS;
await createAuditoriaTask(CLOUD_RUN_FUNCTIONS_AUDITORIAS, auditoria);
Procesamiento en Cloud Function y almacenamiento en BigQuery
La Cloud Task activa una Cloud Function, que es la encargada de insertar la información en la tabla auditorias dentro de BigQuery. La Cloud Function recibe la auditoría, la transforma en el formato adecuado y la almacena en BigQuery.
Datos registrados en la auditoría
Cada evento registrado en la auditoría incluye la siguiente información:
- ID del usuario: Identifica al usuario que realizó la operación.
- Tipo de operación: Puede ser
CREATE, UPDATE o DELETE.
- Datos antes del cambio: (
oldData, si existe).
- Datos después del cambio: (
newData, si aplica).
- Recurso afectado: Indica el modelo sobre el que se realizó la operación.
Listado de endpoints
Descargos
| Método | Endpoint | Descripción |
|---|
| POST | /descargos | Crear un nuevo descargo |
| GET | /descargos | Obtener todos los descargos |
| GET | /descargos/{id} | Obtener un descargo por ID |
| GET | /descargos/findOne | Obtener un descargo único según filtros |
| PUT | /descargos/{id} | Reemplazar un descargo por ID |
| DELETE | /descargos/{id} | Eliminar un descargo por ID |
| GET | /descargos/count | Obtener la cantidad total de descargos |
| PATCH | /descargos | Crear o actualizar un descargo (upsert) |
| PATCH | /descargos/{id} | Actualizar parcialmente un descargo por ID |
Choferes
| Método | Endpoint | Descripción |
|---|
| POST | /choferes | Crear un nuevo chofer |
| GET | /choferes | Obtener todos los choferes |
| GET | /choferes/{id} | Obtener un chofer por ID |
| GET | /choferes/findOne | Obtener un chofer único según filtros |
| PATCH | /choferes | Crear o actualizar un chofer (upsert) |
| PATCH | /choferes/{id} | Actualizar parcialmente un chofer por ID |
| PUT | /choferes/{id} | Reemplazar un chofer por ID |
| DELETE | /choferes/{id} | Eliminar un chofer por ID |
| GET | /choferes/count | Obtener la cantidad total de choferes |
| POST | /choferes/altaChofer | Dar de alta un chofer |
| POST | /choferes/sendPushNotification | Enviar una notificación push a un chofer |
Transportistas
| Método HTTP | Endpoint | Descripción |
|---|
| GET | /transportistas | Obtiene todos los transportistas. |
| GET | /transportistas/:id | Obtiene un transportista por ID. |
| GET | /transportistas/findOne | Obtiene un transportista que coincida con filtros. |
| POST | /transportistas | Crea un nuevo transportista. |
| PUT | /transportistas/:id | Reemplaza un transportista por ID. |
| PATCH | /transportistas/:id | Modifica parcialmente un transportista por ID. |
| DELETE | /transportistas/:id | Elimina un transportista por ID. |
| GET | /transportistas/count | Obtiene el número total de transportistas. |
| GET | /transportistas/kilometers/count | Obtiene el conteo de kilómetros recorridos. |
| GET | /transportistas/kilometers | Obtiene los kilómetros recorridos por todos los transportistas. |
| GET | /transportistas/:id/kilometers | Obtiene los kilómetros recorridos por un transportista específico. |
| GET | /transportistas/vehiclesCount | Obtiene la cantidad de vehículos por transportista. |
Tipo de lugares
| Método HTTP | Endpoint | Descripción |
|---|
| GET | /tipoLugares | Obtiene todos los registros de tipoLugares. |
| GET | /tipoLugares/:id | Obtiene un registro de tipoLugares por ID. |
| GET | /tipoLugares/findOne | Obtiene un registro que coincida con filtros. |
| POST | /tipoLugares | Crea un nuevo registro de tipoLugares. |
| PUT | /tipoLugares/:id | Reemplaza un registro de tipoLugares por ID. |
| PATCH | /tipoLugares | Modifica parcialmente un registro o crea uno nuevo. |
| PATCH | /tipoLugares/:id | Modifica parcialmente un registro por ID. |
| DELETE | /tipoLugares/:id | Elimina un registro de tipoLugares por ID. |
| GET | /tipoLugares/count | Obtiene el número total de registros. |
Lugares
| Método HTTP | Endpoint | Descripción |
|---|
| GET | /lugares | Obtiene todos los registros de lugares. |
| GET | /lugares/:id | Obtiene un registro de lugares por ID. |
| GET | /lugares/findOne | Obtiene un registro que coincida con filtros. |
| POST | /lugares | Crea un nuevo registro de lugares. |
| PUT | /lugares/:id | Reemplaza un registro de lugares por ID. |
| PATCH | /lugares | Modifica parcialmente un registro o crea uno nuevo. |
| PATCH | /lugares/:id | Modifica parcialmente un registro por ID. |
| DELETE | /lugares/:id | Elimina un registro de lugares por ID. |
| GET | /lugares/count | Obtiene el número total de registros. |
| POST | /lugares/importKml/:tipoLugarId | Importa un archivo KML en un tipo de lugar específico. |
| GET | /lugares/searchByPoint | Devuelve los lugares que contienen un punto específico. |
Cartografia
| Método HTTP | Endpoint | Descripción |
|---|
| GET | /cartografia | Obtiene todos los registros de cartografía. |
| GET | /cartografia/:id | Obtiene un registro de cartografía por ID. |
| POST | /cartografia | Crea un nuevo registro de cartografía. |
| PUT | /cartografia/:id | Reemplaza un registro de cartografía por ID. |
| PATCH | /cartografia/:id | Modifica parcialmente un registro por ID. |
| DELETE | /cartografia/:id | Elimina un registro de cartografía por ID. |
| GET | /cartografia/count | Obtiene el número total de registros de cartografía. |
Productos
| Método HTTP | Endpoint | Descripción |
|---|
| GET | /productos | Obtiene todos los productos. |
| GET | /productos/:id | Obtiene un producto por ID. |
| POST | /productos | Crea un nuevo producto. |
| PUT | /productos/:id | Reemplaza un producto por ID. |
| PATCH | /productos/:id | Modifica parcialmente un producto por ID. |
| DELETE | /productos/:id | Elimina un producto por ID. |
| GET | /productos/count | Obtiene el número total de productos. |
Negocios
| Método HTTP | Endpoint | Descripción |
|---|
| GET | /negocios | Obtiene todos los negocios. |
| GET | /negocios/:id | Obtiene un negocio por ID. |
| POST | /negocios | Crea un nuevo negocio. |
| PUT | /negocios/:id | Reemplaza un negocio por ID. |
| PATCH | /negocios/:id | Modifica parcialmente un negocio por ID. |
| DELETE | /negocios/:id | Elimina un negocio por ID. |
| GET | /negocios/count | Obtiene el número total de negocios. |
Vehículos
| Método | Endpoint | Descripción |
|---|
GET | /kilometers | Obtiene los kilómetros del vehículo. |
GET | /v2/kilometers | Obtiene los kilómetros del vehículo, versión 2. |
GET | /v2/kilometers/count | Obtiene el conteo de kilómetros, versión 2. |
GET | /kilometers/count | Obtiene el conteo de kilómetros. |
GET | /kilometers/tendency | Obtiene la tendencia de los kilómetros. |
DELETE | /cleanRedisData | Elimina los datos de Redis relacionados con vehículos. |
GET | /customCount | Obtiene un conteo personalizado. |
Cisterna de vehículos
| Método | Endpoint | Descripción |
|---|
POST | /create/ | Endpoint para la creación de CisternaVehiculos. |
PATCH | /update/:id | Endpoint para la actualización de CisternaVehiculos. |
DELETE | /delete/:id | Endpoint para eliminar un CisternaVehiculos. |
Marca de vehículos
| Método HTTP | Endpoint | Descripción |
|---|
GET | /marcaVehiculos | Recupera una lista de marcaVehiculos |
GET | /marcaVehiculos/:id | Recupera un marcaVehiculos por ID |
GET | /marcaVehiculos/one | Recupera un único marcaVehiculos |
GET | /marcaVehiculos/count | Cuenta el número de marcaVehiculos |
POST | /marcaVehiculos | Crea un nuevo marcaVehiculos |
Tipo de DVRs
| Método HTTP | Endpoint | Descripción |
|---|
GET | /tipoDVR | Recupera una lista de tipoDVR |
GET | /tipoDVR/:id | Recupera un tipoDVR por ID |
GET | /tipoDVR/one | Recupera un único tipoDVR |
GET | /tipoDVR/count | Cuenta el número de tipoDVR |
POST | /tipoDVR | Crea un nuevo tipoDVR |
PUT | /tipoDVR/:id | Reemplaza un tipoDVR por ID |
DELETE | /tipoDVR/:id | Elimina un tipoDVR por ID |
PATCH | /tipoDVR | Actualiza o crea un tipoDVR |
PATCH | /tipoDVR/:id | Actualiza las propiedades de un tipoDVR |
Grupos
| Método HTTP | Endpoint | Descripción |
|---|
GET | /grupos/:id | Endpoint para obtener un grupo y sus recursos |
GET | /grupos/ | Endpoint para obtener grupos y recursos |
POST | /grupos/ | Endpoint para crear un nuevo grupo |
DELETE | /grupos/:id | Endpoint para borrar un grupo |
PUT | /grupos/:id | Endpoint para editar transportistas de un grupo |
Gerencias
| Método HTTP | Endpoint | Descripción |
|---|
GET | /gerencias/:id | Endpoint para obtener una gerencia y sus grupos |
GET | /gerencias/ | Endpoint para obtener gerencias |
POST | /gerencias/ | Endpoint para crear una nueva gerencia |
DELETE | /gerencias/:id | Endpoint para borrar una gerencia |
PUT | /gerencias/:id | Endpoint para editar una gerencia |
Avisos
| Método HTTP | Endpoint | Descripción |
|---|
GET | /avisos/:id | Endpoint para obtener un aviso por su ID |
GET | /avisos/ | Endpoint para obtener todos los avisos |
POST | /avisos/ | Endpoint para crear un nuevo aviso |
PUT | /avisos/:id | Endpoint para reemplazar un aviso por su ID |
DELETE | /avisos/:id | Endpoint para borrar un aviso por su ID |
POST | /avisos/patchOrCreate | Endpoint para crear o actualizar un aviso |
PATCH | /avisos/:id | Endpoint para actualizar parcialmente un aviso |
Usuarios
| Método HTTP | Endpoint | Descripción |
|---|
POST | /asignarRol | Asigna un rol a un usuario |
POST | /login | Inicia sesión para un usuario |
GET | /getInfo | Obtiene información de un usuario por su email |
GET | /auth | Obtiene la metadata de autenticación de un usuario |
GET | /metadata | Obtiene la metadata del usuario |
POST | /addPermisos | Crea un nuevo permiso para un rol y asigna el permiso a un rol |
POST | /createUser | Crea un nuevo usuario en la base de datos y en Firebase |
PATCH | /role/migrate | Migra los roles antiguos a la nueva estructura de roles |
Suscripciones
| Método HTTP | Endpoint | Descripción |
|---|
POST | /subscripciones | Crea una nueva suscripción o reactiva una suscripción desactivada |
GET | /subscripciones | Obtiene una lista de suscripciones |
GET | /subscripciones/{id} | Obtiene una suscripción por su ID |
PUT | /subscripciones/{id} | Reemplaza una suscripción por su ID |
DELETE | /subscripciones/{id} | Desactiva una suscripción por su ID (en lugar de eliminarla) |
Infracciones
| Método HTTP | Endpoint | Descripción |
|---|
POST | /infracciones/deleteOne | Elimina (o marca como eliminada) una infracción específica |
PUT | /infracciones/updateMany | Actualiza múltiples infracciones de acuerdo con los datos proporcionados |
DELETE | /infracciones/deleteByDate | Elimina infracciones por fecha |
POST | /infracciones/deleteMany | Elimina (o marca como eliminadas) múltiples infracciones |
POST | /infracciones/approveMany | Aprueba múltiples infracciones |