[Pharo] Personal fitness tracker web app.
Merge branch 'conflictos'
Changed files
src/MyFitnessTracker/MFTLoginRegisterLogoutComponent.class.st
@@ -14,7 +14,7 @@
14
14
| existingUser |
15
15
existingUser := MFTSQLite3Database getExistingUser: aMFTUser.
16
16
aMFTUser passwordHash = existingUser passwordHash
17
Removed:
ifTrue: [ self session login: aMFTUser ]
17
Added:
ifTrue: [ self session login: existingUser ]
18
18
ifFalse: [ self inform: 'Login failed' ]
19
19
]
20
20
src/MyFitnessTracker/MFTMainUserCard.class.st
@@ -22,6 +22,8 @@
22
22
{ #category : #rendering }
23
23
MFTMainUserCard >> renderContentOn: html [
24
24
25
Added:
| user |
26
Added:
user := self session user.
25
27
self renderCardOn: html with: [
26
28
html jumbotron
27
29
class: 'p-3 bg-light';
@@ -31,7 +33,7 @@
31
33
with: [
32
34
html
33
35
text: 'Welcome, ';
34
Removed:
code: self session user username;
36
Added:
code: (user realFirstName ifEmpty: [ user username ]);
35
37
text: '!' ].
36
38
html big textMuted with: subtitle ] ]
37
39
]
src/MyFitnessTracker/MFTMuscle.class.st
@@ -96,7 +96,7 @@
96
96
]
97
97
98
98
{ #category : #muscle }
99
Removed:
MFTMuscle class >> flexorCarpiRadialias [
99
Added:
MFTMuscle class >> flexorCarpiRadialis [
100
100
101
101
^ self newWithLatinName
102
102
englishName: 'Flexor Carpi Radialis';
src/MyFitnessTracker/MFTMuscleGroup.class.st
@@ -73,7 +73,7 @@
73
73
latinName: 'antebrachium';
74
74
muscles: {
75
75
MFTMuscle brachioRadialis.
76
Removed:
MFTMuscle flexorCarpiRadialias.
76
Added:
MFTMuscle flexorCarpiRadialis.
77
77
MFTMuscle flexorCarpiUlnaris.
78
78
MFTMuscle extensorCarpiRadialisLongus.
79
79
MFTMuscle extensorCarpiRadialiasBrevis.
src/MyFitnessTracker/MFTSQLite3Database.class.st
@@ -30,48 +30,82 @@
30
30
]
31
31
32
32
{ #category : #'as yet unclassified' }
33
Removed:
MFTSQLite3Database class >> ensureTablesExist [
33
Added:
MFTSQLite3Database class >> ensureAllTablesExist [
34
34
35
35
self defaultConnection
36
36
open;
37
Removed:
execute: 'CREATE TABLE IF NOT EXISTS "prospects" (
37
Added:
execute: self ensureUsersTableExists;
38
Added:
execute: self ensureProspectsTableExists;
39
Added:
execute: self ensureWeightsTableExists;
40
Added:
execute: self ensureWorkoutsTableExists;
41
Added:
execute: self ensureExercisesTableExists;
42
Added:
execute: self ensureSetsTableExists;
43
Added:
close
44
Added:
]
45
Added:
46
Added:
{ #category : #'as yet unclassified' }
47
Added:
MFTSQLite3Database class >> ensureExercisesTableExists [
48
Added:
49
Added:
^ 'CREATE TABLE IF NOT EXISTS "exercises" (
50
Added:
"id" INTEGER NOT NULL UNIQUE,
51
Added:
"name" TEXT NOT NULL,
52
Added:
PRIMARY KEY("id" AUTOINCREMENT))'
53
Added:
]
54
Added:
55
Added:
{ #category : #'as yet unclassified' }
56
Added:
MFTSQLite3Database class >> ensureProspectsTableExists [
57
Added:
58
Added:
^ 'CREATE TABLE IF NOT EXISTS "prospects" (
38
59
"id" INTEGER,
39
60
"email" TEXT NOT NULL,
40
61
"date_time" TEXT NOT NULL,
41
Removed:
PRIMARY KEY("id" AUTOINCREMENT)
42
Removed:
)';
43
Removed:
execute: 'CREATE TABLE IF NOT EXISTS "users" (
62
Added:
PRIMARY KEY("id" AUTOINCREMENT))'
63
Added:
]
64
Added:
65
Added:
{ #category : #'as yet unclassified' }
66
Added:
MFTSQLite3Database class >> ensureSetsTableExists [
67
Added:
68
Added:
^ 'CREATE TABLE IF NOT EXISTS "sets" (
69
Added:
"id" INTEGER NOT NULL UNIQUE,
70
Added:
""
71
Added:
"name" TEXT NOT NULL,
72
Added:
PRIMARY KEY("id" AUTOINCREMENT))'
73
Added:
]
74
Added:
75
Added:
{ #category : #'as yet unclassified' }
76
Added:
MFTSQLite3Database class >> ensureUsersTableExists [
77
Added:
78
Added:
^ 'CREATE TABLE IF NOT EXISTS "users" (
44
79
"id" INTEGER UNIQUE,
45
80
"username" TEXT NOT NULL,
46
81
"password_hash" BLOB NOT NULL,
47
82
"real_first_name" TEXT,
48
83
"real_last_name" TEXT,
49
84
"date_of_birth" TEXT,
50
Removed:
PRIMARY KEY("id" AUTOINCREMENT)
51
Removed:
)';
52
Removed:
execute: 'CREATE TABLE IF NOT EXISTS "workouts" (
85
Added:
PRIMARY KEY("id" AUTOINCREMENT))'
86
Added:
]
87
Added:
88
Added:
{ #category : #'as yet unclassified' }
89
Added:
MFTSQLite3Database class >> ensureWeightsTableExists [
90
Added:
91
Added:
^ 'CREATE TABLE IF NOT EXISTS "weights" (
92
Added:
"id" INTEGER UNIQUE,
93
Added:
"user_id" INTEGER NOT NULL,
94
Added:
"date" TEXT NOT NULL,
95
Added:
"value" NUMERIC NOT NULL,
96
Added:
PRIMARY KEY("id" AUTOINCREMENT))'
97
Added:
]
98
Added:
99
Added:
{ #category : #'as yet unclassified' }
100
Added:
MFTSQLite3Database class >> ensureWorkoutsTableExists [
101
Added:
102
Added:
^ 'CREATE TABLE IF NOT EXISTS "workouts" (
53
103
"id" INTEGER UNIQUE,
54
104
"user_id" INTEGER NOT NULL,
55
105
"date" TEXT NOT NULL,
56
106
"primary_muscle" TEXT,
57
107
"secondary_muscles" TEXT,
58
Removed:
PRIMARY KEY("id" AUTOINCREMENT)
59
Removed:
)';
60
Removed:
execute: 'CREATE TABLE IF NOT EXISTS "exercises" (
61
Removed:
"id" INTEGER NOT NULL UNIQUE,
62
Removed:
"workout_id" INTEGER NOT NULL,
63
Removed:
"english_name" TEXT NOT NULL,
64
Removed:
"sets" TEXT,
65
Removed:
PRIMARY KEY("id" AUTOINCREMENT)
66
Removed:
)';
67
Removed:
execute: 'CREATE TABLE IF NOT EXISTS "weights" (
68
Removed:
"id" INTEGER UNIQUE,
69
Removed:
"user_id" INTEGER NOT NULL,
70
Removed:
"date" TEXT NOT NULL,
71
Removed:
"value" NUMERIC NOT NULL,
72
Removed:
PRIMARY KEY("id" AUTOINCREMENT)
73
Removed:
)';
74
Removed:
close
108
Added:
PRIMARY KEY("id" AUTOINCREMENT))'
75
109
]
76
110
77
111
{ #category : #'as yet unclassified' }
@@ -100,7 +134,7 @@
100
134
101
135
defaultLocation := (Smalltalk imageDirectory / 'mft.sqlite3')
102
136
fullName.
103
Removed:
self ensureTablesExist
137
Added:
self ensureAllTablesExist
104
138
]
105
139
106
140
{ #category : #'instance creation' }
@@ -130,6 +164,7 @@
130
164
131
165
| connection |
132
166
connection := self defaultConnection open.
167
Added:
connection beginTransaction.
133
168
MFTWorkout placeholderCollection do: [ :workout |
134
169
| workoutId |
135
170
connection
@@ -139,8 +174,8 @@
139
174
with: {
140
175
1.
141
176
workout date yyyymmdd.
142
Removed:
workout primaryMuscle latinName.
143
Removed:
(workout secondaryMuscles collect: #latinName) asCommaString }.
177
Added:
workout primaryMuscle canonicalName.
178
Added:
(workout secondaryMuscles collect: #canonicalName) asCommaString }.
144
179
workoutId := (connection
145
180
execute: 'SELECT workouts.id
146
181
FROM workouts
@@ -148,12 +183,13 @@
148
183
value: workout date yyyymmdd) onlyValue.
149
184
workout exercises do: [ :exercise |
150
185
connection
151
Removed:
execute: 'INSERT INTO exercises(workout_id, english_name, sets)
186
Added:
execute: 'INSERT INTO exercises(workout_id, name, sets)
152
187
VALUES(?, ?, ?)'
153
188
with: {
154
189
workoutId.
155
Removed:
exercise englishName.
190
Added:
exercise canonicalName.
156
191
exercise sets asJson } ] ].
192
Added:
connection commitTransaction.
157
193
connection close
158
194
]
159
195
@@ -181,8 +217,8 @@
181
217
connection open.
182
218
user := (connection
183
219
execute: 'SELECT *
184
Removed:
FROM users
185
Removed:
WHERE id = ?'
220
Added:
FROM users
221
Added:
WHERE id = ?'
186
222
value: id) onlyRow.
187
223
connection close.
188
224
^ user
@@ -195,7 +231,7 @@
195
231
open;
196
232
execute: 'INSERT INTO prospects(email,date_time) VALUES (?, ?);'
197
233
value: anEmail
198
Removed:
value: DateAndTime now asUTC rounded asString;
234
Added:
value: DateAndTime now asUTC rounded;
199
235
close
200
236
]
201
237
@@ -213,12 +249,15 @@
213
249
{ #category : #'as yet unclassified' }
214
250
MFTSQLite3Database >> allUserWorkouts [
215
251
216
Removed:
^ (connection
217
Removed:
execute: 'SELECT *
218
Removed:
FROM workouts
219
Removed:
WHERE user_id = ?'
220
Removed:
value: userId) rows collect: [ :each |
221
Removed:
MFTWorkout newFromDictionary: each asDictionary ]
252
Added:
| rows workouts |
253
Added:
rows := (connection
254
Added:
execute: 'SELECT *
255
Added:
FROM workouts
256
Added:
WHERE user_id = ?'
257
Added:
value: userId) rows.
258
Added:
workouts := rows collect: [ :each |
259
Added:
MFTWorkout newFromDictionary: each asDictionary ].
260
Added:
^ workouts
222
261
]
223
262
224
263
{ #category : #'as yet unclassified' }
@@ -266,6 +305,7 @@
266
305
{ #category : #'as yet unclassified' }
267
306
MFTSQLite3Database >> deleteWorkout: aMFTWorkout [
268
307
308
Added:
connection beginTransaction.
269
309
connection
270
310
execute: 'DELETE
271
311
FROM workouts
@@ -273,7 +313,8 @@
273
313
AND date = ?'
274
314
with: {
275
315
userId.
276
Removed:
aMFTWorkout date yyyymmdd }
316
Added:
aMFTWorkout date yyyymmdd }.
317
Added:
connection commitTransaction
277
318
]
278
319
279
320
{ #category : #private }
@@ -298,11 +339,11 @@
298
339
MFTSQLite3Database >> insertExercise: aMFTExercise forWorkoutId: workoutId [
299
340
300
341
connection
301
Removed:
execute: 'INSERT INTO exercises(workout_id, english_name, sets)
342
Added:
execute: 'INSERT INTO exercises(workout_id, name, sets)
302
343
VALUES( ?, ?, ?)'
303
344
with: {
304
345
workoutId.
305
Removed:
aMFTExercise englishName.
346
Added:
aMFTExercise canonicalName.
306
347
aMFTExercise sets asJson }
307
348
]
308
349
@@ -322,9 +363,13 @@
322
363
MFTSQLite3Database >> insertWorkout: aMFTWorkout [
323
364
324
365
| workoutId |
366
Added:
connection beginTransaction.
325
367
connection
326
Removed:
execute:
327
Removed:
'INSERT INTO workouts(user_id, date, primary_muscle, secondary_muscles)
368
Added:
execute: 'INSERT INTO Workouts ("id" INTEGER UNIQUE,
369
Added:
"user_id",
370
Added:
"date" ,
371
Added:
"primary_muscle",
372
Added:
"secondary_muscles" )
328
373
VALUES(?, ?, ?, ?)'
329
374
with: {
330
375
userId.
@@ -342,10 +387,11 @@
342
387
userId.
343
388
aMFTWorkout date yyyymmdd.
344
389
aMFTWorkout primaryMuscle englishName.
345
Removed:
(aMFTWorkout secondaryMuscles collect: #englishName)
346
Removed:
asCommaString }) onlyValue.
390
Added:
(aMFTWorkout secondaryMuscles collect:
391
Added:
#canonicalName) asCommaString }) onlyValue.
347
392
aMFTWorkout exercises do: [ :exercise |
348
Removed:
self insertExercise: exercise forWorkoutId: workoutId ]
393
Added:
self insertExercise: exercise forWorkoutId: workoutId ].
394
Added:
connection commitTransaction
349
395
]
350
396
351
397
{ #category : #'as yet unclassified' }
src/MyFitnessTracker/MFTWorkout.class.st
@@ -32,10 +32,11 @@
32
32
at: 'secondary_muscles'
33
33
ifAbsent: [ String new ]) splitOn:
34
34
', ') collect: #asSymbol.
35
Added:
secondaryMusclesContructors removeAllSuchThat: [ :each | each = #'' ].
35
36
secondaryMuscles := secondaryMusclesContructors collect: [ :symbol |
36
37
(MFTMuscleGroup respondsTo: symbol)
37
38
ifTrue: [ MFTMuscleGroup perform: symbol ]
38
Removed:
ifFalse: [ MFTMuscleGroup new ] ].
39
Added:
ifFalse: [ nil ] ].
39
40
40
41
^ self new
41
42
date: (Date fromString: (aDictionary at: 'date'));