Cloud Functions para validar imágenes con Vision

Clase 9 de 22Curso de Firebase 5: Cloud Functions

Resumen

Sube imágenes con confianza: configura Cloud Functions para validar contenido en Firebase Storage y evita material violento o para adultos con la API de Google Cloud Vision. En pocos pasos, escucharás eventos de subida, filtrarás por carpeta y tipo de archivo, y prepararás la imagen para su análisis.

¿Cómo configurar Cloud Functions para archivos en Firebase Storage?

Configurar un disparador al subir archivos te permite actuar en tiempo real. La clave es exponer la función, elegir el evento correcto y encadenar la lógica de validación hacia tu controlador.

¿Qué eventos de storage puedes escuchar?

  • onFinalize: se dispara cuando se crea o guarda un archivo en storage.
  • Eliminación de archivos: se puede escuchar cuando se borra un archivo.
  • archive: útil si activas versionamiento y quieres actuar ante nuevas versiones.
  • Actualización de metadata: reacciona cuando cambian metadatos del archivo.

¿Cómo exponer la función y nombrarla?

  • Define el nombre público de tu Cloud Function con exports.
  • Usa functions.storage.object().onFinalize(...) para reaccionar a nuevas subidas.
// Ejemplo de exposición y disparador
exports.validarimagen = functions.storage.object().onFinalize(async (imagen) => {
  return postController
    .validarImagenPostControl(imagen)
    .catch((error) => {
      console.error(error);
      return null;
    });
});

¿Cómo encadenar la lógica con tu controlador?

  • centraliza la validación en un controller (por ejemplo, postController.validarImagenPostControl).
  • maneja errores con catch e imprime en el log para depurar.

¿Cómo validar directorio y tipo de archivo antes de procesar?

Antes de llamar a la API de Cloud Vision, verifica que el archivo esté en la carpeta correcta y que sea una imagen. Esto evita ejecuciones innecesarias y costos.

  • Revisa la carpeta: el directorio esperado es imgs post en storage.
  • Comprueba el tipo: usa la propiedad contentType y valida con startsWith image.
  • Si no cumple, registra en el log y retorna null.
// Validaciones iniciales en el controlador
const esDeDirectorio = imagen.name && imagen.name.match('imgs post');
if (!esDeDirectorio) {
  return null; // Archivo en otro directorio.
}

if (!imagen.contentType || !imagen.contentType.startsWith('image')) {
  console.log('El archivo no es una imagen.');
  return null;
}

// Continúa con la preparación para Cloud Vision...

¿Cómo preparar la imagen y usar Cloud Vision?

La validación requiere procesar la imagen en el entorno de la función. Para ello, instálala librería de Cloud Vision con npm y utiliza utilidades de Node para gestionar rutas y archivos temporales.

¿Qué pasos siguen para instalar y preparar el entorno?

  • Instala la librería de Google Cloud Vision con npm install --save.
  • Importa librerías nativas: path, os y file system.
  • Descarga la imagen desde storage al entorno temporal de la función.

¿Qué datos necesitas extraer del archivo?

  • Ruta completa del archivo en storage con imagen.name.
  • Nombre base del archivo con path y su extensión (base name).
  • ID del post: quita la extensión con un split por punto y toma la primera parte.
// Extracción de datos del archivo
const rutaArchivo = imagen.name; // Directorio + nombre + extensión.
const nombreArchivo = path.basename(rutaArchivo); // ejemplo: imagen.png
const idPost = path.basename(rutaArchivo).split('.')[0]; // ejemplo: imagen -> ID del post

¿Cómo obtener el bucket y una ruta temporal segura?

  • Obtén el bucket con admin.storage().bucket() para operar sobre el archivo.
  • Define una ruta temporal con os.tmpdir() y path.join para trabajar en el entorno de la función.
// Bucket y ruta temporal
const bucket = admin.storage().bucket();
const tmpRuta = path.join(os.tmpdir(), nombreArchivo); // /tmp/nombreArchivo

Una vez descargues la imagen en tmpRuta, podrás invocar la API de Cloud Vision para validar si contiene violencia o contenido adulto y luego actualizar el documento asociado con el ID del post.

¿Te gustaría ver el siguiente paso con la llamada a Cloud Vision y el flujo de actualización en base de datos? Comparte tus dudas o casos de uso en los comentarios.