# dimitargeorgievski/gymmanagerapp architecture

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

- Interactive diagram: https://gitdiagram.com/dimitargeorgievski/gymmanagerapp
- Repository: https://github.com/dimitargeorgievski/gymmanagerapp

## Overview

GymManagerApp is a web application for fitness tracking and trainer-client management. Users register or sign in, then view and manage workouts, plans, food, and exercises; users can also find trainers, while trainers manage clients and assign plans or workouts. The frontend uses routed pages and state stores to make authenticated API requests to a NestJS backend, whose controllers delegate to domain services. The excerpts support several frontend-to-backend routes and controller-to-service calls; other API links and persistence details are not shown, so they are omitted.

Main entry points: [`client/src/App.tsx`](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/App.tsx) (App routes), [`client/src/services/api.ts`](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/services/api.ts) (API client), [`client/src/pages/ClientDetailPage/ClientDetailPage.tsx`](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/ClientDetailPage/ClientDetailPage.tsx) (Client management), [`client/src/store/usePlanStore.ts`](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/usePlanStore.ts) (Plan state)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web client"]
  node_routes["App routes<br/>[App.tsx]"]
  node_home["Fitness dashboard<br/>[HomePage.tsx]"]
  node_apiclient["API client<br/>[api.ts]"]
end

subgraph group_identity["Identity"]
  node_authpages["Sign in / register<br/>[Login.tsx]"]
  node_token["Token storage<br/>[tokenService.ts]"]
  node_authcontroller["Auth endpoints<br/>[auth.controller.ts]"]
  node_authservice["Auth service<br/>[auth.service.ts]"]
end

subgraph group_fitness["Fitness management"]
  node_fitnesspages["Fitness pages<br/>[WorkoutPage.tsx]"]
  node_createworkout["Create workout"]
  node_workoutstore["Workout state<br/>[useWorkoutStore.ts]"]
  node_planstore["Plan state<br/>[usePlanStore.ts]"]
  node_workoutcontroller["Workout endpoints"]
  node_workoutservice["Workout service<br/>[workout.service.ts]"]
  node_plancontroller["Plan endpoints"]
  node_planservice["Plan service<br/>[plans.service.ts]"]
  node_exercisecontroller["Exercise endpoints"]
  node_exerciseservice["Exercise service"]
  node_foodcontroller["Food endpoints<br/>[food.controller.ts]"]
  node_foodservice["Food service<br/>[food.service.ts]"]
end

subgraph group_coaching["Trainer coaching"]
  node_trainerpages["Trainer discovery"]
  node_trainerdashboard["Trainer dashboard"]
  node_clientdetail["Client management"]
  node_trainerstore["Trainer state<br/>[useTrainerStore.ts]"]
  node_requestcontroller["Trainer requests"]
  node_requestservice["Request service"]
end

subgraph group_backend["API services"]
end

node_visitor(("User or trainer"))

node_visitor -->|"opens app"| node_routes
node_routes -->|"routes auth"| node_authpages
node_routes -->|"routes dashboard"| node_home
node_routes -->|"routes fitness"| node_fitnesspages
node_routes -->|"routes creation"| node_createworkout
node_routes -->|"routes coaching"| node_trainerpages
node_routes -->|"routes coaching"| node_trainerdashboard
node_routes -->|"routes clients"| node_clientdetail
node_authpages -.->|"requests auth"| node_apiclient
node_apiclient -->|"reads tokens"| node_token
node_apiclient -->|"refreshes token"| node_authcontroller
node_authcontroller -->|"delegates auth"| node_authservice
node_home -->|"loads workouts"| node_workoutstore
node_home -->|"loads plans"| node_planstore
node_createworkout -.->|"uses state"| node_workoutstore
node_workoutstore -->|"requests workouts"| node_apiclient
node_planstore -->|"requests plans"| node_apiclient
node_trainerdashboard -->|"loads coaching data"| node_trainerstore
node_clientdetail -->|"manages client"| node_trainerstore
node_clientdetail -->|"loads client plan"| node_planstore
node_clientdetail -->|"loads client workouts"| node_workoutstore
node_trainerstore -->|"requests coaching"| node_apiclient
node_trainerstore -->|"requests assignments"| node_workoutcontroller
node_planstore -->|"requests plans"| node_plancontroller
node_workoutcontroller -->|"delegates workouts"| node_workoutservice
node_plancontroller -->|"delegates plans"| node_planservice
node_exercisecontroller -->|"delegates exercises"| node_exerciseservice
node_foodcontroller -->|"delegates food"| node_foodservice
node_requestcontroller -->|"delegates requests"| node_requestservice

