Gimnasio boutique orientado a clases personalizadas y público con necesidades específicas (adultos mayores, rehabilitación).
Este proyecto fue desarrollado como parte de la asignatura Ingeniería en Software I, correspondiente a la carrera de Ingeniería en Computación e Informática.
El objetivo es construir un sistema full-stack que permita gestionar las operaciones de un gimnasio funcional, incluyendo reservas, pagos, notificaciones y estadísticas. Está orientado tanto al control administrativo como a la experiencia del usuario final.
✅ Implementar autenticación segura con JWT y refresh tokens
✅ Desarrollar sistema de reservas con validación inteligente de capacidad y fechas
✅ Integrar procesamiento de pagos en línea con Stripe y webhooks verificados
✅ Sistema de notificaciones multicanal (Email, In-App, Push)
✅ Generar reportes y estadísticas en tiempo real para toma de decisiones
✅ Sistema de feedback y calificaciones con respuestas
✅ Logging centralizado con Winston y rotación de archivos
✅ Testing automatizado con Jest + Supertest
✅ CI/CD con GitHub Actions
✅ Aplicar arquitectura por capas y buenas prácticas de desarrollo
| Tecnología | Versión | Propósito |
|---|---|---|
| 18+ | Runtime JavaScript | |
| 4.19 | Framework web | |
| 8.19 | Base de datos NoSQL | |
| 8.19 | ODM para MongoDB | |
| 9.0 | Autenticación + Refresh | |
| 14.25 | Procesamiento de pagos | |
| 6.10 | Envío de emails | |
| 3.0 | Tareas programadas | |
| 3.18 | Logging centralizado | |
| 12.0 | Push Notifications | |
| 29.7 | Testing framework | |
| 6.3 | API Testing | |
| 8.57 | Code linting |
| Tecnología | Versión | Propósito |
|---|---|---|
| 3.4 | Framework progresivo | |
| 5.4 | Build tool | |
| 2.0 | State management | |
| 4.0 | Navegación SPA | |
| 1.6 | Cliente HTTP | |
| 3.4 | Framework CSS | |
| 10.7 | Push Notifications |
Requisitos mínimos:
# Windows PowerShell
node --version # >= 18
npm --version # >= 9
Servicios externos necesarios:
💡 Tip: Para obtener las credenciales:
- MongoDB URI: Ve a Atlas → Connect → Drivers y copia la cadena de conexión
- JWT_SECRET: Genera uno con:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
- Stripe Keys: Dashboard → Developers → API Keys (usa modo test)
- SMTP Gmail: Configura verificación en 2 pasos → App passwords
git clone https://github.com/Raizexs/GymProFunctional
cd gym-pro-funcional
cd backend
npm install
Crear archivo .env con las siguientes variables:
# Database
MONGODB_URI=mongodb+srv://usuario:password@cluster.mongodb.net/gym-pro-funcional
PORT=3000
CORS_ORIGIN=http://localhost:5173
# JWT Authentication
JWT_SECRET=tu_secreto_super_seguro
JWT_REFRESH_SECRET=tu_secreto_refresh_super_seguro
USE_TRANSACTIONS=false
# Stripe Payments (opcional)
STRIPE_SECRET_KEY=sk_test_tu_clave_stripe
STRIPE_PUBLISHABLE_KEY=pk_test_tu_clave_publica
STRIPE_WEBHOOK_SECRET=whsec_xxx
# SMTP Email (opcional)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=tu-email@gmail.com
SMTP_PASS=xxxx xxxx xxxx xxxx
SMTP_FROM="Gimnasio Pro <noreply@gympro.com>"
# Firebase Push Notifications (opcional)
FIREBASE_SERVICE_ACCOUNT={"type":"service_account","project_id":"..."}
npm run seed
npm run dev
El servidor estará en http://localhost:3000
cd frontend
npm install
(Opcional) Crear archivo .env para Firebase:
VITE_FIREBASE_API_KEY=tu-api-key
VITE_FIREBASE_AUTH_DOMAIN=tu-proyecto.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=tu-proyecto-id
VITE_FIREBASE_STORAGE_BUCKET=tu-proyecto.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=123456789012
VITE_FIREBASE_APP_ID=1:123456789012:web:abc123
VITE_FIREBASE_VAPID_KEY=tu-vapid-key
npm run dev
La aplicación estará en http://localhost:5173
| Rol | Password | Permisos | |
|---|---|---|---|
| 👤Usuario | user@gym.com | user123 | Reservar clases, ver estadísticas |
| 👨🏫Entrenador | trainer@gym.com | trainer123 | Gestionar clases y asistencia |
| 🛡️Admin | admin@gym.com | admin123 | Acceso completo al sistema |
⚠️ Nota: Estas credenciales son solo para desarrollo/pruebas.
Documentos disponibles:
gym-pro-funcional/
┃
┣━━ backend/
┃ ┣━━ src/backend/
┃ ┃ ┣━━ config/ # Configuración (DB, Firebase, Logger, Cron)
┃ ┃ ┣━━ models/ # Modelos de datos (User, Class, Reservation, etc.)
┃ ┃ ┣━━ routes/ # Endpoints de la API (35+ endpoints)
┃ ┃ ┣━━ services/ # Lógica de negocio
┃ ┃ ┣━━ middlewares/ # Autenticación y validación
┃ ┃ ┗━━ server.js # Servidor Express
┃ ┣━━ __tests__/ # Tests con Jest + Supertest
┃ ┣━━ logs/ # Archivos de log (Winston)
┃ ┗━━ package.json
┃
┣━━ frontend/
┃ ┣━━ src/
┃ ┃ ┣━━ components/ # Componentes Vue reutilizables
┃ ┃ ┣━━ composables/ # Composables (usePushNotifications)
┃ ┃ ┣━━ config/ # Configuración (Firebase)
┃ ┃ ┣━━ pages/ # Vistas principales
┃ ┃ ┣━━ services/ # Servicios de comunicación con API
┃ ┃ ┣━━ stores/ # Estado global con Pinia
┃ ┃ ┗━━ router/ # Configuración de rutas
┃ ┣━━ public/ # Service Worker para push notifications
┃ ┗━━ package.json
┃
┣━━ .github/workflows/ # CI/CD con GitHub Actions
┣━━ docs/ # Documentación completa
┗━━ 📖 README.md
| POST | /api/auth/register | Registro de usuario |
| POST | /api/auth/login | Inicio de sesión |
| GET | /api/classes | Listar clases disponibles |
| GET | /api/trainers | Listar entrenadores |
| Método | Endpoint | Descripción |
|---|---|---|
POST |
/api/auth/refresh |
Renovar access token |
GET |
/api/reservations/me |
Mis reservas |
POST |
/api/reservations |
Crear reserva |
POST |
/api/payments/create-intent |
Procesar pago |
POST |
/api/payments/refund/:id |
Solicitar reembolso |
GET |
/api/stats/dashboard |
Estadísticas según rol |
GET |
/api/notifications |
Notificaciones del usuario |
POST |
/api/notifications/register-token |
Registrar token FCM |
POST |
/api/feedback |
Crear feedback |
GET |
/api/feedback/my |
Mis feedbacks |
GET |
/api/trainers (Admin) |
CRUD entrenadores |
.env| Característica | Implementación |
|---|---|
| 🔑Autenticación | JWT + Refresh tokens con rotación |
| 🔒Contraseñas | Bcrypt con 10 salt rounds |
| 👮Autorización | Middleware basado en roles |
| 🌐CORS | Configurado para orígenes específicos |
| 🔐Variables sensibles | Almacenadas en .env |
| 💳Pagos | PCI compliant con Stripe + webhook verification |
| 📝Logging | Winston con rotación y retención |
| 🧪Testing | Jest + Supertest (7 tests passing) |
| 🚀CI/CD | GitHub Actions con validación automática |
Este sistema fue diseñado con un enfoque educativo y profesional para la asignatura Ingeniería en Software I. Se priorizó la aplicación de buenas prácticas de desarrollo, arquitectura escalable, seguridad y experiencia de usuario.
Este proyecto es de código abierto con fines educativos y está disponible bajo la licencia MIT.