ImageModerationDetectorService

Este documento describe el funcionamiento del archivo image-moderation-detector.service.ts, el cual forma parte del backend NestJS del sistema ElephanTalk. Su objetivo principal es analizar una imagen (por URL o base64) para determinar si contiene contenido NSFW (Not Safe For Work).


Objetivo del Servicio

Este servicio proporciona una capa de integración con un microservicio externo de moderación de imágenes, el cual retorna un nivel de probabilidad de contenido NSFW. Si la imagen supera un umbral definido por el entorno, se considera inapropiada.


Dependencias

  • @nestjs/common: Proporciona decoradores como @Injectable y excepciones HTTP como ServiceUnavailableException.
  • @nestjs/axios: Utilizado para realizar peticiones HTTP al microservicio de moderación.
  • rxjs: Para convertir observables a promesas.
  • @nestjs/config: Acceso a variables de entorno (IMAGE_MODERATION_URL y IMAGE_MOD_THRESHOLD_NSF).

Variables de Entorno Relevantes

Variable Descripción
IMAGE_MODERATION_URL URL base del microservicio de moderación de imágenes
IMAGE_MOD_THRESHOLD_NSF Umbral numérico (0 a 1) para considerar la imagen NSFW

Interfaz Interna

interface ModerationResult {
  nsfw: { nsfw: number };
}

Esta interfaz modela el resultado que devuelve el microservicio. El atributo nsfw.nsfw representa un valor entre 0 y 1 que indica la probabilidad de que la imagen sea NSFW.


Métodos

constructor()

Inicializa el servicio cargando la URL y el umbral desde las variables de entorno.


async isImageAllowed(base64OrUrl: string, isUrl = false): Promise<{ allowed: boolean; reasons: string\[]; raw: ModerationResult }>

Evalúa una imagen y determina si puede ser publicada o no.

Parámetros:

  • base64OrUrl: cadena base64 o URL de la imagen.
  • isUrl: booleano que indica si el primer argumento es una URL o una cadena base64.

Proceso:

  1. Construye el payload dependiendo de isUrl.
  2. Hace una petición POST a /moderate del microservicio externo.
  3. Si la petición falla, lanza ServiceUnavailableException.
  4. Compara el valor de raw.nsfw.nsfw con el umbral (thrNsfw).
  5. Si supera el umbral, se considera NSFW y se agrega a reasons.
  6. Imprime log de depuración con valores clave.
  7. Retorna:
  8. allowed: true si la imagen pasa el filtro.
  9. reasons: razones por las cuales fue rechazada.
  10. raw: objeto con el resultado completo de moderación.

Ejemplo de log generado:

[MODERACIÓN IMAGEN] {
  url: 'https://ejemplo.com/imagen.jpg',
  isUrl: true,
  rawScore: 0.91,
  threshold: 0.8,
  reasons: ['NSFW']
}

Posibles Excepciones

  • ServiceUnavailableException: Si el microservicio de moderación está inactivo o la petición falla por timeout u otros motivos.

Recomendaciones

  • Asegúrate de configurar correctamente el .env con IMAGE_MODERATION_URL y IMAGE_MOD_THRESHOLD_NSF.
  • Puedes ajustar el umbral si deseas una moderación más o menos estricta.
  • Verifica que el microservicio externo esté levantado y accesible desde el contenedor de NestJS si usas Docker.