Creación de Cloud Functions con Firestore en Firebase
Clase 7 de 22 • Curso de Firebase 5: Cloud Functions
Contenido del curso
Consola web de administración
Extendiendo la Gestión de Usuarios con Cloud Functions.
Extendiendo Firestore con Cloud Functions.
Extendiendo el Almacenamiento con Cloud Functions.
Creando Cloud Functions HTTPS
Extendiendo el Hosting con Cloud Functions.
Extendiendo crashlytics con Cloud Functions.
Extendiendo Analytics con Cloud Functions.
Creación de pruebas unitarias a las Cloud Functions.
Optimizando las Cloud Functions.
Cierre
Aprende a conectar Cloud Functions con Firestore para enviar notificaciones segmentadas por tópicos. El flujo activa una función cuando se guarda un token y otra cuando un post pasa a estado publicado. Conocerás cómo usar onCreate y onUpdate, comparar valores con before/after y enviar mensajes con admin.messaging.
¿Cómo se orquesta el flujo de notificaciones con Firestore?
El proceso parte desde el ingreso al blog y concluye con una notificación en el navegador o app. La lógica se apoya en triggers de Firestore y en una clase de utilidades para notificaciones.
- El usuario acepta permisos y se obtiene un token de notificaciones.
- El token se guarda en la colección de tokens en Firestore.
- Se dispara una función que suscribe el token al tópico "nuevos posts".
- Al crear o actualizar un post, su campo publicado pasa de false a true.
- Se dispara otra función que envía una notificación al tópico.
- El usuario ve el mensaje gracias al service worker o en la app.
Conceptos clave que se ponen en práctica: triggers de Firestore, colecciones con comodines {ID}, data snapshot, comparación before/after, tópicos para segmentar y envío de mensajes con admin.messaging.
¿Qué triggers y colecciones se configuran en Firestore?
Se configuran dos listeners sobre rutas de documentos usando functions.firestore.document con comodines entre llaves para el ID generado por Firestore.
¿Qué hace el trigger onCreate en la colección tokens?
Cuando se inserta un documento en "tokens/{ID}", el trigger onCreate recibe un data snapshot del documento recién creado. Desde ahí se extrae el campo token y se registra en el tópico objetivo.
Ejemplo de patrón de implementación:
exports.registrarTopico = functions.firestore
.document('tokens/{id}')
.onCreate((snapshot) => {
const token = snapshot.data().token;
// Llama al controlador de notificaciones para suscribir al tópico.
return NotificationController.registrarTokenAlTopico(token);
});
Puntos importantes: - Uso de la ruta con comodín: 'tokens/{id}'. - Acceso a campos con snapshot.data(). - Delegación a un controlador para mantener la lógica separada.
¿Qué hace el trigger onUpdate en la colección posts?
Cuando cambia un documento en "posts/{ID}", el trigger onUpdate permite comparar el valor anterior y el nuevo con change.before.data() y change.after.data(). La notificación solo se envía si publicado pasa de false a true.
exports.enviarNotificacion = functions.firestore
.document('posts/{id}')
.onUpdate((change) => {
const antes = change.before.data();
const despues = change.after.data();
const cambioAPublicado = antes.publicado === false && despues.publicado === true;
if (!cambioAPublicado) return null;
// Llama al controlador del post para construir y enviar el mensaje.
return PostController.actualizacionPostController(despues);
});
Claves de este patrón: - Comparación de estados con before/after. - Condición estricta para evitar notificaciones innecesarias. - Separación de responsabilidades en un controller.
¿Cómo se implementan los controladores y la clase de notificaciones?
La lógica de negocio se encapsula en dos controladores y una clase utilitaria que usa la librería admin de Firebase para enviar y suscribir mensajes.
¿Qué hace la clase Notificaciones con admin.messaging?
- Instancia la librería admin y accede a messaging.
- Suscribe el token al tópico con un método tipo "registrar token al tópico".
- Expone un método "enviar notificación" que recibe: título, descripción, tópico y tipo.
- Si el tópico llega como null, usa por defecto "nuevos posts".
- Construye un payload con título, descripción y datos, y llama a admin.messaging.send.
Buenas prácticas derivadas: - Tópicos para segmentar audiencias sin manejar listas manuales. - Parámetros explícitos: título, descripción, tópico y tipo para controlar el mensaje. - Valores por defecto: tópico "nuevos posts" cuando no se especifica.
¿Cómo colaboran los controladores con las funciones?
- El controlador de notificaciones recibe el token desde el data snapshot y ejecuta la suscripción al tópico.
- El controlador de posts valida el cambio de publicado y delega a la clase de notificaciones el envío del mensaje con el título y la descripción del post obtenidos de after.data().
Habilidades fortalecidas en este flujo: - Diseño de Cloud Functions reactivas con onCreate y onUpdate. - Manejo de snapshots y comparación before/after. - Gestión de tópicos y tokens con admin.messaging. - Separación de responsabilidades con controladores reutilizables.
¿Tienes dudas sobre el patrón de triggers, la comparación before/after o el uso de tópicos? Cuéntame en comentarios qué parte quieres ver en más detalle.