Skip to content

Repository files navigation

FitForge 💪

FitForge es un proyecto personal en Ionic + Angular pensado para gestionar entrenamientos de gimnasio con una arquitectura más cercana a un producto real que a una demo suelta.

Qué hace

  • Dashboard con resumen del día, racha y accesos rápidos
  • Gestión de rutinas y ejercicios
  • Registro de sesiones reales de entrenamiento
  • Seguimiento de progreso y estadísticas
  • Base preparada para autenticación JWT, modo offline y sincronización

Navegación principal

FitForge usa 4 tabs en la barra inferior:

  • Inicio: dashboard con racha, entrenamiento del día y récords
  • Entrena: rutinas activas y acceso al constructor de entrenamientos
  • Progreso: evolución del volumen y del peso por ejercicio
  • Perf: perfil del usuario y biblioteca de ejercicios

Pantallas adicionales previstas:

  • Login
  • Registro
  • Biblioteca de ejercicios
  • Sesión activa

Arquitectura del frontend

src/app/
├── core/
│   ├── guards/
│   ├── interceptors/
│   └── services/
├── shared/
│   ├── components/
│   └── models/
└── pages/
    ├── auth/
    ├── dashboard/
    ├── exercises/
    ├── profile/
    ├── progress/
    ├── routines/
    ├── tabs/
    └── workout/

Arquitectura del backend

fitforge-backend/
├── middleware/
│   └── auth.js
├── repositories/
│   ├── exerciseRepository.js
│   ├── routineRepository.js
│   ├── userRepository.js
│   └── workoutRepository.js
├── routes/
│   ├── auth.js
│   ├── exercises.js
│   ├── routines.js
│   ├── sessions.js
│   └── stats.js
├── sql/
│   └── schema.sql
├── db.js
├── package.json
└── server.js

Modelo de datos

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  password VARCHAR(255) NOT NULL,
  name VARCHAR(255) NOT NULL,
  fitnessLevel ENUM('principiante','intermedio','avanzado') DEFAULT 'principiante',
  createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE exercises (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  muscleGroup VARCHAR(100) NOT NULL,
  equipment VARCHAR(100),
  difficulty ENUM('facil','intermedio','avanzado') DEFAULT 'intermedio',
  description TEXT,
  videoUrl VARCHAR(500)
);

CREATE TABLE routines (
  id INT AUTO_INCREMENT PRIMARY KEY,
  userId INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  description TEXT,
  createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (userId) REFERENCES users(id)
);

CREATE TABLE routine_exercises (
  id INT AUTO_INCREMENT PRIMARY KEY,
  routineId INT NOT NULL,
  exerciseId INT NOT NULL,
  sets INT DEFAULT 3,
  reps INT DEFAULT 10,
  restSeconds INT DEFAULT 90,
  `order` INT NOT NULL,
  FOREIGN KEY (routineId) REFERENCES routines(id),
  FOREIGN KEY (exerciseId) REFERENCES exercises(id)
);

CREATE TABLE workout_sessions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  userId INT NOT NULL,
  routineId INT,
  startedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  finishedAt TIMESTAMP,
  durationMinutes INT,
  notes TEXT,
  FOREIGN KEY (userId) REFERENCES users(id)
);

CREATE TABLE workout_sets (
  id INT AUTO_INCREMENT PRIMARY KEY,
  sessionId INT NOT NULL,
  exerciseId INT NOT NULL,
  setNumber INT NOT NULL,
  weight DECIMAL(5,2),
  reps INT,
  completedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (sessionId) REFERENCES workout_sessions(id)
);

Endpoints previstos

Método Ruta Descripción
POST /api/auth/register Registro
POST /api/auth/login Login con JWT
GET /api/auth/me Usuario autenticado
GET /api/exercises Listar ejercicios
GET /api/exercises?muscleGroup=pecho Filtrar ejercicios
GET /api/routines Obtener rutinas
POST /api/routines Crear rutina
PUT /api/routines/:id Actualizar rutina
DELETE /api/routines/:id Eliminar rutina
GET /api/sessions Historial de entrenos
POST /api/sessions Iniciar sesión
PUT /api/sessions/:id Finalizar sesión
POST /api/sessions/:id/sets Añadir serie
GET /api/stats/progress Progreso por ejercicio
GET /api/stats/overview Volumen semanal y días activos

Diferencia entre rutina y sesión

  • Una rutina es una plantilla reusable: ejercicios, orden, series, reps y descanso objetivo.
  • Una sesión es una ejecución real de esa rutina en un día concreto, con pesos, repeticiones y tiempos reales.

¿Qué diferencia hay entre workout_sessions y workout_sets?

Necesitamos ambas tablas porque representan dos niveles distintos del entrenamiento:

  • workout_sessions guarda el contexto global de una sesión:

    • qué usuario entrenó
    • qué rutina usó
    • cuándo empezó y terminó
    • cuánto duró
    • notas generales
  • workout_sets guarda el detalle fino de lo que pasó dentro de la sesión:

    • ejercicio concreto
    • número de serie
    • peso usado
    • repeticiones realizadas
    • momento de registro

Sin workout_sessions no podríamos agrupar una sesión completa. Sin workout_sets no podríamos calcular volumen, progreso ni récords por ejercicio.

Stack previsto

  • Ionic 8 + Angular 20
  • TypeScript standalone
  • Node.js + Express
  • MySQL
  • Chart.js
  • Ionic Storage

Estado actual

  • Base Ionic creada
  • Arquitectura frontend definida
  • Guard, interceptor y servicios base creados
  • Backend estructurado a nivel de carpetas
  • README y modelo de datos documentados

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages