[Pharo] Personal fitness tracker web app.
Clean up old SQLite3 model classes.
Changed files
src/MyFitnessTracker-Model/MFTSQLite3Database.class.st
@@ -1,524 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTSQLite3Database',
3
Removed:
#superclass : 'SQLite3Database',
4
Removed:
#instVars : [
5
Removed:
'user'
6
Removed:
],
7
Removed:
#classInstVars : [
8
Removed:
'defaultLocation',
9
Removed:
'allMuscleGroups',
10
Removed:
'allMuscles',
11
Removed:
'allExercises',
12
Removed:
'testUser'
13
Removed:
],
14
Removed:
#category : 'MyFitnessTracker-Model',
15
Removed:
#package : 'MyFitnessTracker-Model'
16
Removed:
}
17
Removed:
18
Removed:
{ #category : 'accessing' }
19
Removed:
MFTSQLite3Database class >> allExercises [
20
Removed:
21
Removed:
^ allExercises
22
Removed:
]
23
Removed:
24
Removed:
{ #category : 'accessing' }
25
Removed:
MFTSQLite3Database class >> allMuscleGroups [
26
Removed:
27
Removed:
^ allMuscleGroups
28
Removed:
]
29
Removed:
30
Removed:
{ #category : 'accessing' }
31
Removed:
MFTSQLite3Database class >> allMuscles [
32
Removed:
33
Removed:
^ allMuscles
34
Removed:
]
35
Removed:
36
Removed:
{ #category : 'accessing' }
37
Removed:
MFTSQLite3Database class >> createDefaultDatabaseAt: aLocation [
38
Removed:
39
Removed:
| schema command returnCode |
40
Removed:
schema := ((IceRepository repositoryNamed: 'my-fitness-tracker')
41
Removed:
codeDirectory / 'mft-schema.sql') pathString.
42
Removed:
command := 'sqlite3 ' , aLocation , ' < ' , schema.
43
Removed:
returnCode := LibC runCommand: command.
44
Removed:
returnCode ~= 0 ifTrue: [
45
Removed:
self error:
46
Removed:
'Non-zero return code when attempting to create the MFT database.' ]
47
Removed:
]
48
Removed:
49
Removed:
{ #category : 'as yet unclassified' }
50
Removed:
MFTSQLite3Database class >> defaultConnection [
51
Removed:
52
Removed:
^ self newOnDefaultLocation connection
53
Removed:
]
54
Removed:
55
Removed:
{ #category : 'accessing' }
56
Removed:
MFTSQLite3Database class >> defaultLocation [
57
Removed:
58
Removed:
^ defaultLocation
59
Removed:
]
60
Removed:
61
Removed:
{ #category : 'class initialization' }
62
Removed:
MFTSQLite3Database class >> getAllExercises [
63
Removed:
64
Removed:
| connection allRows |
65
Removed:
connection := self defaultConnection open.
66
Removed:
allRows := (connection execute: 'SELECT * FROM Exercises') rows.
67
Removed:
connection close.
68
Removed:
^ Array withAll: (allRows collect: [ :row |
69
Removed:
MFTExercise newFromDictionary: row asDictionary ])
70
Removed:
]
71
Removed:
72
Removed:
{ #category : 'class initialization' }
73
Removed:
MFTSQLite3Database class >> getAllMuscleGroups [
74
Removed:
75
Removed:
| connection allRows |
76
Removed:
connection := self defaultConnection open.
77
Removed:
allRows := (connection execute: 'SELECT * FROM Muscle_Groups') rows.
78
Removed:
connection close.
79
Removed:
^ Array withAll: (allRows collect: [ :row |
80
Removed:
MFTMuscleGroup newFromDictionary: row asDictionary ])
81
Removed:
]
82
Removed:
83
Removed:
{ #category : 'class initialization' }
84
Removed:
MFTSQLite3Database class >> getAllMuscles [
85
Removed:
86
Removed:
| connection allRows |
87
Removed:
connection := self defaultConnection open.
88
Removed:
allRows := (connection execute: 'SELECT * FROM Muscles') rows.
89
Removed:
connection close.
90
Removed:
^ Array withAll: (allRows collect: [ :row |
91
Removed:
MFTMuscle newFromDictionary: row asDictionary ])
92
Removed:
]
93
Removed:
94
Removed:
{ #category : 'accessing' }
95
Removed:
MFTSQLite3Database class >> getAllSetsForUser: aMFTUser connection: openConnection [
96
Removed:
97
Removed:
| allSetRows sets |
98
Removed:
allSetRows := (openConnection
99
Removed:
execute:
100
Removed:
'SELECT s.* FROM Sets s JOIN Workouts w ON s.workout_id = w.id WHERE w.user_id = ?'
101
Removed:
value: aMFTUser id) rows.
102
Removed:
sets := allSetRows collect: [ :row |
103
Removed:
MFTSet newFromDictionary: row asDictionary ].
104
Removed:
^ sets
105
Removed:
]
106
Removed:
107
Removed:
{ #category : 'accessing' }
108
Removed:
MFTSQLite3Database class >> getAllWeightsForUser: aMFTUser connection: openConnection [
109
Removed:
110
Removed:
| allWeightRows weights |
111
Removed:
allWeightRows := (openConnection
112
Removed:
execute: 'SELECT * FROM weights WHERE user_id = ?'
113
Removed:
value: aMFTUser id) rows.
114
Removed:
weights := allWeightRows collect: [ :row |
115
Removed:
MFTWeight newFromDictionary: row asDictionary ].
116
Removed:
^ weights
117
Removed:
]
118
Removed:
119
Removed:
{ #category : 'accessing' }
120
Removed:
MFTSQLite3Database class >> getAllWorkoutsForTestUser [
121
Removed:
122
Removed:
| connection workouts |
123
Removed:
connection := self defaultConnection open.
124
Removed:
workouts := self
125
Removed:
getAllWorkoutsForUser: testUser
126
Removed:
connection: connection.
127
Removed:
connection close.
128
Removed:
^ workouts
129
Removed:
]
130
Removed:
131
Removed:
{ #category : 'accessing' }
132
Removed:
MFTSQLite3Database class >> getAllWorkoutsForUser: aMFTUser connection: openConnection [
133
Removed:
134
Removed:
| allWorkoutRows workouts allSets |
135
Removed:
allWorkoutRows := (openConnection
136
Removed:
execute:
137
Removed:
'SELECT * FROM Workouts WHERE user_id = ?'
138
Removed:
value: aMFTUser id) rows.
139
Removed:
workouts := allWorkoutRows collect: [ :row |
140
Removed:
MFTWorkout newFromDictionary: row asDictionary ].
141
Removed:
allSets := self
142
Removed:
getAllSetsForUser: aMFTUser
143
Removed:
connection: openConnection.
144
Removed:
(allSets groupedBy: #workoutId) keysAndValuesDo: [
145
Removed:
:workoutId
146
Removed:
:workoutSets |
147
Removed:
| workout |
148
Removed:
workout := workouts detect: [ :w | w id = workoutId ].
149
Removed:
(workoutSets groupedBy: #groupId) keysAndValuesDo: [ :groupId :sets |
150
Removed:
workout addSetGroup:
151
Removed:
(MFTSetGroup new sets:
152
Removed:
(sets collect: [ :set | set groupId: groupId ])) ] ].
153
Removed:
^ workouts
154
Removed:
]
155
Removed:
156
Removed:
{ #category : 'as yet unclassified' }
157
Removed:
MFTSQLite3Database class >> getExistingUser: aMFTUser [
158
Removed:
159
Removed:
| connection existingUserDict |
160
Removed:
connection := self defaultConnection.
161
Removed:
connection open.
162
Removed:
existingUserDict := ((connection
163
Removed:
execute: 'SELECT *
164
Removed:
FROM users
165
Removed:
WHERE users.username = ?
166
Removed:
AND users.password_hash = ?'
167
Removed:
with: {
168
Removed:
aMFTUser username.
169
Removed:
aMFTUser passwordHash }) onlyRow: [
170
Removed:
Dictionary new ]) asDictionary.
171
Removed:
connection close.
172
Removed:
^ existingUserDict
173
Removed:
ifNotEmpty: [ MFTUser newFromDictionary: existingUserDict ]
174
Removed:
ifEmpty: [ nil ]
175
Removed:
]
176
Removed:
177
Removed:
{ #category : 'class initialization' }
178
Removed:
MFTSQLite3Database class >> getTestUser [
179
Removed:
180
Removed:
| connection testUserDict |
181
Removed:
connection := self defaultConnection.
182
Removed:
connection open.
183
Removed:
testUserDict := (connection execute:
184
Removed:
'SELECT * FROM users WHERE id = 1') onlyRow
185
Removed:
asDictionary.
186
Removed:
connection close.
187
Removed:
^ MFTUser newFromDictionary: testUserDict
188
Removed:
]
189
Removed:
190
Removed:
{ #category : 'class initialization' }
191
Removed:
MFTSQLite3Database class >> initialize [
192
Removed:
193
Removed:
" defaultLocation := (Smalltalk imageDirectory / 'mft.sqlite3') "
194
Removed:
" fullName. "
195
Removed:
" (FileSystem / defaultLocation) exists ifFalse: [ "
196
Removed:
" self createDefaultDatabaseAt: defaultLocation ]. "
197
Removed:
" allMuscles := self getAllMuscles. "
198
Removed:
" allMuscleGroups := self getAllMuscleGroups. "
199
Removed:
" allExercises := self getAllExercises. "
200
Removed:
" testUser := self getTestUser "
201
Removed:
]
202
Removed:
203
Removed:
{ #category : 'instance creation' }
204
Removed:
MFTSQLite3Database class >> newOnDefaultLocation [
205
Removed:
206
Removed:
^ self on: defaultLocation
207
Removed:
]
208
Removed:
209
Removed:
{ #category : 'class initialization' }
210
Removed:
MFTSQLite3Database class >> populatePlaceholderWeights [
211
Removed:
212
Removed:
| db |
213
Removed:
db := self newOnDefaultLocation user: testUser.
214
Removed:
db connection open.
215
Removed:
db connection execute: 'DELETE FROM Weights'.
216
Removed:
MFTWeight placeholderCollection do: [ :weight |
217
Removed:
db insertWeight: weight ].
218
Removed:
db connection close
219
Removed:
]
220
Removed:
221
Removed:
{ #category : 'class initialization' }
222
Removed:
MFTSQLite3Database class >> populatePlaceholderWorkouts [
223
Removed:
224
Removed:
| db |
225
Removed:
db := self newOnDefaultLocation user: testUser.
226
Removed:
db connection open.
227
Removed:
db connection
228
Removed:
execute: 'DELETE FROM Workouts';
229
Removed:
execute: 'DELETE FROM Sets'.
230
Removed:
MFTWorkout placeholderCollection do: [ :workout |
231
Removed:
db insertWorkout: workout ].
232
Removed:
db connection close
233
Removed:
]
234
Removed:
235
Removed:
{ #category : 'as yet unclassified' }
236
Removed:
MFTSQLite3Database class >> registerNewUser: aMFTUser [
237
Removed:
238
Removed:
aMFTUser username ifNotEmpty: [
239
Removed:
self defaultConnection
240
Removed:
open;
241
Removed:
execute:
242
Removed:
'INSERT INTO users(username,password_hash,account_register_date_time)
243
Removed:
VALUES (?, ?, ?);'
244
Removed:
with: {
245
Removed:
aMFTUser username.
246
Removed:
aMFTUser passwordHash.
247
Removed:
DateAndTime now asUTC rounded };
248
Removed:
close ]
249
Removed:
]
250
Removed:
251
Removed:
{ #category : 'setting' }
252
Removed:
MFTSQLite3Database class >> storeProspectEmail: anEmail [
253
Removed:
254
Removed:
self defaultConnection
255
Removed:
open;
256
Removed:
execute: 'INSERT INTO prospects(email,date_time) VALUES (?, ?);'
257
Removed:
value: anEmail
258
Removed:
value: DateAndTime now asUTC rounded;
259
Removed:
close
260
Removed:
]
261
Removed:
262
Removed:
{ #category : 'accessing' }
263
Removed:
MFTSQLite3Database class >> testUser [
264
Removed:
265
Removed:
^ testUser
266
Removed:
]
267
Removed:
268
Removed:
{ #category : 'as yet unclassified' }
269
Removed:
MFTSQLite3Database >> delete: anObject [
270
Removed:
"Delete an object from the database, using the appropriate method."
271
Removed:
272
Removed:
| methods appropriateMethod |
273
Removed:
methods := Dictionary newFrom: {
274
Removed:
(MFTWeight -> #deleteWeight:).
275
Removed:
(MFTWorkout -> #deleteWorkout:) }.
276
Removed:
appropriateMethod := methods at: anObject class ifAbsent: [
277
Removed:
^ self error:
278
Removed:
('No appropriate {1} method for deleting {2}'
279
Removed:
format: {
280
Removed:
self.
281
Removed:
anObject }) ].
282
Removed:
self perform: appropriateMethod with: anObject
283
Removed:
]
284
Removed:
285
Removed:
{ #category : 'as yet unclassified' }
286
Removed:
MFTSQLite3Database >> deleteSets: aMFTSetCollection [
287
Removed:
288
Removed:
aMFTSetCollection do: [ :set |
289
Removed:
connection
290
Removed:
execute: 'DELETE FROM Sets WHERE workout_id = ?'
291
Removed:
value: set workoutId ]
292
Removed:
]
293
Removed:
294
Removed:
{ #category : 'as yet unclassified' }
295
Removed:
MFTSQLite3Database >> deleteWeight: aMFTWeight [
296
Removed:
297
Removed:
connection
298
Removed:
execute:
299
Removed:
'DELETE FROM Weights WHERE user_id = ? AND date = ? AND value = ?'
300
Removed:
with: {
301
Removed:
user id.
302
Removed:
aMFTWeight date yyyymmdd.
303
Removed:
aMFTWeight value }
304
Removed:
]
305
Removed:
306
Removed:
{ #category : 'as yet unclassified' }
307
Removed:
MFTSQLite3Database >> deleteWorkout: aMFTWorkout [
308
Removed:
309
Removed:
self deleteSets: aMFTWorkout sets.
310
Removed:
connection
311
Removed:
execute: 'DELETE FROM Workouts WHERE user_id = ? AND date = ?'
312
Removed:
with: {
313
Removed:
user id.
314
Removed:
aMFTWorkout date yyyymmdd }
315
Removed:
]
316
Removed:
317
Removed:
{ #category : 'as yet unclassified' }
318
Removed:
MFTSQLite3Database >> getAllUserWeights [
319
Removed:
320
Removed:
^ self class getAllWeightsForUser: user connection: connection
321
Removed:
]
322
Removed:
323
Removed:
{ #category : 'as yet unclassified' }
324
Removed:
MFTSQLite3Database >> getAllUserWorkouts [
325
Removed:
326
Removed:
^ self class getAllWorkoutsForUser: user connection: connection
327
Removed:
]
328
Removed:
329
Removed:
{ #category : 'accessing' }
330
Removed:
MFTSQLite3Database >> insert: anObject [
331
Removed:
"Insert an object in the database, using the appropriate method."
332
Removed:
333
Removed:
| methods appropriateMethod |
334
Removed:
methods := Dictionary newFrom: {
335
Removed:
(MFTWeight -> #insertWeight:).
336
Removed:
(MFTWorkout -> #insertWorkout:) }.
337
Removed:
appropriateMethod := methods at: anObject class ifAbsent: [
338
Removed:
^ self error:
339
Removed:
('No appropriate {1} method for inserting {2}'
340
Removed:
format: {
341
Removed:
self.
342
Removed:
anObject }) ].
343
Removed:
344
Removed:
self perform: appropriateMethod with: anObject
345
Removed:
]
346
Removed:
347
Removed:
{ #category : 'as yet unclassified' }
348
Removed:
MFTSQLite3Database >> insertSet: aMFTSet forWorkout: aMFTWorkout [
349
Removed:
350
Removed:
connection
351
Removed:
execute:
352
Removed:
'INSERT INTO Sets ("workout_id","exercise_id", "set_group", "set_number", "reps", "load", "rpe", "rest_after")
353
Removed:
VALUES(?, ?, ?, ?, ?, ?, ?, ?)'
354
Removed:
with: {
355
Removed:
aMFTWorkout id.
356
Removed:
aMFTSet exerciseId.
357
Removed:
aMFTSet groupId.
358
Removed:
aMFTSet number.
359
Removed:
aMFTSet reps.
360
Removed:
aMFTSet load.
361
Removed:
aMFTSet rpe.
362
Removed:
aMFTSet restAfter }
363
Removed:
]
364
Removed:
365
Removed:
{ #category : 'as yet unclassified' }
366
Removed:
MFTSQLite3Database >> insertSets: aMFTSetCollection forWorkout: aMFTWorkout [
367
Removed:
368
Removed:
aMFTSetCollection do: [ :set |
369
Removed:
self insertSet: set forWorkout: aMFTWorkout ]
370
Removed:
]
371
Removed:
372
Removed:
{ #category : 'as yet unclassified' }
373
Removed:
MFTSQLite3Database >> insertWeight: aMFTWeight [
374
Removed:
375
Removed:
connection
376
Removed:
execute: 'INSERT INTO weights(user_id, date, value)
377
Removed:
VALUES(?, ?, ?)'
378
Removed:
with: {
379
Removed:
user id.
380
Removed:
aMFTWeight date yyyymmdd.
381
Removed:
aMFTWeight value }
382
Removed:
]
383
Removed:
384
Removed:
{ #category : 'as yet unclassified' }
385
Removed:
MFTSQLite3Database >> insertWorkout: aMFTWorkout [
386
Removed:
387
Removed:
| workoutId |
388
Removed:
connection beginTransaction.
389
Removed:
connection
390
Removed:
execute:
391
Removed:
'INSERT INTO Workouts ("user_id", "date", "primary_muscle_group_id") VALUES(?, ?, ?)'
392
Removed:
with: {
393
Removed:
user id.
394
Removed:
aMFTWorkout date yyyymmdd.
395
Removed:
aMFTWorkout primaryMuscleGroupId }.
396
Removed:
workoutId := (connection
397
Removed:
execute: 'SELECT id
398
Removed:
FROM workouts
399
Removed:
WHERE user_id = ?
400
Removed:
AND date = ?
401
Removed:
AND primary_muscle_group_id = ?'
402
Removed:
with: {
403
Removed:
user id.
404
Removed:
aMFTWorkout date yyyymmdd.
405
Removed:
aMFTWorkout primaryMuscleGroupId }) onlyValue.
406
Removed:
self insertSets: aMFTWorkout sets forWorkout: aMFTWorkout.
407
Removed:
connection commitTransaction
408
Removed:
]
409
Removed:
410
Removed:
{ #category : 'as yet unclassified' }
411
Removed:
MFTSQLite3Database >> login: aMFTUser atDateAndTime: aDateAndTime [
412
Removed:
413
Removed:
self user: aMFTUser.
414
Removed:
connection
415
Removed:
execute: 'UPDATE users
416
Removed:
SET last_login_date_time = ?
417
Removed:
WHERE id = ?'
418
Removed:
with: {
419
Removed:
aDateAndTime asString.
420
Removed:
user id }
421
Removed:
]
422
Removed:
423
Removed:
{ #category : 'as yet unclassified' }
424
Removed:
MFTSQLite3Database >> update: oldObject with: newObject [
425
Removed:
"Update an object in the database, using the appropriate method."
426
Removed:
427
Removed:
| methods appropriateMethod |
428
Removed:
methods := Dictionary newFrom: {
429
Removed:
(MFTWeight -> #updateWeight:with:).
430
Removed:
(MFTWorkout -> #updateWorkout:with:).
431
Removed:
(MFTUser -> #updateUser:with:) }.
432
Removed:
appropriateMethod := methods at: oldObject class ifAbsent: [
433
Removed:
^ self error:
434
Removed:
('No appropriate {1} method for updating {2}'
435
Removed:
format: {
436
Removed:
self.
437
Removed:
oldObject }) ].
438
Removed:
self perform: appropriateMethod with: oldObject with: newObject
439
Removed:
]
440
Removed:
441
Removed:
{ #category : 'as yet unclassified' }
442
Removed:
MFTSQLite3Database >> updateUserWith: newMFTUser [
443
Removed:
444
Removed:
connection
445
Removed:
execute: 'UPDATE users
446
Removed:
SET username = ?,
447
Removed:
password_hash = ?,
448
Removed:
date_of_birth = ?,
449
Removed:
real_first_name = ?,
450
Removed:
real_last_name = ?
451
Removed:
WHERE id = ?'
452
Removed:
with: {
453
Removed:
newMFTUser username.
454
Removed:
newMFTUser passwordHash.
455
Removed:
newMFTUser dateOfBirth.
456
Removed:
newMFTUser realFirstName.
457
Removed:
newMFTUser realLastName.
458
Removed:
user id }
459
Removed:
]
460
Removed:
461
Removed:
{ #category : 'as yet unclassified' }
462
Removed:
MFTSQLite3Database >> updateWeight: oldMFTWeight with: newMFTWeight [
463
Removed:
464
Removed:
connection
465
Removed:
execute: 'UPDATE weights
466
Removed:
SET date = ?,
467
Removed:
value = ?
468
Removed:
WHERE user_id = ?
469
Removed:
AND date = ?
470
Removed:
AND value = ?'
471
Removed:
with: {
472
Removed:
newMFTWeight date yyyymmdd.
473
Removed:
newMFTWeight value.
474
Removed:
user id.
475
Removed:
oldMFTWeight date yyyymmdd.
476
Removed:
oldMFTWeight value }
477
Removed:
]
478
Removed:
479
Removed:
{ #category : 'as yet unclassified' }
480
Removed:
MFTSQLite3Database >> updateWorkout: oldMFTWorkout with: newMFTWorkout [
481
Removed:
"We first obtain the workoutId to later replace the associated workout's exercises."
482
Removed:
483
Removed:
| workoutId |
484
Removed:
workoutId := (connection
485
Removed:
execute: 'SELECT id
486
Removed:
FROM workouts
487
Removed:
WHERE user_id = ?
488
Removed:
AND date = ?
489
Removed:
AND primary_muscle = ?
490
Removed:
AND secondary_muscles = ?'
491
Removed:
with: {
492
Removed:
user id.
493
Removed:
oldMFTWorkout date yyyymmdd.
494
Removed:
oldMFTWorkout primaryMuscle englishName.
495
Removed:
(oldMFTWorkout secondaryMuscles collect:
496
Removed:
#englishName) asCommaString }) onlyValue.
497
Removed:
connection
498
Removed:
execute: 'UPDATE workouts
499
Removed:
SET date = ?,
500
Removed:
primary_muscle = ?,
501
Removed:
secondary_muscles = ?
502
Removed:
WHERE id = ?'
503
Removed:
with: {
504
Removed:
newMFTWorkout date yyyymmdd.
505
Removed:
newMFTWorkout primaryMuscle englishName.
506
Removed:
(newMFTWorkout secondaryMuscles collect: #englishName)
507
Removed:
asCommaString.
508
Removed:
workoutId }.
509
Removed:
self deleteSetsForWorkoutId: workoutId.
510
Removed:
newMFTWorkout exercises do: [ :exercise |
511
Removed:
self insertExercise: exercise forWorkoutId: workoutId ]
512
Removed:
]
513
Removed:
514
Removed:
{ #category : 'accessing' }
515
Removed:
MFTSQLite3Database >> user [
516
Removed:
517
Removed:
^ user
518
Removed:
]
519
Removed:
520
Removed:
{ #category : 'accessing' }
521
Removed:
MFTSQLite3Database >> user: aMFTUser [
522
Removed:
523
Removed:
user := aMFTUser
524
Removed:
]
src/MyFitnessTracker-Model/ManifestMyFitnessTrackerModel.class.st
@@ -0,0 +1,10 @@
1
Added:
"
2
Added:
Please describe the package using the class comment of the included manifest class. The manifest class also includes other additional metadata for the package. These meta data are used by other tools such as the SmalllintManifestChecker and the critics Browser
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'ManifestMyFitnessTrackerModel',
6
Added:
#superclass : 'PackageManifest',
7
Added:
#category : 'MyFitnessTracker-Model-Manifest',
8
Added:
#package : 'MyFitnessTracker-Model',
9
Added:
#tag : 'Manifest'
10
Added:
}