API REST profesional para la gestión de artículos sobre las profundidades oceánicas
Características • Instalación • Configuración • API • Despliegue
Código Abisal es una API REST robusta y escalable diseñada para gestionar artículos científicos y divulgativos sobre las profundidades del océano. El proyecto permite crear, editar, eliminar y consultar contenido sobre fauna abisal, ecosistemas marinos, exploraciones oceánicas y conservación.
Proporcionar una plataforma backend completa para compartir conocimiento sobre el mundo abisal, con un sistema de autenticación seguro, gestión de usuarios y un sistema de "likes" para artículos populares.
- ✅ Registro de usuarios con hash de contraseñas (bcrypt)
- ✅ Login con JWT (JSON Web Tokens)
- ✅ Middleware de autenticación y roles (user/admin)
- ✅ Sistema de recuperación de contraseña con tokens temporales
- ✅ CRUD completo de artículos (Create, Read, Update, Delete)
- ✅ Categorías especializadas: Fauna Abisal, Ecosistemas, Exploración, Conservación
- ✅ Sistema de likes por usuario
- ✅ Asignación automática de creador (creator_id)
- ✅ Validaciones robustas con express-validator
- ✅ Panel de administración de usuarios (solo admins)
- ✅ Actualización de perfiles
- ✅ Protección contra auto-eliminación
- ✅ Consulta pública de perfiles de usuario
- ✅ Conexión TLS/SSL a base de datos (compatible con TiDB Cloud)
- ✅ Variables de entorno separadas para desarrollo/producción/test
- ✅ Validación de entrada exhaustiva
- ✅ Protección contra ataques comunes (SQL injection, XSS)
- ✅ Suite de tests con Jest y Supertest
- ✅ Tests unitarios e integración
- ✅ Base de datos de prueba aislada
- ✅ Cobertura completa de endpoints críticos
| Categoría | Tecnologías |
|---|---|
| Runtime | Node.js 20+ |
| Lenguaje | TypeScript 5.9 |
| Framework | Express 5.1 |
| Base de Datos | MySQL 8.0 / TiDB Cloud |
| ORM | Sequelize 6.37 |
| Autenticación | JWT, bcryptjs |
| Validación | express-validator |
| Testing | Jest, Supertest, ts-jest |
| DevOps | Docker, GitHub Actions |
Node.js >= 20.0.0
npm >= 10.0.0
MySQL >= 8.0 o TiDB Cloud1️⃣ Clonar el repositorio
git clone https://github.com/Codigo-Inmersion/codigo-abisal-server.git
cd codigo-abisal-server2️⃣ Instalar dependencias
npm install3️⃣ Configurar variables de entorno
cp .env.example .envEdita el archivo .env con tus credenciales (ver sección Configuración)
4️⃣ Ejecutar migraciones (automático al iniciar)
npm run dev5️⃣ Ejecutar tests (opcional)
npm testCrea un archivo .env en la raíz del proyecto con las siguientes variables:
# Base de Datos
DB_NAME=tu_base_de_datos
DB_USER=tu_usuario
DB_PASS=tu_contraseña
DB_HOST=tu_host
DB_PORT=3306
DB_DIALECT=mysql
# TLS/SSL (opcional, para TiDB Cloud)
DB_SSL=true
DB_SSL_CA_PATH=./certs/tidb-ca.pem
# Servidor
PORT=8000
CORS_ORIGIN=http://localhost:5173
# JWT
JWT_SECRET=tu_clave_secreta_muy_segura
JWT_EXPIRES=7d
# Frontend (para recuperación de contraseña)
FRONTEND_URL=http://localhost:5173Crea un archivo .env.test para tests:
NODE_ENV=test
DB_NAME=abisal_app_test
DB_USER=tu_usuario
DB_PASS=tu_contraseña
DB_HOST=localhost
DB_PORT=3306
DB_DIALECT=mysql
DB_SSL=false
PORT=8001
CORS_ORIGIN=*
JWT_SECRET=test_secret_key
JWT_EXPIRES=1hhttp://localhost:8000
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
POST |
/auth/register |
Registrar nuevo usuario | ❌ |
POST |
/auth/login |
Iniciar sesión | ❌ |
POST |
/auth/forgot-password |
Solicitar recuperación | ❌ |
POST |
/auth/reset-password |
Restablecer contraseña | ❌ |
POST /auth/register
Content-Type: application/json
{
"username": "oceanexplorer",
"name": "María",
"last_name": "González",
"email": "maria@example.com",
"password": "SecurePass123!"
}Respuesta:
{
"message": "Usuario registrado exitosamente",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
GET |
/article |
Listar todos los artículos | ❌ |
GET |
/article/:id |
Obtener artículo específico | ❌ |
POST |
/article |
Crear artículo | ✅ User/Admin |
PUT |
/article/:id |
Actualizar artículo | ✅User /Admin |
DELETE |
/article/:id |
Eliminar artículo | ✅ Admin |
POST |
/article/:id/like |
Dar like | ✅ User/Admin |
DELETE |
/article/:id/like |
Quitar like | ✅ User/Admin |
POST /article
Authorization: Bearer {token}
Content-Type: application/json
{
"title": "El Pez Abisal Más Profundo del Mundo",
"description": "Descubrimiento de una nueva especie a 8,178 metros",
"content": "En las profundidades de la Fosa de las Marianas...",
"category": "Fauna Abisal",
"species": "Pseudoliparis swirei",
"image": "https://example.com/pez-abisal.jpg",
"references": "Nature Magazine 2023"
}Respuesta:
{
"id": 42,
"title": "El Pez Abisal Más Profundo del Mundo",
"description": "Descubrimiento de una nueva especie a 8,178 metros",
"content": "En las profundidades de la Fosa de las Marianas...",
"category": "Fauna Abisal",
"species": "Pseudoliparis swirei",
"image": "https://example.com/pez-abisal.jpg",
"references": "Nature Magazine 2023",
"creator_id": 1,
"likes": 0,
"created_at": "2025-01-15T10:30:00.000Z",
"updated_at": "2025-01-15T10:30:00.000Z"
}| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
GET |
/users |
Listar todos los usuarios | ✅ Admin |
GET |
/users/user/:id |
Perfil público de usuario | ❌ |
PUT |
/users/:id |
Actualizar usuario | ✅ Admin |
DELETE |
/users/:id |
Eliminar usuario | ✅ Admin |
# Todos los tests
npm test
# Tests en modo watch
npm test -- --watch
# Tests con cobertura
npm test -- --coveragetest/
├── auth.test.ts # Tests de autenticación
├── article.test.ts # Tests de artículos
└── jest.setup.ts # Configuración de Jest
- ✅ Registro y login de usuarios
- ✅ CRUD completo de artículos
- ✅ Validaciones de entrada
- ✅ Autorización y roles
docker build -t codigo-abisal-api .docker-compose up -dEl archivo docker-compose.yml ya está configurado para usar la imagen de Docker Hub:
services:
api:
image: gema284/codigo-abisal-server-api:dev
container_name: abisal-api
platform: linux/amd64
env_file: .env.docker
ports:
- "8000:8000"1️⃣ Conecta tu repositorio de GitHub
2️⃣ Configura las variables de entorno en el dashboard de Render
3️⃣ Build Command:
npm install && npm run build4️⃣ Start Command:
npm startSimilar a Render, asegúrate de:
- Configurar todas las variables de entorno
- Establecer
NODE_ENV=production - Configurar
DB_SSL=truesi usas TiDB Cloud
codigo-abisal-server/
├── src/
│ ├── controllers/ # Lógica de negocio
│ │ ├── ArticleController.ts
│ │ ├── AuthController.ts
│ │ ├── UserController.ts
│ │ └── PasswordResetController.ts
│ ├── middlewares/ # Middlewares personalizados
│ │ ├── authMiddlewares.ts
│ │ └── handleValidation.ts
│ ├── models/ # Modelos de Sequelize
│ │ ├── ArticleModel.ts
│ │ ├── UserModel.ts
│ │ └── PasswordResetToken.ts
│ ├── routes/ # Definición de rutas
│ │ ├── articleRoutes.ts
│ │ ├── authRoutes.ts
│ │ ├── userRoutes.ts
│ │ └── passwordReset.routes.ts
│ ├── validators/ # Validaciones con express-validator
│ │ ├── articleValidators.ts
│ │ ├── userValidators.ts
│ │ └── passwordResetValidators.ts
│ ├── utils/ # Utilidades
│ │ ├── jwt.ts
│ │ └── resetToken.ts
│ ├── database/ # Configuración DB
│ │ └── db_connection.ts
│ ├── interface/ # Interfaces TypeScript
│ │ ├── articleInterface.ts
│ │ └── userInterface.ts
│ └── app.ts # Punto de entrada
├── test/ # Tests
│ ├── auth.test.ts
│ ├── article.test.ts
│ └── jest.setup.ts
├── certs/ # Certificados TLS
│ └── tidb-ca.pem
├── .github/workflows/ # CI/CD
│ └── docker-publish.yml
├── Dockerfile
├── docker-compose.yml
├── tsconfig.json
├── jest.config.mjs
├── package.json
└── README.md
✅ Hashing de contraseñas con bcrypt (10 rounds)
✅ Tokens JWT con expiración configurable
✅ Validación exhaustiva de entrada con express-validator
✅ Conexión TLS/SSL a base de datos en producción
✅ CORS configurado para dominios permitidos
✅ Variables de entorno nunca comiteadas
✅ Middleware de autorización por roles
✅ Normalización de emails (lowercase, trim)
✅ Protección contra auto-eliminación de usuarios admin
- 🔄 Rotar
JWT_SECRETperiódicamente - 🚫 No exponer
PORTpúblicamente sin proxy reverso - 📝 Implementar rate limiting (ej: express-rate-limit)
- 📊 Monitorear logs en producción
- 🛡️ Usar Helmet.js para headers de seguridad
# Desarrollo con recarga automática
npm run dev
# Compilar TypeScript a JavaScript
npm run build
# Ejecutar en producción
npm start
# Ejecutar tests
npm testLas contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add: AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
| Desarrolladora | GitHub | |
|---|---|---|
| Camila Arenas | GitHub | |
| Gema Yébenes | GitHub | |
| Mariana Moreno | GitHub | |
| Olga Ramírez | GitHub | |
| Rocio Coronel | GitHub |
- Comunidad de TypeScript y Node.js
- Documentación de Sequelize
- Express.js Team
- Render y TiDB Cloud por sus servicios