click node_routes "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/App.tsx"
click node_authpages "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/Login/Login.tsx"
click node_home "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/HomePage/HomePage.tsx"
click node_fitnesspages "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/WorkoutPage/WorkoutPage.tsx"
click node_createworkout "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/CreateWorkoutPage/CreateWorkoutPage.tsx"
click node_workoutstore "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/useWorkoutStore.ts"
click node_planstore "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/usePlanStore.ts"
click node_trainerpages "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/FindTrainerPage/FindTrainerPage.tsx"
click node_trainerdashboard "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/TrainerDashboardPage/TrainerDashboardPage.tsx"
click node_clientdetail "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/ClientDetailPage/ClientDetailPage.tsx"
click node_trainerstore "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/useTrainerStore.ts"
click node_apiclient "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/services/api.ts"
click node_token "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/services/tokenService.ts"
click node_authcontroller "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/auth/auth.controller.ts"
click node_authservice "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/auth/auth.service.ts"
click node_workoutcontroller "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/workout/workout.controller.ts"
click node_workoutservice "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/workout/workout.service.ts"
click node_plancontroller "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/plans/plans.controller.ts"
click node_planservice "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/plans/plans.service.ts"
click node_exercisecontroller "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/exercises/exercises.controller.ts"
click node_exerciseservice "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/exercises/exercises.service.ts"
click node_foodcontroller "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/food/food.controller.ts"
click node_foodservice "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/food/food.service.ts"
click node_requestcontroller "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/trainer-requests/trainer-requests.controller.ts"
click node_requestservice "https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/trainer-requests/trainer-requests.service.ts"

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_routes,node_home,node_apiclient,node_visitor toneBlue
class node_authpages,node_token,node_authcontroller,node_authservice toneAmber
class node_fitnesspages,node_createworkout,node_workoutstore,node_planstore,node_workoutcontroller,node_workoutservice,node_plancontroller,node_planservice,node_exercisecontroller,node_exerciseservice,node_foodcontroller,node_foodservice toneMint
class node_trainerpages,node_trainerdashboard,node_clientdetail,node_trainerstore,node_requestcontroller,node_requestservice toneRose
```

## Components

### Web client

- [App routes](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/App.tsx): `client/src/App.tsx`
- [Fitness dashboard](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/HomePage/HomePage.tsx): `client/src/pages/HomePage/HomePage.tsx`
- [API client](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/services/api.ts): `client/src/services/api.ts`

### Identity

- [Sign in / register](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/Login/Login.tsx): `client/src/pages/Login/Login.tsx`
- [Token storage](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/services/tokenService.ts): `client/src/services/tokenService.ts`
- [Auth endpoints](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/auth/auth.controller.ts): `server/src/auth/auth.controller.ts`
- [Auth service](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/auth/auth.service.ts): `server/src/auth/auth.service.ts`

### Fitness management

- [Fitness pages](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/WorkoutPage/WorkoutPage.tsx): `client/src/pages/WorkoutPage/WorkoutPage.tsx`
- [Create workout](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/CreateWorkoutPage/CreateWorkoutPage.tsx): `client/src/pages/CreateWorkoutPage/CreateWorkoutPage.tsx`
- [Workout state](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/useWorkoutStore.ts): `client/src/store/useWorkoutStore.ts`
- [Plan state](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/usePlanStore.ts): `client/src/store/usePlanStore.ts`
- [Workout endpoints](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/workout/workout.controller.ts): `server/src/workout/workout.controller.ts`
- [Workout service](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/workout/workout.service.ts): `server/src/workout/workout.service.ts`
- [Plan endpoints](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/plans/plans.controller.ts): `server/src/plans/plans.controller.ts`
- [Plan service](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/plans/plans.service.ts): `server/src/plans/plans.service.ts`
- [Exercise endpoints](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/exercises/exercises.controller.ts): `server/src/exercises/exercises.controller.ts`
- [Exercise service](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/exercises/exercises.service.ts): `server/src/exercises/exercises.service.ts`
- [Food endpoints](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/food/food.controller.ts): `server/src/food/food.controller.ts`
- [Food service](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/food/food.service.ts): `server/src/food/food.service.ts`

### Trainer coaching

- [Trainer discovery](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/FindTrainerPage/FindTrainerPage.tsx): `client/src/pages/FindTrainerPage/FindTrainerPage.tsx`
- [Trainer dashboard](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/TrainerDashboardPage/TrainerDashboardPage.tsx): `client/src/pages/TrainerDashboardPage/TrainerDashboardPage.tsx`
- [Client management](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/pages/ClientDetailPage/ClientDetailPage.tsx): `client/src/pages/ClientDetailPage/ClientDetailPage.tsx`
- [Trainer state](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/client/src/store/useTrainerStore.ts): `client/src/store/useTrainerStore.ts`
- [Trainer requests](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/trainer-requests/trainer-requests.controller.ts): `server/src/trainer-requests/trainer-requests.controller.ts`
- [Request service](https://github.com/dimitargeorgievski/gymmanagerapp/blob/main/server/src/trainer-requests/trainer-requests.service.ts): `server/src/trainer-requests/trainer-requests.service.ts`

### Other components

- **User or trainer**

## Connections

- User or trainer → App routes: opens app (evidence: `client/src/App.tsx`)
- App routes → Sign in / register: routes auth (evidence: `client/src/App.tsx`)
- App routes → Fitness dashboard: routes dashboard (evidence: `client/src/App.tsx`)
- App routes → Fitness pages: routes fitness (evidence: `client/src/App.tsx`)
- App routes → Create workout: routes creation (evidence: `client/src/App.tsx`)
- App routes → Trainer discovery: routes coaching (evidence: `client/src/App.tsx`)
- App routes → Trainer dashboard: routes coaching (evidence: `client/src/App.tsx`)
- App routes → Client management: routes clients (evidence: `client/src/App.tsx`)
- Sign in / register → API client: requests auth
- API client → Token storage: reads tokens (evidence: `client/src/services/api.ts`)
- API client → Auth endpoints: refreshes token (evidence: `client/src/services/api.ts`)
- Auth endpoints → Auth service: delegates auth (evidence: `server/src/auth/auth.controller.ts`)
- Fitness dashboard → Workout state: loads workouts (evidence: `client/src/pages/HomePage/HomePage.tsx`)
- Fitness dashboard → Plan state: loads plans (evidence: `client/src/pages/HomePage/HomePage.tsx`)
- Create workout → Workout state: uses state
- Workout state → API client: requests workouts (evidence: `client/src/store/useWorkoutStore.ts`)
- Plan state → API client: requests plans (evidence: `client/src/store/usePlanStore.ts`)
- Trainer dashboard → Trainer state: loads coaching data (evidence: `client/src/pages/TrainerDashboardPage/TrainerDashboardPage.tsx`)
- Client management → Trainer state: manages client (evidence: `client/src/pages/ClientDetailPage/ClientDetailPage.tsx`)
- Client management → Plan state: loads client plan (evidence: `client/src/pages/ClientDetailPage/ClientDetailPage.tsx`)
- Client management → Workout state: loads client workouts (evidence: `client/src/pages/ClientDetailPage/ClientDetailPage.tsx`)
- Trainer state → API client: requests coaching (evidence: `client/src/store/useTrainerStore.ts`)
- Trainer state → Workout endpoints: requests assignments (evidence: `client/src/store/useTrainerStore.ts`)
- Plan state → Plan endpoints: requests plans (evidence: `client/src/store/usePlanStore.ts`)
- Workout endpoints → Workout service: delegates workouts (evidence: `server/src/workout/workout.controller.ts`)
- Plan endpoints → Plan service: delegates plans (evidence: `server/src/plans/plans.controller.ts`)
- Exercise endpoints → Exercise service: delegates exercises (evidence: `server/src/exercises/exercises.controller.ts`)
- Food endpoints → Food service: delegates food (evidence: `server/src/food/food.controller.ts`)
- Trainer requests → Request service: delegates requests (evidence: `server/src/trainer-requests/trainer-requests.controller.ts`)
