Saltar al contenido principal

Primeros pasos

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:

  • 027-auditorias.js → Responsable de registrar auditorías para los siguientes modelos:

    • Choferes
    • Transportistas
    • Tipo de lugares
    • Lugares
    • Cartografía
    • Productos
    • Negocios
    • Vehículos
    • Cisterna de vehículos
    • Marca de vehículos
    • Tipo de DVRs
    • Grupos
    • Gerencias
    • Descargos
    • Avisos
    • Usuarios
    • Suscripciones
  • infracciones.js → Maneja la auditoría del modelo Infracciones.

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

  1. 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.
  2. 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.
  3. 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étodoEndpointDescripción
POST/descargosCrear un nuevo descargo
GET/descargosObtener todos los descargos
GET/descargos/{id}Obtener un descargo por ID
GET/descargos/findOneObtener un descargo único según filtros
PUT/descargos/{id}Reemplazar un descargo por ID
DELETE/descargos/{id}Eliminar un descargo por ID
GET/descargos/countObtener la cantidad total de descargos
PATCH/descargosCrear o actualizar un descargo (upsert)
PATCH/descargos/{id}Actualizar parcialmente un descargo por ID

Choferes

MétodoEndpointDescripción
POST/choferesCrear un nuevo chofer
GET/choferesObtener todos los choferes
GET/choferes/{id}Obtener un chofer por ID
GET/choferes/findOneObtener un chofer único según filtros
PATCH/choferesCrear 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/countObtener la cantidad total de choferes
POST/choferes/altaChoferDar de alta un chofer
POST/choferes/sendPushNotificationEnviar una notificación push a un chofer

Transportistas

Método HTTPEndpointDescripción
GET/transportistasObtiene todos los transportistas.
GET/transportistas/:idObtiene un transportista por ID.
GET/transportistas/findOneObtiene un transportista que coincida con filtros.
POST/transportistasCrea un nuevo transportista.
PUT/transportistas/:idReemplaza un transportista por ID.
PATCH/transportistas/:idModifica parcialmente un transportista por ID.
DELETE/transportistas/:idElimina un transportista por ID.
GET/transportistas/countObtiene el número total de transportistas.
GET/transportistas/kilometers/countObtiene el conteo de kilómetros recorridos.
GET/transportistas/kilometersObtiene los kilómetros recorridos por todos los transportistas.
GET/transportistas/:id/kilometersObtiene los kilómetros recorridos por un transportista específico.
GET/transportistas/vehiclesCountObtiene la cantidad de vehículos por transportista.

Tipo de lugares

Método HTTPEndpointDescripción
GET/tipoLugaresObtiene todos los registros de tipoLugares.
GET/tipoLugares/:idObtiene un registro de tipoLugares por ID.
GET/tipoLugares/findOneObtiene un registro que coincida con filtros.
POST/tipoLugaresCrea un nuevo registro de tipoLugares.
PUT/tipoLugares/:idReemplaza un registro de tipoLugares por ID.
PATCH/tipoLugaresModifica parcialmente un registro o crea uno nuevo.
PATCH/tipoLugares/:idModifica parcialmente un registro por ID.
DELETE/tipoLugares/:idElimina un registro de tipoLugares por ID.
GET/tipoLugares/countObtiene el número total de registros.

Lugares

Método HTTPEndpointDescripción
GET/lugaresObtiene todos los registros de lugares.
GET/lugares/:idObtiene un registro de lugares por ID.
GET/lugares/findOneObtiene un registro que coincida con filtros.
POST/lugaresCrea un nuevo registro de lugares.
PUT/lugares/:idReemplaza un registro de lugares por ID.
PATCH/lugaresModifica parcialmente un registro o crea uno nuevo.
PATCH/lugares/:idModifica parcialmente un registro por ID.
DELETE/lugares/:idElimina un registro de lugares por ID.
GET/lugares/countObtiene el número total de registros.
POST/lugares/importKml/:tipoLugarIdImporta un archivo KML en un tipo de lugar específico.
GET/lugares/searchByPointDevuelve los lugares que contienen un punto específico.

Cartografia

Método HTTPEndpointDescripción
GET/cartografiaObtiene todos los registros de cartografía.
GET/cartografia/:idObtiene un registro de cartografía por ID.
POST/cartografiaCrea un nuevo registro de cartografía.
PUT/cartografia/:idReemplaza un registro de cartografía por ID.
PATCH/cartografia/:idModifica parcialmente un registro por ID.
DELETE/cartografia/:idElimina un registro de cartografía por ID.
GET/cartografia/countObtiene el número total de registros de cartografía.

Productos

