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}