Una API REST completa para un sistema de blog con autenticación, gestión de posts, comentarios y usuarios.
Este proyecto utiliza Feature-Based Architecture (Arquitectura Basada en Características), organizando el código por funcionalidades en lugar de por tipo de archivo.
- ✅ Modularidad: Cada feature es independiente y autocontenida
- ✅ Escalabilidad: Fácil añadir nuevas features sin afectar las existentes
- ✅ Mantenibilidad: Código más fácil de entender y modificar
- ✅ Testing: Pruebas más sencillas por módulos aislados
- ✅ Team-friendly: Múltiples desarrolladores pueden trabajar en features distintas
- ✅ Autenticación JWT con refresh tokens
- ✅ CRUD completo de Posts con slugs únicos
- ✅ Sistema de comentarios con respuestas anidadas
- ✅ Gestión de usuarios con roles (USER/ADMIN)
- ✅ Sistema de tags
- ✅ Paginación y búsqueda
- ✅ Subida de imágenes (local o DigitalOcean Spaces)
- ✅ Envío de emails transaccionales (Brevo)
- ✅ TypeScript con strict mode
- ✅ Feature-Based Architecture
- ✅ Prisma ORM con migraciones
- ✅ Redis para caching
- ✅ Rate limiting
- ✅ Logging avanzado con Winston
- ✅ Health checks y monitoring
- ✅ Tests con Vitest
- ✅ Documentación API con Swagger
- ✅ Seeders con datos de prueba
- ✅ Helmet.js para headers de seguridad
- ✅ CORS configurado
- ✅ Validación de datos con Zod
- ✅ Password hashing con bcrypt
- ✅ Rate limiting por endpoint
- ✅ JWT con expiración
- Node.js + TypeScript - Runtime y lenguaje
- Express - Framework web
- PostgreSQL - Base de datos relacional
- Prisma - ORM moderno
- Zod - Validación de schemas
- JWT - Autenticación
- bcryptjs - Hash de contraseñas
- Helmet + CORS - Seguridad
node-api-blog/
├── src/
│ ├── features/ # Módulos por funcionalidad
│ │ ├── auth/ # 🔐 Autenticación
│ │ │ ├── auth.controller.ts
│ │ │ ├── auth.service.ts
│ │ │ ├── auth.routes.ts
│ │ │ └── index.ts
│ │ ├── posts/ # 📝 Posts
│ │ ├── users/ # 👤 Usuarios
│ │ └── comments/ # 💬 Comentarios
│ ├── shared/ # Código compartido
│ │ ├── middleware/
│ │ │ ├── auth.middleware.ts
│ │ │ └── validation.middleware.ts
│ │ └── utils/
│ ├── lib/ # Configuración de librerías
│ │ └── prisma.ts
│ ├── types/ # Tipos TypeScript
│ │ └── index.ts
│ ├── app.ts # Configuración Express
│ └── index.ts # Punto de entrada
├── prisma/
│ └── schema.prisma
├── dist/ # Código compilado
├── tsconfig.json
├── MIGRATION_GUIDE.md # Guía de migración
└── NEXT_STEPS.md # Próximas mejoras
# 1. Clonar repositorio
git clone <repo-url>
cd node-api-blog
# 2. Instalar dependencias
npm install
# 3. Configurar variables de entorno
cp .env.example .env
# 4. Ejecutar migraciones
npm run db:migrate
# 5. Generar cliente Prisma
npm run db:generate
# 6. Poblar base de datos (opcional)
npm run db:seed# Server
PORT=3000
NODE_ENV=development
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/blog_db"
# JWT
JWT_SECRET=your-secret-key-here
JWT_EXPIRES_IN=7d# Desarrollo (con hot-reload)
npm run dev
# Compilar TypeScript
npm run build
# Producción
npm start
# Base de datos
npm run db:migrate # Ejecutar migraciones
npm run db:generate # Generar cliente Prisma
npm run db:studio # Abrir Prisma Studio
npm run db:seed # Poblar con datos de pruebaPOST /api/auth/register- Registrar usuarioPOST /api/auth/login- Iniciar sesiónGET /api/auth/me- Obtener usuario actualPOST /api/auth/refresh- Renovar token
GET /api/posts- Listar posts (con paginación, búsqueda, filtros)GET /api/posts/:slug- Obtener post por slugPOST /api/posts- Crear post (autenticado)PUT /api/posts/:id- Actualizar post (autor/admin)DELETE /api/posts/:id- Eliminar post (autor/admin)GET /api/posts/author/:username- Posts por autor
GET /api/comments/post/:postId- Comentarios de un postPOST /api/comments/post/:postId- Crear comentario (autenticado)PUT /api/comments/:id- Actualizar comentario (autor/admin)DELETE /api/comments/:id- Eliminar comentario (autor/admin)GET /api/comments/user/:userId- Comentarios de un usuario
GET /api/users- Listar usuarios (admin)GET /api/users/profile- Perfil actual (autenticado)GET /api/users/:id- Obtener usuario por IDGET /api/users/username/:username- Obtener usuario por usernamePUT /api/users/profile- Actualizar perfil (autenticado)PUT /api/users/change-password- Cambiar contraseña (autenticado)PUT /api/users/:id/role- Cambiar rol de usuario (admin)DELETE /api/users/:id- Eliminar usuario (admin)
POST /api/images/upload- Subir imagen (autenticado)POST /api/images/upload-multiple- Subir múltiples imágenes (autenticado)PUT /api/images/avatar- Actualizar avatar (autenticado)DELETE /api/images/:filename- Eliminar imagen (autenticado)GET /api/images/list- Listar imágenes (admin)
Cada feature sigue el patrón de 3 capas:
- Maneja requests y responses HTTP
- Valida datos de entrada
- Llama al service apropiado
- Formatea las respuestas
- Contiene la lógica de negocio
- Interactúa con la base de datos (Prisma)
- Independiente de HTTP
- Fácil de testear
- Define endpoints
- Aplica middlewares (auth, validación)
- Conecta rutas con controllers
Flujo de una petición:
Request → Route → Middleware → Controller → Service → Database
↓
Response ← Controller ← Service ←┘
- ID, email, username, firstName, lastName
- Password (hasheado), role (USER/ADMIN)
- Avatar, bio, timestamps
- ID, title, slug, content, excerpt
- featuredImage, published, publishedAt
- Relación con autor y comentarios
- Sistema de tags
- ID, content, timestamps
- Relación con autor y post
- Soporte para comentarios anidados (replies)
- ID, name, slug
- Relación many-to-many con posts
La API utiliza JWT para autenticación. Incluye el token en el header:
Authorization: Bearer <your-jwt-token>
- USER: Puede crear posts, comentarios, gestionar su perfil
- ADMIN: Acceso completo, puede gestionar todos los recursos
Los endpoints que devuelven listas soportan paginación:
GET /api/posts?page=1&limit=10
Respuesta:
{
"posts": [...],
"pagination": {
"page": 1,
"limit": 10,
"total": 50,
"pages": 5
}
}?search=término- Buscar en título, contenido y excerpt?tag=slug-tag- Filtrar por tag?author=userId- Filtrar por autor
?search=término- Buscar en email, username, nombre?role=USER|ADMIN- Filtrar por rol
Ver NEXT_STEPS.md para el plan de implementación de testing con Vitest.
Ver NEXT_STEPS.md para la configuración de Docker y Docker Compose.
Swagger/OpenAPI disponible en /api/docs (por implementar).
Revisa NEXT_STEPS.md para ver el roadmap completo:
- Database Seeders - Datos de prueba automáticos
- Redis Cache - Mejora de rendimiento
- Docker - Containerización completa
- Testing - Pruebas unitarias e integración
- Swagger - Autodocumentación interactiva
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
MIT
¿Migrado desde JavaScript? Revisa MIGRATION_GUIDE.md para entender los cambios.