Método HTTPEndpointDescripción
GET/productosObtiene todos los productos.
GET/productos/:idObtiene un producto por ID.
POST/productosCrea un nuevo producto.
PUT/productos/:idReemplaza un producto por ID.
PATCH/productos/:idModifica parcialmente un producto por ID.
DELETE/productos/:idElimina un producto por ID.
GET/productos/countObtiene el número total de productos.

Negocios

Método HTTPEndpointDescripción
GET/negociosObtiene todos los negocios.
GET/negocios/:idObtiene un negocio por ID.
POST/negociosCrea un nuevo negocio.
PUT/negocios/:idReemplaza un negocio por ID.
PATCH/negocios/:idModifica parcialmente un negocio por ID.
DELETE/negocios/:idElimina un negocio por ID.
GET/negocios/countObtiene el número total de negocios.

Vehículos

MétodoEndpointDescripción
GET/kilometersObtiene los kilómetros del vehículo.
GET/v2/kilometersObtiene los kilómetros del vehículo, versión 2.
GET/v2/kilometers/countObtiene el conteo de kilómetros, versión 2.
GET/kilometers/countObtiene el conteo de kilómetros.
GET/kilometers/tendencyObtiene la tendencia de los kilómetros.
DELETE/cleanRedisDataElimina los datos de Redis relacionados con vehículos.
GET/customCountObtiene un conteo personalizado.

Cisterna de vehículos

MétodoEndpointDescripción
POST/create/Endpoint para la creación de CisternaVehiculos.
PATCH/update/:idEndpoint para la actualización de CisternaVehiculos.
DELETE/delete/:idEndpoint para eliminar un CisternaVehiculos.

Marca de vehículos

Método HTTPEndpointDescripción
GET/marcaVehiculosRecupera una lista de marcaVehiculos
GET/marcaVehiculos/:idRecupera un marcaVehiculos por ID
GET/marcaVehiculos/oneRecupera un único marcaVehiculos
GET/marcaVehiculos/countCuenta el número de marcaVehiculos
POST/marcaVehiculosCrea un nuevo marcaVehiculos

Tipo de DVRs

Método HTTPEndpointDescripción
GET/tipoDVRRecupera una lista de tipoDVR
GET/tipoDVR/:idRecupera un tipoDVR por ID
GET/tipoDVR/oneRecupera un único tipoDVR
GET/tipoDVR/countCuenta el número de tipoDVR
POST/tipoDVRCrea un nuevo tipoDVR
PUT/tipoDVR/:idReemplaza un tipoDVR por ID
DELETE/tipoDVR/:idElimina un tipoDVR por ID
PATCH/tipoDVRActualiza o crea un tipoDVR
PATCH/tipoDVR/:idActualiza las propiedades de un tipoDVR

Grupos

Método HTTPEndpointDescripción
GET/grupos/:idEndpoint 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/:idEndpoint para borrar un grupo
PUT/grupos/:idEndpoint para editar transportistas de un grupo

Gerencias

Método HTTPEndpointDescripción
GET/gerencias/:idEndpoint para obtener una gerencia y sus grupos
GET/gerencias/Endpoint para obtener gerencias
POST/gerencias/Endpoint para crear una nueva gerencia
DELETE/gerencias/:idEndpoint para borrar una gerencia
PUT/gerencias/:idEndpoint para editar una gerencia

Avisos

Método HTTPEndpointDescripción
GET/avisos/:idEndpoint 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/:idEndpoint para reemplazar un aviso por su ID
DELETE/avisos/:idEndpoint para borrar un aviso por su ID
POST/avisos/patchOrCreateEndpoint para crear o actualizar un aviso
PATCH/avisos/:idEndpoint para actualizar parcialmente un aviso

Usuarios

Método HTTPEndpointDescripción
POST/asignarRolAsigna un rol a un usuario
POST/loginInicia sesión para un usuario
GET/getInfoObtiene información de un usuario por su email
GET/authObtiene la metadata de autenticación de un usuario
GET/metadataObtiene la metadata del usuario
POST/addPermisosCrea un nuevo permiso para un rol y asigna el permiso a un rol
POST/createUserCrea un nuevo usuario en la base de datos y en Firebase
PATCH/role/migrateMigra los roles antiguos a la nueva estructura de roles

Suscripciones

Método HTTPEndpointDescripción
POST/subscripcionesCrea una nueva suscripción o reactiva una suscripción desactivada
GET/subscripcionesObtiene 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 HTTPEndpointDescripción
POST/infracciones/deleteOneElimina (o marca como eliminada) una infracción específica
PUT/infracciones/updateManyActualiza múltiples infracciones de acuerdo con los datos proporcionados
DELETE/infracciones/deleteByDateElimina infracciones por fecha
POST/infracciones/deleteManyElimina (o marca como eliminadas) múltiples infracciones
POST/infracciones/approveManyAprueba múltiples infracciones