Edge Functions para notificaciones automáticas
Clase 16 de 17 • Supabase Avanzado
Contenido del curso
Autenticación
CRUD de la aplicación
Seguridad avanzada
Dashboard con Supabase Realtime
Emails y Resend para Suplatzigram
MCP y Edge Functions
Una arquitectura profesional de notificaciones no depende del frontend: se orquesta desde el backend con eventos automáticos. Aquí verás cómo usar Edge Functions y Realtime de Supabase para disparar notificaciones cuando hay un like o un comentario, con UI en vivo y control desde la base de datos.
¿Cómo automatizar notificaciones con Supabase Edge Functions y Realtime?
Para que las notificaciones sean confiables, la base de datos debe disparar un webhook a una edge function en cada like o comentario. Esa función recibe quién actuó, sobre qué post, quién es el dueño del post y, con eso, registra y publica la notificación en tiempo real.
- Flujo robusto: la BD dispara el evento y la función decide acciones como enviar correo, guardar notificación o mostrar un toast.
- UI en vivo: una campanita muestra burbujas y lista de notificaciones en tiempo real.
- Componentes clave: tabla de notificaciones, edge function y despliegue en Supabase.
¿Qué tabla de notificaciones necesitas?
Se crea desde el editor SQL de Supabase. La tabla incluye:
- ID primario e índice para escalabilidad.
- Campos: user_id (FK a auth.users), actor_id, type (like/comment), post_id, message, created_at.
- Publicación a Supabase Realtime activada para recibir cambios en vivo.
Beneficio: al activar Realtime en la tabla, la UI se puede suscribir y reaccionar a inserts/updates sin trabajo extra.
¿Cómo crear y desplegar la edge function en Deno?
Las edge functions corren en Deno, se invocan por HTTP y Supabase da plantillas (p. ej., webhook con Stripe, servidor WebSocket). Aquí el foco es una función que:
- Expone CORS y maneja método HTTP OPTIONS y POST.
- Valida campos requeridos: type, post_id, actor_id, post_owner_id y, si aplica, message.
- Evita notificar si el actor es el dueño del post.
- Consulta el perfil del actor para componer el mensaje.
- Inserta en la tabla notifications y responde con manejo de errores.
- Se nombra como "send notification" y se despliega para obtener una URL, métricas e invocations.
Fragmento ilustrativo (Deno/TypeScript):
// Estructura de la edge function (conceptual)
// Deno.serve(async (req) => {
// if (req.method === 'OPTIONS') return corsResponse();
// if (req.method !== 'POST') return error(405);
//
// const { type, post_id, actor_id, post_owner_id, message } = await req.json();
// // Validar requeridos y evitar self-notify.
// // Buscar actor username.
// // Insert en 'notifications' con type, post_id, user_id (post_owner_id), actor_id, message.
// // Responder con éxito o error.
// });
Tras desplegar, el panel muestra la URL, estadísticas por rango (15 min, 1 h, 3 h, 1 día), invocations y logs para depuración.
¿Cómo invocarla desde el frontend en like y comment?
En la página principal (app/page.tsx) existen dos manejadores: handle like y handle comment. La idea es invocar la función solo si no hay error y si el usuario que actúa no es el dueño del post.
- Para like: enviar body con type: "like", post_id, actor_id, post_owner_id.
- Para comment: enviar body con type: "comment", post_id, actor_id, post_owner_id y message.
Fragmentos ilustrativos del payload:
{
"type": "like",
"post_id": "...",
"actor_id": "...",
"post_owner_id": "..."
}
{
"type": "comment",
"post_id": "...",
"actor_id": "...",
"post_owner_id": "...",
"message": "Texto del comentario"
}
¿Cómo se muestran las notificaciones en tiempo real en la UI?
Se añadió un componente de campanita de notificaciones. Al suscribirse a Realtime, reacciona a cambios en la tabla notifications y muestra una burbuja cuando hay items con read: false del usuario logueado.
- Suscripción a un canal de cambios de Postgres en la tabla notifications.
- Filtro por user_id del usuario actual y por read === false.
- Inserta/actualiza la lista en memoria para render en vivo.
- Acción de "marcar como leídas" que cambia read a true y limpia la burbuja.
La verificación se hace en dos frentes: en el panel de funciones (invocations POST correctas) y en las tablas (se insertan el comentario en comments y la notificación en notifications con el mensaje mostrado en la UI).
¿Qué conceptos y habilidades clave se practican?
Dominas un patrón de eventos de producción: la base de datos reacciona y una función decide qué hacer con la señal. Estos son los puntos finos que refuerzas:
- Edge Functions en Deno: funciones server-side con CORS, métodos HTTP y despliegue administrado.
- Supabase Realtime: publicación en tablas y suscripción a canales de cambios de Postgres.
- Webhook desde la BD: la BD origina el evento, no el frontend.
- Validación de payload: campos type, post_id, actor_id, post_owner_id y message cuando aplica.
- Prevención de auto-notificación: no avisar si el actor es el dueño del post.
- Consulta de perfil: obtener actor username para construir el message.
- Inserción con manejo de errores: insert + select single en notifications.
- Índices e incrementalidad: index para escalar la tabla y mantener rendimiento.
- Panel de funciones: URL pública, métricas por ventana de tiempo, invocations y logs.
- UI reactiva: campanita que lee read: false, muestra burbujas y permite marcar como leídas.
- Manejadores de eventos: handle like y handle comment invocan "send notification" tras éxito.
¿Quieres que revisemos variantes como enviar email o mostrar toast además de la notificación interna? Cuéntame en comentarios qué flujo te gustaría implementar.