API REST para CommunityHub, una plataforma comunitaria de gestión y participación en actividades y eventos. Proyecto final del curso de Software Libre.
- Node.js 24 LTS
- Express 5
- MongoDB Atlas + Mongoose 9
- JSON Web Tokens (
jsonwebtoken) para autenticación bcryptjspara hasheo de contraseñasexpress-validatorpara validación de requestscors,helmetpara seguridaddotenvpara variables de entorno- ES Modules (
import/export default) en todo el código
- Node.js 24 LTS o superior
- Una base de datos MongoDB (Atlas o local)
npm ciCopiá .env.example a .env y completá los valores reales:
PORT= Tú puerto
NODE_ENV=development
MONGODB_URI=mongodb+srv://<usuario>:<password>@<cluster>/<basededatos>
JWT_SECRET=tu_secreto_seguro
JWT_EXPIRES_IN=7d
FRONTEND_URL=http://localhost: Tú puerto El archivo
.envnunca se sube al repositorio (está en.gitignore).FRONTEND_URLdebe coincidir exactamente con el puerto en el que corre el frontend, o las peticiones fallarán por CORS.
npm run dev # Levanta el servidor con nodemon (recarga automática)
npm run start # Levanta el servidor en modo producción
npm run create-admin # Crea o promueve un usuario a rol adminUso de create-admin (es el único mecanismo para generar el primer administrador, ya que el registro público siempre asigna rol user):
npm run create-admin -- admin@correo.com Password123 Nombre Apellidosrc/
├── config/ # Conexión a la base de datos
├── controllers/ # Manejadores de request/response por recurso
├── middleware/ # Autenticación, autorización, validación, errores
├── models/ # Schemas de Mongoose
├── routes/ # Definición de endpoints por recurso
├── services/ # Lógica de negocio
├── utils/ # Clases y helpers compartidos
├── app.js # Configuración de Express y montaje de rutas
└── server.js # Punto de entrada, conexión a la base y arranque
scripts/
└── createAdmin.js # Script para crear/promover administradores
El sistema maneja tres roles: Administrador, Organizador y Usuario. El registro público siempre crea usuarios con rol user — ningún endpoint permite que el cliente elija su propio rol.
| Acción | Usuario | Organizador | Admin |
|---|---|---|---|
| Consultar actividades publicadas | ✅ | ✅ | ✅ |
| Inscribirse / marcar favoritos | ✅ | — | ✅ |
| Crear / editar / cancelar sus propias actividades | — | ✅ | ✅ (cualquiera) |
| Eliminar actividades | — | — | ✅ |
| Gestionar categorías | — | — | ✅ |
| Gestionar usuarios | — | — | ✅ |
| Ver participantes de una actividad | — | ✅ (solo las propias) | ✅ (cualquiera) |
Formato de respuesta uniforme: { success, message, data }.
POST /api/auth/register
POST /api/auth/login
GET /api/auth/me (protegido)
POST /api/auth/logout (protegido)
GET /api/users
GET /api/users/:id
PUT /api/users/:id
PATCH /api/users/:id
DELETE /api/users/:id (borrado lógico)
GET /api/users/stats (estadísticas agregadas, admin)
GET /api/users/me/registrations
GET /api/users/me/favorites
GET /api/users/me/notifications
GET /api/categories (cualquier rol autenticado)
GET /api/categories/:id
POST /api/categories (admin)
PUT /api/categories/:id (admin)
DELETE /api/categories/:id (admin, borrado lógico)
GET /api/events (?category, date, location, organizer, available, search, mine, includeInactive)
GET /api/events/:id
POST /api/events (admin, organizer)
PUT /api/events/:id (admin, organizer dueño)
PATCH /api/events/:id
DELETE /api/events/:id (admin, borrado lógico)
GET /api/events/:id/registrations (admin, organizer dueño — participantes)
POST /api/events/:id/register
DELETE /api/events/:id/register
POST /api/events/:id/favorite
DELETE /api/events/:id/favorite
GET /api/users/me/notifications
PATCH /api/notifications/:id/read
- Borrado lógico en Usuarios, Categorías, Eventos e Inscripciones (
isActive/status, nunca se elimina el documento) para preservar la integridad referencial y el historial. - Ownership: un organizador nunca puede modificar, eliminar o ver participantes de actividades de otro organizador.
checkExacten los endpoints de edición: rechaza cualquier campo del body que no esté explícitamente permitido.- Guarda de auto-protección: un administrador no puede quitarse el rol admin ni desactivarse a sí mismo si es el único administrador activo del sistema.
Este backend expone los endpoints que consumen las notificaciones generadas de forma automática (GET /api/users/me/notifications, PATCH /api/notifications/:id/read), pero la función serverless que las genera (recordatorios de eventos próximos, disparada periódicamente vía AWS EventBridge) vive en un repositorio independiente, no en este. Esa función escribe directamente en la misma base de datos (MONGODB_URI compartido), por lo que las notificaciones que aparecen acá reflejan lo que esa Lambda haya generado.
- Contraseñas siempre hasheadas con bcrypt, nunca en texto plano.
- Autenticación stateless vía JWT.
- Middleware de autenticación (
protect) y autorización por rol (authorizeRoles) en cada endpoint que lo requiere. - CORS configurado con origen explícito.
- Manejo global de errores: nunca se exponen errores internos de MongoDB al cliente.
- Variables sensibles fuera del repositorio (
.enven.gitignore, se provee.env.example).