Una API REST robusta para aplicaciones de fitness desarrollada con Node.js, Express y PostgreSQL. Diseñada con arquitectura modular separando autenticación de gestión de usuarios.
- Características
- Tecnologías
- Instalación
- Configuración
- Base de Datos
- Uso
- Endpoints
- Estructura del Proyecto
- Contribución
- 🔐 Autenticación JWT completa (registro, login, logout, refresh)
- 👤 Gestión de perfiles de usuario
- 🛡️ Validaciones robustas con Joi
- 🗃️ Base de datos PostgreSQL con transacciones
- 🔒 Seguridad con Helmet y CORS
- 📊 Logging detallado para debugging
- 🏗️ Arquitectura modular y escalable
- ⚡ Pool de conexiones optimizado
- 📱 API RESTful con respuestas estandarizadas
- Runtime: Node.js
- Framework: Express.js 5.1.0
- Base de Datos: PostgreSQL
- Autenticación: JSON Web Tokens (JWT)
- Validación: Joi
- Seguridad: Helmet, CORS, bcryptjs
- Utilidades: Morgan, Compression, dotenv, UUID
- Node.js (v16 o superior)
- PostgreSQL (v12 o superior)
- npm o yarn
- Clonar el repositorio
git clone https://github.com/Raulito2504/FitBack.git
cd FitBack- Instalar dependencias
npm install- Configurar variables de entorno
# Copiar archivo de ejemplo
copy .env.example .env-
Configurar base de datos (ver sección Base de Datos)
-
Iniciar servidor
npm start
# o para desarrollo
npm run devCrea un archivo .env en la raíz del proyecto con las siguientes variables:
# Configuración del servidor
PORT=5005
NODE_ENV=development
# Configuración de la base de datos PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=Fitlife
DB_USER=postgres
DB_PASSWORD=tu_password_aqui
# JWT Secret Key (¡CAMBIAR EN PRODUCCIÓN!)
JWT_SECRET=tu_jwt_secret_key_super_segura_aqui_cambiar_en_produccion
JWT_EXPIRES_IN=120h
# Configuración de CORS
FRONTEND_URL=http://localhost:5173| Variable | Descripción | Ejemplo |
|---|---|---|
PORT |
Puerto donde correrá el servidor | 5005 |
NODE_ENV |
Entorno de ejecución | development / production |
DB_HOST |
Host de PostgreSQL | localhost |
DB_PORT |
Puerto de PostgreSQL | 5432 |
DB_NAME |
Nombre de la base de datos | Fitlife |
DB_USER |
Usuario de PostgreSQL | postgres |
DB_PASSWORD |
Contraseña de PostgreSQL | tu_password |
JWT_SECRET |
Clave secreta para JWT | clave_super_secreta |
JWT_EXPIRES_IN |
Tiempo de expiración del token | 24h, 120h |
FRONTEND_URL |
URL del frontend para CORS | http://localhost:3000 |
- Crear base de datos
CREATE DATABASE Fitlife;- Conectar a la base de datos
\c Fitlife;- Crear tipo ENUM
CREATE TYPE tipo_sexo AS ENUM ('masculino', 'femenino');- Crear tabla usuarios
CREATE TABLE usuarios (
id_usuario BIGSERIAL PRIMARY KEY,
email VARCHAR(320) UNIQUE NOT NULL,
hash_contrasena VARCHAR(255) NOT NULL,
nombre_usuario VARCHAR(50) UNIQUE NOT NULL,
nombre_completo VARCHAR(150) NOT NULL,
telefono VARCHAR(20),
fecha_nacimiento DATE NOT NULL,
sexo tipo_sexo NOT NULL,
fecha_creacion TIMESTAMPTZ NOT NULL DEFAULT NOW(),
fecha_ultima_actividad TIMESTAMPTZ DEFAULT NOW(),
email_verificado BOOLEAN DEFAULT FALSE,
es_premium BOOLEAN DEFAULT FALSE,
-- Restricciones (Constraints) para validar los datos de entrada
CONSTRAINT check_fecha_nacimiento CHECK (fecha_nacimiento <= CURRENT_DATE - INTERVAL '13 years'),
CONSTRAINT check_email_formato CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
);Puedes encontrar el script completo de la base de datos en Database.sql
# Producción
npm start
# Desarrollo (con nodemon si está instalado)
npm run dev
# Alternativa directa
node server.jsVisita: http://localhost:5005
Deberías ver:
{
"success": true,
"message": "Bienvenido a FitBack API",
"endpoints": {
"auth": "/api/auth",
"usuarios": "/api/usuarios",
"health": "/api/health"
}
}Verifica el estado del servidor:
GET http://localhost:5005/api/health
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
POST |
/registro |
Registrar nuevo usuario | ❌ |
POST |
/login |
Iniciar sesión | ❌ |
POST |
/logout |
Cerrar sesión | ✅ |
POST |
/refresh-token |
Renovar token | ✅ |
GET |
/verificar-token |
Validar token | ✅ |
POST |
/verificar-email-disponible |
Verificar disponibilidad email | ❌ |
POST |
/verificar-username-disponible |
Verificar disponibilidad username | ❌ |
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
GET |
/perfil |
Obtener perfil usuario | ✅ |
PUT |
/perfil |
Actualizar perfil | ✅ |
PUT |
/cambiar-password |
Cambiar contraseña | ✅ |
GET |
/estadisticas |
Estadísticas del usuario | ✅ |
DELETE |
/eliminar-cuenta |
Eliminar cuenta | ✅ |
GET |
/ |
Listar usuarios (admin) | ✅ |
GET |
/:id |
Obtener usuario por ID (admin) | ✅ |
curl -X POST http://localhost:5005/api/auth/registro \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@ejemplo.com",
"password": "MiPassword123!",
"nombre_usuario": "usuario123",
"nombre_completo": "Juan Pérez",
"telefono": "+1234567890",
"fecha_nacimiento": "1990-05-15",
"sexo": "masculino"
}'curl -X POST http://localhost:5005/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@ejemplo.com",
"password": "MiPassword123!"
}'curl -X GET http://localhost:5005/api/usuarios/perfil \
-H "Authorization: Bearer TU_TOKEN_JWT_AQUI"FitBack/
├── 📄 app.js # Configuración principal de Express
├── 📄 server.js # Punto de entrada del servidor
├── 📄 Database.sql # Script de base de datos
├── 📄 .env # Variables de entorno (no en repo)
├── 📄 .env.example # Ejemplo de variables de entorno
├── 📄 package.json # Dependencias y scripts
├── 📄 README.md # Este archivo
│
├── 📁 config/ # Configuraciones
│ ├── 📄 cors.js # Configuración CORS
│ └── 📄 database.config.js # Configuración PostgreSQL
│
├── 📁 routes/ # Definición de rutas
│ ├── 📄 Auth.Route.js # Rutas de autenticación
│ └── 📄 Usuarios.Routes.js # Rutas de usuarios
│
├── 📁 controller/ # Lógica de negocio
│ ├── 📄 Auth.Controller.js # Controlador de autenticación
│ └── 📄 Usuarios.Controller.js # Controlador de usuarios
│
├── 📁 middleware/ # Middlewares personalizados
│ ├── 📄 Auth.Middleware.js # Middleware de autenticación
│ └── 📄 Usuarios.Middleware.js # Middleware de usuarios
│
└── 📁 model/ # Modelos de datos
├── 📄 Auth.Model.js # Modelo de autenticación
└── 📄 Usuarios.Model.js # Modelo de usuarios
- Separación de responsabilidades: Auth vs Usuarios
- Patrón MVC: Modelo-Vista-Controlador
- Middleware personalizado: Validaciones y autenticación
- Pool de conexiones: Gestión optimizada de PostgreSQL
- Manejo de errores: Centralizado y detallado
- ✅ Hash de contraseñas con bcryptjs (salt rounds: 12)
- ✅ JWT con expiración configurable
- ✅ Validación de entrada con Joi
- ✅ Headers de seguridad con Helmet
- ✅ CORS configurado
- ✅ Sanitización de datos
- ✅ Rate limiting (recomendado para producción)
Para probar los endpoints puedes usar:
# Health check
curl http://localhost:5005/api/health
# Registro
curl -X POST http://localhost:5005/api/auth/registro \
-H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"Test123!","nombre_usuario":"testuser","nombre_completo":"Test User","fecha_nacimiento":"1990-01-01","sexo":"masculino"}'- Importa la colección (crear archivo .postman_collection.json)
- Configura variable
baseUrl=http://localhost:5005 - Configura variable
tokenpara endpoints protegidos
- Instala la extensión Thunder Client
- Crea requests para cada endpoint
- Usa variables de entorno para token y baseUrl
-
Error de conexión a PostgreSQL
- Verifica que PostgreSQL esté corriendo
- Revisa las credenciales en
.env - Asegúrate que la base de datos
Fitlifeexista
-
Error "Puerto en uso"
# Encontrar proceso usando el puerto 5005 netstat -ano | findstr 5005 # Matar proceso taskkill /PID <número_proceso> /F
-
Token JWT inválido
- Verifica que el
JWT_SECRETsea el mismo - Revisa que el token no haya expirado
- Asegúrate de enviar
Bearer <token>en el header
- Verifica que el
-
Errores de validación
- Revisa que todos los campos requeridos estén presentes
- Verifica el formato de email y contraseña
- Asegúrate que la edad sea mayor a 13 años
# Iniciar servidor
npm start
# Modo desarrollo (si tienes nodemon instalado)
npm run dev
# Instalar dependencias
npm install
# Verificar dependencias
npm audit- 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
Este proyecto está bajo la Licencia MIT. Ver LICENSE para más detalles.
- Arnoldo Rafael - Desarrollo inicial - Raulito2504