# milosmarinkovic1/fitness-app architecture

> Architecture diagram of the GitHub repository milosmarinkovic1/fitness-app, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/milosmarinkovic1/fitness-app
- Repository: https://github.com/milosmarinkovic1/fitness-app

## Overview

This is a full-stack fitness tracker. Users register or log in, then record workout sessions, exercises and sets, review analytics, and manage dated body measurements; the Vue application presents those flows and calls the Spring API. Analytics are computed from workout sets, while measurements have their own CRUD lifecycle. The README documents chart-based weight progress and four analytics; sampled source confirms the set-based analytics and measurement persistence. Frontend view wiring and several backend services were not sampled, so some feature links are represented at their documented module boundaries.

Main entry points: [`frontend/src/api/axios.ts`](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/api/axios.ts) (HTTP client), [`frontend/src/router/index.ts`](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/router/index.ts) (Page routing), [`fitness-app/src/main/java/com/fitnessapp/service/SetService.java`](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/SetService.java) (Set and analytics service), [`fitness-app/src/main/java/com/fitnessapp/repository/UserRepository.java`](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/UserRepository.java) (User repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Vue application"]
  node_app["App shell<br/>[App.vue]"]
  node_router["Page routing<br/>[index.ts]"]
  node_login["Login and register<br/>[LoginView.vue]"]
  node_register["Registration view<br/>[RegisterView.vue]"]
  node_dashboard["Analytics dashboard<br/>[DashboardView.vue]"]
  node_workoutview["Workout logging<br/>[WorkoutView.vue]"]
  node_measureview["Measurement tracking"]
  node_authstate["Auth state<br/>[authStore.ts]"]
  node_workoutstate["Workout state<br/>[workoutStore.ts]"]
  node_http["HTTP client<br/>[axios.ts]"]
end

subgraph group_api["Spring API"]
  node_authapi["Authentication API"]
  node_workoutapi["Workout API"]
  node_analyticsapi["Analytics API"]
  node_measureapi["Measurement API"]
  node_userapi["User API"]
end

subgraph group_services["Domain services"]
  node_authservice["Authentication service<br/>[AuthService.java]"]
  node_jwtservice["Token service<br/>[JwtService.java]"]
  node_workoutservice["Workout service"]
  node_setservice["Set and analytics service<br/>[SetService.java]"]
  node_measurementservice["Measurement service"]
  node_userservice["User service<br/>[UserService.java]"]
end

subgraph group_data["Persistence and security"]
  node_userrepo[("User repository")]
  node_workoutrepo[("Workout repository")]
  node_setrepo[("Set repository<br/>[SetRepository.java]")]
  node_measurementrepo[("Measurement repository")]
  node_security["JWT request security"]
  node_jwtfilter["JWT filter<br/>[JwtFilter.java]"]
end

node_person(("Fitness user"))
node_postgres[("PostgreSQL")]

node_person -->|"uses"| node_app
node_app -->|"renders routes"| node_router
node_router -->|"routes to"| node_login
node_router -->|"routes to"| node_register
node_router -->|"routes to"| node_dashboard
node_router -->|"routes to"| node_workoutview
node_router -->|"routes to"| node_measureview
node_login -->|"updates auth"| node_authstate
node_register -->|"updates auth"| node_authstate
node_workoutview -->|"updates workouts"| node_workoutstate
node_dashboard -->|"requests analytics"| node_http
node_workoutview -->|"requests workouts"| node_http
node_measureview -->|"requests measurements"| node_http
node_authstate -->|"requests auth"| node_http
node_http -->|"sends requests"| node_authapi
node_http -->|"sends requests"| node_workoutapi
node_http -->|"sends requests"| node_analyticsapi
node_http -->|"sends requests"| node_measureapi
node_http -.->|"sends requests"| node_userapi
node_authapi -->|"delegates auth"| node_authservice
node_workoutapi -->|"delegates workouts"| node_workoutservice
node_workoutapi -->|"delegates sets"| node_setservice
node_analyticsapi -->|"delegates analytics"| node_setservice
node_measureapi -->|"delegates CRUD"| node_measurementservice
node_userapi -->|"delegates users"| node_userservice
node_authservice -->|"reads and saves"| node_userrepo
node_authservice -->|"generates token"| node_jwtservice
node_workoutservice -->|"finds user"| node_userrepo
node_workoutservice -->|"reads and saves"| node_workoutrepo
node_setservice -->|"finds workout"| node_workoutrepo
node_setservice -->|"finds user"| node_userrepo
node_setservice -->|"saves sets; queries metrics"| node_setrepo
node_setservice -->|"runs native analytics"| node_postgres
node_measurementservice -->|"finds user"| node_userrepo
node_measurementservice -->|"reads and writes"| node_measurementrepo
node_userservice -->|"reads users"| node_userrepo
node_security -->|"configures filter"| node_jwtfilter
node_jwtfilter -->|"validates token"| node_jwtservice
node_userrepo -->|"persists users"| node_postgres
node_workoutrepo -->|"persists workouts"| node_postgres
node_setrepo -->|"queries workout data"| node_postgres
node_measurementrepo -->|"persists measurements"| node_postgres

click node_app "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/App.vue"
click node_router "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/router/index.ts"
click node_login "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/LoginView.vue"
click node_register "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/RegisterView.vue"
click node_dashboard "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/DashboardView.vue"
click node_workoutview "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/WorkoutView.vue"
click node_measureview "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/MeasurementsView.vue"
click node_authstate "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/stores/authStore.ts"
click node_workoutstate "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/stores/workoutStore.ts"
click node_http "https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/api/axios.ts"
click node_authapi "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/AuthController.java"
click node_workoutapi "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/WorkoutController.java"
click node_analyticsapi "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/AnalyticsController.java"
click node_measureapi "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/BodyMeasurementController.java"
click node_userapi "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/UserController.java"
click node_authservice "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/AuthService.java"
click node_jwtservice "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/JwtService.java"
click node_workoutservice "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/WorkoutService.java"
click node_setservice "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/SetService.java"
click node_measurementservice "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/BodyMeasurementService.java"
click node_userservice "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/UserService.java"
click node_userrepo "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/UserRepository.java"
click node_workoutrepo "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/WorkoutRepository.java"
click node_setrepo "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/SetRepository.java"
click node_measurementrepo "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/BodyMeasurementRepository.java"
click node_security "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/config/SecurityConfig.java"
click node_jwtfilter "https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/filter/JwtFilter.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_router,node_login,node_register,node_dashboard,node_workoutview,node_measureview,node_authstate,node_workoutstate,node_http,node_person toneBlue
class node_authapi,node_workoutapi,node_analyticsapi,node_measureapi,node_userapi,node_postgres toneAmber
class node_authservice,node_jwtservice,node_workoutservice,node_setservice,node_measurementservice,node_userservice toneMint
class node_userrepo,node_workoutrepo,node_setrepo,node_measurementrepo,node_security,node_jwtfilter toneRose
```

## Components

### Vue application

- [App shell](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/App.vue): `frontend/src/App.vue`
- [Page routing](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/router/index.ts): `frontend/src/router/index.ts`
- [Login and register](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/LoginView.vue): `frontend/src/views/LoginView.vue`
- [Registration view](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/RegisterView.vue): `frontend/src/views/RegisterView.vue`
- [Analytics dashboard](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/DashboardView.vue): `frontend/src/views/DashboardView.vue`
- [Workout logging](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/WorkoutView.vue): `frontend/src/views/WorkoutView.vue`
- [Measurement tracking](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/views/MeasurementsView.vue): `frontend/src/views/MeasurementsView.vue`
- [Auth state](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/stores/authStore.ts): `frontend/src/stores/authStore.ts`
- [Workout state](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/stores/workoutStore.ts): `frontend/src/stores/workoutStore.ts`
- [HTTP client](https://github.com/milosmarinkovic1/fitness-app/blob/main/frontend/src/api/axios.ts): `frontend/src/api/axios.ts`

### Spring API

- [Authentication API](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/AuthController.java): `fitness-app/src/main/java/com/fitnessapp/controller/AuthController.java`
- [Workout API](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/WorkoutController.java): `fitness-app/src/main/java/com/fitnessapp/controller/WorkoutController.java`
- [Analytics API](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/AnalyticsController.java): `fitness-app/src/main/java/com/fitnessapp/controller/AnalyticsController.java`
- [Measurement API](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/BodyMeasurementController.java): `fitness-app/src/main/java/com/fitnessapp/controller/BodyMeasurementController.java`
- [User API](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/controller/UserController.java): `fitness-app/src/main/java/com/fitnessapp/controller/UserController.java`

### Domain services

- [Authentication service](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/AuthService.java): `fitness-app/src/main/java/com/fitnessapp/service/AuthService.java`
- [Token service](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/JwtService.java): `fitness-app/src/main/java/com/fitnessapp/service/JwtService.java`
- [Workout service](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/WorkoutService.java): `fitness-app/src/main/java/com/fitnessapp/service/WorkoutService.java`
- [Set and analytics service](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/SetService.java): `fitness-app/src/main/java/com/fitnessapp/service/SetService.java`
- [Measurement service](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/BodyMeasurementService.java): `fitness-app/src/main/java/com/fitnessapp/service/BodyMeasurementService.java`
- [User service](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/service/UserService.java): `fitness-app/src/main/java/com/fitnessapp/service/UserService.java`

### Persistence and security

- [User repository](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/UserRepository.java): `fitness-app/src/main/java/com/fitnessapp/repository/UserRepository.java`
- [Workout repository](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/WorkoutRepository.java): `fitness-app/src/main/java/com/fitnessapp/repository/WorkoutRepository.java`
- [Set repository](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/SetRepository.java): `fitness-app/src/main/java/com/fitnessapp/repository/SetRepository.java`
- [Measurement repository](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/repository/BodyMeasurementRepository.java): `fitness-app/src/main/java/com/fitnessapp/repository/BodyMeasurementRepository.java`
- [JWT request security](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/config/SecurityConfig.java): `fitness-app/src/main/java/com/fitnessapp/config/SecurityConfig.java`
- [JWT filter](https://github.com/milosmarinkovic1/fitness-app/blob/main/fitness-app/src/main/java/com/fitnessapp/filter/JwtFilter.java): `fitness-app/src/main/java/com/fitnessapp/filter/JwtFilter.java`

### Other components

- **Fitness user**
- **PostgreSQL**

## Connections

- Fitness user → App shell: uses
- App shell → Page routing: renders routes
- Page routing → Login and register: routes to
- Page routing → Registration view: routes to
- Page routing → Analytics dashboard: routes to
- Page routing → Workout logging: routes to
- Page routing → Measurement tracking: routes to
- Login and register → Auth state: updates auth
- Registration view → Auth state: updates auth
- Workout logging → Workout state: updates workouts
- Analytics dashboard → HTTP client: requests analytics
- Workout logging → HTTP client: requests workouts
- Measurement tracking → HTTP client: requests measurements
- Auth state → HTTP client: requests auth
- HTTP client → Authentication API: sends requests
- HTTP client → Workout API: sends requests
- HTTP client → Analytics API: sends requests
- HTTP client → Measurement API: sends requests
- HTTP client → User API: sends requests
- Authentication API → Authentication service: delegates auth
- Workout API → Workout service: delegates workouts
- Workout API → Set and analytics service: delegates sets
- Analytics API → Set and analytics service: delegates analytics
- Measurement API → Measurement service: delegates CRUD
- User API → User service: delegates users
- Authentication service → User repository: reads and saves
- Authentication service → Token service: generates token
- Workout service → User repository: finds user
- Workout service → Workout repository: reads and saves
- Set and analytics service → Workout repository: finds workout
- Set and analytics service → User repository: finds user
- Set and analytics service → Set repository: saves sets; queries metrics
- Set and analytics service → PostgreSQL: runs native analytics
- Measurement service → User repository: finds user
- Measurement service → Measurement repository: reads and writes
- User service → User repository: reads users
- JWT request security → JWT filter: configures filter
- JWT filter → Token service: validates token
- User repository → PostgreSQL: persists users
- Workout repository → PostgreSQL: persists workouts
- Set repository → PostgreSQL: queries workout data
- Measurement repository → PostgreSQL: persists measurements
