El foro de los que mandan
Foro de mensajes con acceso por código de invitación, sistema de visibilidad +Jeje, mensajes privados y organización por secciones temáticas.
forojejes/
├── backend/
│ ├── app.js ← Entrada principal Express
│ ├── database.js ← SQLite + seed de categorías y códigos
│ ├── package.json
│ ├── Dockerfile
│ ├── middleware/
│ │ └── auth.js ← Verificación JWT
│ └── routes/
│ ├── auth.js ← /api/auth/register + /api/auth/login
│ ├── messages.js ← /api/messages (CRUD + categorías)
│ └── codes.js ← /api/codes/request + /api/codes/status
├── frontend/
│ ├── index.html ← Portada: subforos + últimos mensajes
│ ├── subforo.html ← Vista de una sección concreta
│ ├── login.html ← Acceso
│ ├── register.html ← Registro con código de invitación
│ ├── script.js ← Lógica de la portada
│ └── subforo.js ← Lógica de la vista de sección
├── docker-compose.yml
├── nginx.conf
└── README.md
- Docker and Docker Compose installed on your system
- A modern web browser
- Navigate to the project directory:
cd live-coding-1- Start all services using Docker Compose:
docker-compose up --buildThis will start:
- Frontend: http://localhost:8080
- Backend API: http://localhost:3000
- Health Check: http://localhost:3000/api/health
- To stop the services:
docker-compose down- Navigate to the backend directory:
cd backend- Install Node.js dependencies:
npm install- Start the development server:
npm run devOr for production:
npm startThe backend API will be available at http://localhost:3000
- Navigate to the frontend directory:
cd frontend- Serve the static files using one of these methods:
Option A: Using Python's built-in server
python -m http.server 8080Option B: Using Live Server (VS Code extension)
- Right-click on
index.htmland select "Open with Live Server"
Option C: Using Node.js http-server
npx http-server -p 8080The frontend will be available at http://localhost:8080
- Frontend: http://localhost:8080
- API Health Check: http://localhost:3000/api/health
- Registration Page: http://localhost:8080/register.html
- Login Page: http://localhost:8080/login.html
express- Web frameworkbetter-sqlite3- SQLite databasebcryptjs- Password hashingjsonwebtoken- JWT authenticationcors- CORS middleware
- Vanilla JavaScript (no dependencies)
- Nginx Alpine for serving static files
- Registro solo con código de invitación (50 códigos generados al arrancar)
- Cada 20 intentos fallidos de obtener código se libera uno nuevo
- El nickname debe contener "jeje" (validado en backend y frontend)
- Contraseñas hasheadas con bcrypt (12 rounds)
- Autenticación JWT con expiración de 8h
| Sección | Slug |
|---|---|
| 💬 General | general |
| 🎮 Videojuegos | videojuegos |
| ❓ Consultas | consultas |
| 💡 Electrónica | electronica |
| ⚽ Deportes | deportes |
viajes |
|
| 📚 Estudios | estudios |
| 💼 Trabajo | trabajo |
| 🚗 Motor | motor |
| Tipo | Quién lo ve |
|---|---|
| 🌐 Público | Todos los usuarios registrados |
| 🔥 +Jeje | Solo usuarios con ≥ 100 mensajes publicados (aparece bloqueado para el resto) |
| 🔒 Privado | El autor + los nicknames que elija (invisibles para los demás) |
- Prepared statements en todas las queries (anti SQLi)
- Contraseñas con bcrypt 12 rounds
- JWT en todas las rutas protegidas
- textContent en lugar de innerHTML (anti XSS)
- Mensajes bloqueados decididos en backend (nunca en cliente)
- Mismo mensaje de error para usuario inexistente y contraseña incorrecta (anti user enumeration)
- Transacciones atómicas en registro
POST /api/auth/register- Register with invitation codePOST /api/auth/login- Login and receive JWT token
POST /api/codes/request- Request invitation code (fails most times)GET /api/codes/status- Check invitation code availability
GET /api/messages- List all messages (filtered by visibility)POST /api/messages- Create new messageGET /api/messages/categoria/:slug- Get messages by categoryPUT /api/messages/:id- Update messageDELETE /api/messages/:id- Delete messageGET /api/messages/usuarios- Search users by nickname
All authenticated requests must include:
Authorization: Bearer <your_jwt_token>
- Access the application at
http://localhost:8080 - Request an invitation code (requires multiple attempts)
- Register with your invitation code and a nickname containing "jeje"
- Login with your credentials
- Create messages in different forum sections
- Set message visibility (Public, +Jeje, or Private)
- Post at least 100 messages to unlock +Jeje content
- Send private messages to specific users
- Rate limiting en /api/codes/request y /api/auth/login
- HTTPS (certificado SSL)
- Cambiar JWT_SECRET por variable de entorno segura
- El endpoint /api/messages/usuarios permite enumerar usuarios letra a letra
- Implementar paginación en listados de mensajes
- Añadir soft delete en lugar de eliminación permanente
- Configurar backups automáticos de la base de datos SQLite