Backend — Aplicación de Noticias de Proyectos
Documento confidencial · Versión para cliente
Este documento describe el plan de desarrollo del backend para una plataforma híbrida: red social y periódico centrada en noticias y proyectos cercanos. Incluye arquitectura hexagonal, flujos de publicación con verificación por IA y aprobación administrativa, y tecnologías acordadas (React Native para la app móvil, backend con API REST).
Nos encargaremos del backend de forma integral: arquitectura hexagonal, API, base de datos, autenticación, integración con servicios de IA para verificación de contenido, almacenamiento de archivos, pruebas, CI/CD y despliegue en la nube.
El sistema combina red social y periódico: los usuarios cargan proyectos cercanos, pueden crear noticias según su rol, y el contenido pasa por verificación con IA y/o aprobación de un administrador antes de publicarse.
Los usuarios cargan y comparten proyectos cercanos (iniciativas, obras, eventos de su zona). Estos proyectos son contenido de la red social y contexto para las noticias.
Periodistas verificados: usuarios reconocidos que pasan verificación y pueden publicar noticias directamente. Resto de usuarios: pueden crear noticias pero requieren verificación con tokens de IA y luego aprobación de un administrador para que la noticia se publique.
Se utilizarán tokens de IA para revisar que las noticias enviadas por usuarios no verificados cumplan criterios de calidad y coherencia. El resultado de la verificación alimenta el flujo de aprobación.
Un administrador revisa y aprueba las noticias que pasaron la verificación de IA (o las rechaza). Solo el contenido aprobado se publica en el “periódico” visible para todos.
La aplicación móvil (lectura de noticias, carga de proyectos cercanos, creación de noticias por usuarios) se desarrollará con React Native. La elección se justifica por el uso extendido en la industria y los beneficios que aporta al proyecto:
El backend se desarrollará aplicando arquitectura hexagonal: el núcleo del dominio (lógica de negocio, reglas de publicación, verificación) queda aislado de los detalles técnicos; la comunicación con el exterior se hace mediante puertos (interfaces) y adaptadores (implementaciones concretas).
Ventajas para este proyecto: independencia de frameworks y bases de datos, pruebas unitarias del dominio sin infraestructura, y posibilidad de cambiar o añadir adaptadores (otra API, otro proveedor de IA, otro almacenamiento) sin reescribir la lógica de negocio.
Visión de alto nivel: app móvil (React Native), backend con arquitectura hexagonal, panel admin y flujos de publicación diferenciados.
Además se mantendrán consultas optimizadas, caché en servidor (Redis), tiempos de respuesta bajos y una experiencia rápida tanto en el editor web como en la app.
Se compararon los principales frameworks para construir el API de esta plataforma (red social + periódico, arquitectura hexagonal, verificación IA, colas, múltiples roles). El despliegue en producción se realizará con Dokku (PaaS autoalojado tipo Heroku, despliegue por git push, soporte para PostgreSQL, Redis y variables de entorno).
| Framework | Lenguaje | Fortalezas | Ajuste a este proyecto |
|---|---|---|---|
| NestJS | Node.js / TypeScript | Arquitectura por módulos e inyección de dependencias, ideal para hexagonal; TypeScript (tipado, refactor seguro); ecosistema: TypeORM/Prisma, Bull/BullMQ, class-validator, JWT; mismo lenguaje para API y workers. | Muy alto: encaja con hexagonal, flujos complejos (aprobación, IA), colas y validación; Dokku soporta Node nativamente. |
| Laravel | PHP | Desarrollo rápido, Eloquent, colas y caché con Redis, Sanctum/Passport, ecosistema maduro. | Alto: buen CRUD y colas; hexagonal requiere más disciplina; PHP menos habitual en equipos que ya usan React Native/Node. |
| FastAPI | Python | Async, documentación OpenAPI automática, Pydantic; fuerte en integración con ML/IA en el mismo lenguaje. | Medio: excelente para APIs puras; el proyecto solo consume un API de IA externa (HTTP), no corre modelos; menos convención para CRUD + workflows que NestJS/Laravel. |
| Go (Gin / Fiber) | Go | Rendimiento, binario único, concurrencia nativa; muy bueno en Dokku. | Medio: más boilerplate para auth, validación, colas y flujos de aprobación; menos “baterías incluidas” para este tipo de API. |
Se utilizará NestJS con Node.js y TypeScript para este API porque encaja de forma directa con la arquitectura hexagonal que queremos aplicar: los módulos y la inyección de dependencias permiten definir puertos (interfaces) en el núcleo e inyectar adaptadores (repositorios PostgreSQL, cliente de IA, almacenamiento S3) sin acoplar la lógica de negocio al framework. El tipado de TypeScript reduce errores y facilita el mantenimiento para un desarrollador que trabaja solo en el backend. NestJS ofrece soporte nativo para colas (Bull/BullMQ con Redis), validación con DTOs y class-validator, guards para JWT y roles, y una estructura clara por dominios (noticias, proyectos, usuarios, aprobaciones), lo que acelera la implementación de flujos como “verificación IA → aprobación admin” y la distinción entre periodistas verificados y usuarios estándar. La integración con proveedores de IA es trivial (llamadas HTTP desde servicios del núcleo). Por último, el despliegue con Dokku es sencillo (buildpack Node, Procfile, variables de entorno para BD y Redis), y el mismo runtime sirve tanto para el API como para los workers que procesen colas de verificación o notificaciones.
git push, gestión de aplicaciones en contenedores, add-ons o vinculación de PostgreSQL y Redis, y configuración de dominios y SSL. Compatible con el stack NestJS + Node y con pipelines de CI/CD (p. ej. GitHub Actions) que construyan y desplieguen contra el servidor Dokku.
El backend utilizará PostgreSQL como motor principal. El modelo soporta red social + periódico: usuarios que cargan proyectos cercanos, noticias con flujo de verificación IA y aprobación administrativa, y roles que permiten periodistas verificados (publicación directa) frente a usuarios que requieren aprobación. A continuación, tablas y diagrama entidad-relación.
| Tabla | Descripción y campos principales |
|---|---|
roles |
Roles del sistema: admin, editor, verified_journalist (periodista verificado, publica directo), user (requiere aprobación). Columnas: id, name, slug, timestamps. |
users |
Usuarios. Columnas: id, name, email, password (hash), role_id (FK), email_verified_at, remember_token, timestamps. El rol determina si puede publicar directo o debe pasar por aprobación. |
projects |
Proyectos cercanos cargados por usuarios. Campos: id, user_id (FK), name, slug, description, location (o lat/lng), status, timestamps. Contenido propio de la red social. |
categories |
Categorías/tópicos para clasificar noticias. Columnas: id, name, slug, parent_id (opcional), timestamps. |
news |
Noticias con flujo de publicación. Columnas: id, title, slug, excerpt, body, category_id (FK), user_id (autor), project_id (FK opcional), status (draft, pending_ai_review, pending_approval, published, rejected), ai_verified_at, ai_verification_result (o JSON), approved_by (FK user, admin), approved_at, published_at, timestamps. |
comments |
Comentarios en noticias. Columnas: id, news_id (FK), user_id (FK), body, parent_id (respuestas), timestamps. |
media |
Archivos/imágenes (polimórfico: noticia o proyecto). Columnas: id, path, url, type, mediaable_id, mediaable_type, order, timestamps. |
refresh_tokens |
Tokens de refresco JWT. Columnas: id, user_id (FK), token (hash), expires_at, revoked_at, timestamps. |
password_reset_tokens |
Tokens para restablecer contraseña (forgot/reset). Columnas: id, user_id (FK), token (hash o aleatorio), expires_at, used_at, timestamps. |
Profile |
Perfil de usuario (1:1). Columnas: id, userId (FK UNIQUE), firstName, lastName, address, avatar, lastConnectionAt, lastNewsDownloadedId (FK News), lastCommentId (FK Comment), lastSearch, timestamps. Usado por panel admin y app. |
Usuarios con roles (admin, editor, verified_journalist, user); proyectos cercanos subidos por usuarios; noticias con flujo de estado (IA + aprobación); categorías, comentarios y medios. El diagrama se imprime correctamente en PDF.
Se mantendrá un sistema de respaldo automático para garantizar la integridad y recuperación de los datos:
Los respaldos se almacenarán en un almacenamiento seguro (por ejemplo S3 o equivalente) y se documentará el procedimiento de restauración.
El API se desarrollará con NestJS (Node.js + TypeScript) y PostgreSQL, tal como se justifica en la sección anterior. A continuación, aspectos de eficiencia y capacidades del stack elegido.
Cómo el stack NestJS + TypeORM/Prisma + Redis se traduce en eficiencia y mantenibilidad para este API:
| Criterio | Impacto en eficiencia / Por qué esta tecnología |
|---|---|
| TypeORM/Prisma + relaciones | Eager loading y relaciones bien definidas evitan N+1 en listados de noticias (con categoría, autor, proyecto). Menos round-trips a la BD y respuestas del API más rápidas. |
| Redis como caché y colas (BullMQ) | Caché de respuestas (listados, bandera de última noticia) con TTL; colas BullMQ para verificación IA, procesamiento de imágenes o notificaciones en segundo plano sin bloquear la petición HTTP. |
| Índices y consultas en PostgreSQL | Índices en published_at, category_id, status y slugs. Búsquedas full-text opcionales. Planes de ejecución optimizables. |
| Serialización y DTOs | DTOs y class-transformer permiten un formato de respuesta controlado y consistente, reduciendo tamaño de payload y tiempo de parsing en la app React Native. |
| Guards y rate limiting | Guards de NestJS para JWT y roles; throttling por IP o usuario para evitar sobrecarga y mantener tiempos de respuesta estables. |
| Bandera “última noticia” en el API | Endpoint ligero (p. ej. GET /api/v1/news/last-updated) que devuelve solo timestamp o versión. La app compara con su caché y solo pide listado completo cuando hay novedades. |
refresh_tokens.
main, develop y feature branches. Conventional commits y protección de ramas con PRs obligatorios.
.env y validación en arranque (p. ej. @nestjs/config o similar). Secretos fuera del código.
/api/v1/). Documentación con Swagger/OpenAPI.
refresh_tokens, rotación opcional). Endpoints de login, refresh y logout.
media polimórfica (noticia, proyecto).
git push al servidor, buildpack Node, Procfile, PostgreSQL y Redis vinculados (add-ons o servicios externos). Variables y secretos en Dokku; pipeline opcional con GitHub Actions para desplegar contra el servidor Dokku.
El proyecto es una plataforma híbrida: red social y periódico. Los usuarios cargan proyectos cercanos y pueden crear noticias; los periodistas verificados publican directamente, y el resto de usuarios pasan por verificación con tokens de IA y aprobación de un administrador. La app móvil se desarrolla con React Native y el backend con arquitectura hexagonal (ports & adapters), API REST, PostgreSQL, Redis, S3 e integración con proveedores de IA.
El desarrollo se organiza en las fases descritas, con eficiencia, respaldos de BD (cada 12 h y al publicar), tests, Git flow, CI/CD y despliegue en la nube. El modelo de datos incluye roles (admin, editor, verified_journalist, user), proyectos cercanos, noticias con estados de flujo (pendiente_revision_ia, pendiente_aprobacion, publicada) y campos de verificación IA y aprobación.