El patrón Facade oculta la coordinación de varios subsistemas tras un único método simple.
1. El Problema de Partida
Publicar un post nuevo en el proyecto implica: leer y parsear el .mdx, validar campos obligatorios del frontmatter (translation_id, category), generar el slug a partir de la ruta de archivo, y emitir el evento de publicación (ver Patrón Observer) para revalidar caché. Repetir estos 4 pasos manualmente en cada script (scripts/new-post.js, scripts/migrate-posts.js) duplica lógica y es fácil olvidar un paso (como la revalidación).
2. La Solución Facade
// src/lib/PublishFacade.js
import matter from 'gray-matter';
import fs from 'fs';
import { validateFrontmatter } from './validateFrontmatter';
import { buildSlugFromPath } from './buildSlugFromPath';
import { publishEvents } from './events/PublishEventEmitter';
export class PublishFacade {
publish(filePath) {
const raw = fs.readFileSync(filePath, 'utf-8');
const { data: frontmatter, content } = matter(raw);
validateFrontmatter(frontmatter); // Lanza si falta translation_id, category, etc.
const slug = buildSlugFromPath(filePath);
const post = { ...frontmatter, slug, content };
publishEvents.emit('postPublished', post); // Revalidación, analítica, Slack
return post;
}
}3. Uso
// scripts/new-post.js — antes: 4 pasos manuales repetidos; ahora: 1 llamada
const post = new PublishFacade().publish('content/knowledge/es/design-patterns/bridge.mdx');
console.log(`Publicado: ${post.title} (${post.slug})`);4. Ventajas
- Un único punto de entrada para publicar, usado por scripts, CLI y futuros endpoints admin.
- Nadie olvida un paso: validar, generar slug y revalidar están garantizados dentro de la fachada.
- Acceso avanzado sigue disponible: si un script necesita solo
validateFrontmatter, puede importarla directamente sin pasar por la fachada.