all repos — go-lift @ 092e7440440b8459d82fb90c05c005f9f38e3c51

Lightweight workout tracker prototype..

ui/src/types/models.ts (view raw)

  1// Models for Go-Lift app that match the backend models
  2
  3// Equipment model
  4export interface Equipment {
  5  id?: number;
  6  name: string;
  7  description: string;
  8  createdAt?: string;
  9  updatedAt?: string;
 10  deletedAt?: string | null;
 11  exercises?: Exercise[]; // Many-to-many relationship
 12}
 13
 14// Muscle Group model
 15export interface MuscleGroup {
 16  id?: number;
 17  name: string;
 18  createdAt?: string;
 19  updatedAt?: string;
 20  deletedAt?: string | null;
 21  exercises?: Exercise[]; // Many-to-many relationship
 22}
 23
 24// ExerciseMuscleGroup join table
 25export interface ExerciseMuscleGroup {
 26  id?: number;
 27  exerciseId: number;
 28  muscleGroupId: number;
 29  exercise?: Exercise;
 30  muscleGroup?: MuscleGroup;
 31}
 32
 33// Set definition for an exercise
 34export interface Set {
 35  id?: number;
 36  exerciseId: number;
 37  reps: number;
 38  weight: number;
 39  duration: number; // In seconds, for timed exercises
 40  orderIndex: number;
 41  createdAt?: string;
 42  updatedAt?: string;
 43  deletedAt?: string | null;
 44  exercise?: Exercise; // Excluded in JSON via json:"-" but useful for frontend
 45}
 46
 47// Exercise definition
 48export interface Exercise {
 49  id?: number;
 50  name: string;
 51  description: string;
 52  createdAt?: string;
 53  updatedAt?: string;
 54  deletedAt?: string | null;
 55  equipment: Equipment[];
 56  muscleGroups: MuscleGroup[];
 57  sets?: Set[];
 58}
 59
 60// SuperSet to handle two exercises with single rest time
 61export interface SuperSet {
 62  id?: number;
 63  name: string;
 64  primaryExerciseId: number;
 65  secondaryExerciseId: number;
 66  restTime: number; // In seconds
 67  createdAt?: string;
 68  updatedAt?: string;
 69  deletedAt?: string | null;
 70  primaryExercise: Exercise;
 71  secondaryExercise: Exercise;
 72}
 73
 74// RoutineItem represents either an Exercise or a SuperSet in a Routine
 75export interface RoutineItem {
 76  id?: number;
 77  routineId: number;
 78  exerciseId?: number | null;
 79  superSetId?: number | null;
 80  restTime: number; // In seconds
 81  orderIndex: number;
 82  createdAt?: string;
 83  updatedAt?: string;
 84  deletedAt?: string | null;
 85  superSet?: SuperSet | null;
 86  exercise?: Exercise | null;
 87}
 88
 89// A collection of exercises and/or supersets that make up a workout routine
 90export interface Routine {
 91  id?: number;
 92  name: string;
 93  description: string;
 94  createdAt?: string;
 95  updatedAt?: string;
 96  deletedAt?: string | null;
 97  routineItems: RoutineItem[];
 98}
 99
100// RecordRoutine represents a completed workout session
101export interface RecordRoutine {
102  id?: number;
103  routineId: number;
104  startedAt: string;
105  endedAt?: string | null;
106  createdAt?: string;
107  updatedAt?: string;
108  deletedAt?: string | null;
109  routine: Routine;
110  recordRoutineItems: RecordRoutineItem[];
111}
112
113// RecordRoutineItem represents either a RecordExercise or a RecordSuperSet in a completed routine
114export interface RecordRoutineItem {
115  id?: number;
116  recordRoutineId: number;
117  recordExerciseId?: number | null;
118  recordSuperSetId?: number | null;
119  actualRestTime: number; // In seconds
120  orderIndex: number;
121  createdAt?: string;
122  updatedAt?: string;
123  deletedAt?: string | null;
124  recordSuperSet?: RecordSuperSet | null;
125  recordExercise?: RecordExercise | null;
126}
127
128// RecordSuperSet records a completed superset
129export interface RecordSuperSet {
130  id?: number;
131  recordRoutineId: number;
132  superSetId: number;
133  startedAt: string;
134  endedAt: string;
135  actualRestTime: number; // In seconds
136  orderIndex: number;
137  createdAt?: string;
138  updatedAt?: string;
139  deletedAt?: string | null;
140  superSet: SuperSet;
141}
142
143// RecordExercise tracks a completed exercise
144export interface RecordExercise {
145  id?: number;
146  recordRoutineId: number;
147  exerciseId: number;
148  startedAt: string;
149  endedAt: string;
150  actualRestTime: number; // In seconds
151  orderIndex: number;
152  recordSuperSetId?: number | null;
153  createdAt?: string;
154  updatedAt?: string;
155  deletedAt?: string | null;
156  exercise: Exercise;
157  recordSets: RecordSet[];
158}
159
160// RecordSet tracks an individual completed set
161export interface RecordSet {
162  id?: number;
163  recordExerciseId: number;
164  setId: number;
165  actualReps: number;
166  actualWeight: number;
167  actualDuration: number; // In seconds
168  completedAt: string;
169  orderIndex: number;
170  createdAt?: string;
171  updatedAt?: string;
172  deletedAt?: string | null;
173  set: Set;
174}
175
176// Additional models for localization
177export interface Localization {
178  id?: number;
179  languageId: number;
180  keyword: string;
181  text: string;
182  createdAt?: string;
183  updatedAt?: string;
184  deletedAt?: string | null;
185}
186
187export interface Language {
188  id?: number;
189  name: string;
190  code: string;
191  flag: string;
192  createdAt?: string;
193  updatedAt?: string;
194  deletedAt?: string | null;
195}
196
197export interface User {
198  id?: number;
199  name: string;
200  isFemale: string | boolean;
201  weight: string | number; // in kg
202  height: string | number; // in cm
203  birthDate: string; // ISO format date string
204  createdAt?: string;
205  updatedAt?: string;
206}
207
208// Stats for the home page
209export interface WorkoutStats {
210  totalWorkouts: number;
211  totalMinutes: number;
212  totalExercises: number;
213  mostFrequentExercise?: {
214    name: string;
215    count: number;
216  };
217  mostFrequentRoutine?: {
218    name: string;
219    count: number;
220  };
221  recentWorkouts: RecordRoutine[];
222}
223
224// Some simpler interfaces for UI use when full objects are too complex
225export interface ExerciseSimple {
226  id?: number;
227  name: string;
228  muscleGroups: string[];
229  equipment: string[];
230}
231
232export interface SetForUI {
233  id?: number;
234  reps: number;
235  weight: number;
236  duration?: number;
237  completed: boolean;
238}
239
240export interface ExerciseForWorkout {
241  id?: number;
242  exerciseId: number;
243  exercise?: Exercise;
244  sets: SetForUI[];
245  notes?: string;
246}