Construcción de Controladores HTTP en Node.js con Firebase
Clase 13 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 construir un controlador de la API HTTP que consulta Firestore y envía un correo semanal con los posts aprobados. Paso a paso, verás cómo manejar fechas, componer queries eficientes y utilizar una utilidad de correo con HTML. Todo sucede con operaciones asíncronas encadenadas y validaciones claras para evitar envíos innecesarios.
¿Cómo queda el controlador de la API HTTP?
El flujo inicia en el controlador del post, donde se instancia la clase Post y se invoca su función para enviar el post de la semana. El tópico llega en el body de la solicitud. Se retorna la promesa para mantener el ciclo asíncrono.
- Instanciar la clase Post y retornar la ejecución de su método.
- Leer el tópico desde el body de la API.
- Encadenar la promesa con el resto de la lógica.
¿Qué parámetros viajan en el body?
- El tópico del envío.
- Se procesa internamente y no requiere transformación adicional.
¿Por qué retornar la promesa del método?
- Mantiene la naturaleza asíncrona del controlador.
- Permite encadenar .then y manejar estados finales.
// Esqueleto del controlador
export const postController = (req, res) => {
const { topic } = req.body; // tópico en el body
const post = new Post();
return post.enviarPostSemana(topic);
};
¿Qué consultas a Firestore traen los posts de la semana?
Primero se calculan fechas. Luego se consulta la colección de emails de usuarios, y después los posts publicados dentro del rango de los últimos cinco días. Todo se hace con promesas y arrow functions.
- Fechas clave: fecha fin = hoy; fecha inicial = hoy − 5 días.
- Colecciones utilizadas: Emails usuarios y posts.
- Condiciones: fecha >= fecha inicial, fecha <= fecha fin y publicado == true.
¿Cómo se calculan fecha inicial y fin?
- Se usan new Date, getDate y setDate para restar 5 días.
- La fecha inicial depende de la fecha fin para asegurar coherencia.
const fechaFin = new Date();
const fechaInicial = new Date();
fechaInicial.setDate(fechaFin.getDate() - 5);
¿Cómo se obtienen y concatenan los emails?
- Se consulta la colección Emails usuarios.
- Se recorre el snapshot y se concatena el campo email de cada documento con .data().
let emails = '';
return admin.firestore().collection('Emails usuarios').get()
.then((emailUsuarios) => {
emailUsuarios.forEach((emailUsuario) => {
emails += emailUsuario.data().email;
});
return emails; // continuar cadena
})
¿Cómo se filtran los posts publicados en la semana?
- Se usa where para filtrar por rango de fecha y por publicado == true.
- Se llama a .get() y se valida !posts.empty antes de enviar correo.
- Nota importante: puede requerir índice compuesto por fecha y publicado.
.then(() => {
return admin.firestore().collection('posts')
.where('fecha', '>=', fechaInicial)
.where('fecha', '<=', fechaFin)
.where('publicado', '==', true)
.get();
})
.then((posts) => {
if (!posts.empty) {
// continuar con plantilla y envío
} else {
return null; // no hay posts
}
})
¿Cómo se arma el HTML y se envía el correo?
Si hay resultados, se construye el HTML con una utilidad de plantillas y se usa la clase de correo para enviar. Se define el from, los destinatarios, el asunto y el HTML final.
- Plantilla: video de la semana con la lista de posts.
- Clase de correo: instancia de Email y método sendMail.
- Parámetros: from = info@bloggeek.co, to = emails, bcc vacío, asunto y HTML.
¿Qué validaciones aseguran un envío correcto?
- Solo se envía si !posts.empty.
- Si no hay posts, se retorna null y termina el flujo.
if (!posts.empty) {
const html = plantillaVideoDeLaSemana(posts);
const objEmail = new Email();
return objEmail.sendMail({
from: 'info@bloggeek.co',
to: emails,
bcc: '',
subject: 'video blog geek: los videos geek de la semana',
html,
});
}
return null;
- Palabras clave y habilidades trabajadas: controlador de la API HTTP, librería cors, clase Post, función enviar post de la semana, manejo de fechas con new Date, getDate y setDate, consultas a Firestore con collection, where, get, manejo de promesas con .then, uso de arrow functions, acceso a datos con .data(), validación con .empty, plantillas HTML, envío con sendMail, y creación de índices cuando el query lo requiere.
¿Quieres que revisemos tu query o la estructura de tu plantilla? Cuéntame en los comentarios qué parte te gustaría optimizar o probar primero.