8
8
"errors"
9
9
"github.com/google/uuid"
10
10
"log"
11
+ "strconv"
12
+ "strings"
11
13
)
12
14
13
15
func GetUserByUsernameOrEmail (username string ) (* models.User , error ) {
@@ -83,7 +85,7 @@ func GetUserByEmail(email string) (*models.User, error) {
83
85
err := database .DB .QueryRow (context .Background (), query , email ).Scan (
84
86
& userID , & user .Username , & user .Password , & user .FirstName , & user .MiddleName , & user .LastName , & user .Email ,
85
87
& user .StudentID , & user .Major , & user .ProfilePicture , & user .DateOfBirth , & user .RoleID , & user .CreatedAt ,
86
- & user .UpdatedAt , & user .Year , & user .InstitutionName , & user .Gender )
88
+ & user .UpdatedAt , & user .Year , & user .InstitutionName , & user .Gender , & user . TwoFAEnabled , & user . TwoFAImage , & user . TwoFASecret )
87
89
if err != nil {
88
90
if errors .Is (err , sql .ErrNoRows ) {
89
91
return nil , nil // User not found, return nil
@@ -101,13 +103,16 @@ func GetUserByID(userID uuid.UUID) (*models.User, error) {
101
103
var user models.User
102
104
103
105
err := database .DB .QueryRow (context .Background (), `
104
- SELECT id, username, password, first_name, middle_name, last_name, email, student_id, major, profile_picture, date_of_birth, role_id, created_at, updated_at, year, institution_name, gender
106
+ SELECT id, username, password, first_name, middle_name, last_name, email, student_id, major, profile_picture, date_of_birth, role_id, created_at, updated_at, year, institution_name, gender, twofa_enabled, twofa_image, twofa_secret
105
107
FROM users WHERE id = $1` , userID ).Scan (
106
108
& user .ID , & user .Username , & user .Password , & user .FirstName , & user .MiddleName , & user .LastName , & user .Email ,
107
109
& user .StudentID , & user .Major , & user .ProfilePicture , & user .DateOfBirth , & user .RoleID , & user .CreatedAt ,
108
- & user .UpdatedAt , & user .Year , & user .InstitutionName , & user .Gender )
110
+ & user .UpdatedAt , & user .Year , & user .InstitutionName , & user .Gender , & user . TwoFAEnabled , & user . TwoFAImage , & user . TwoFASecret )
109
111
110
112
if err != nil {
113
+ if errors .Is (err , sql .ErrNoRows ) {
114
+ return nil , nil
115
+ }
111
116
return nil , err
112
117
}
113
118
@@ -153,13 +158,104 @@ func CheckStudentIDExists(studentID string) (bool, error) {
153
158
}
154
159
155
160
func UpdateUser (UserID uuid.UUID , updatedUser * models.User ) error {
156
- _ , err := database .DB .Exec (context .Background (), `
157
- UPDATE users SET username = $1, password = $2, first_name = $3, middle_name = $4, last_name = $5, email = $6,
158
- student_id = $7, major = $8, year = $9, role_id = $10, updated_at = $11, institution_name= $12, gender = $13
159
- WHERE id = $14` ,
160
- updatedUser .Username , updatedUser .Password , updatedUser .FirstName , updatedUser .MiddleName , updatedUser .LastName ,
161
- updatedUser .Email , updatedUser .StudentID , updatedUser .Major , updatedUser .Year , updatedUser .RoleID ,
162
- updatedUser .UpdatedAt , updatedUser .InstitutionName , updatedUser .Gender , UserID )
161
+ query := "UPDATE users SET "
162
+ args := []interface {}{}
163
+ argID := 1
164
+
165
+ if updatedUser .Username != "" {
166
+ query += "username = $" + strconv .Itoa (argID ) + ", "
167
+ args = append (args , updatedUser .Username )
168
+ argID ++
169
+ }
170
+ if updatedUser .Password != "" {
171
+ query += "password = $" + strconv .Itoa (argID ) + ", "
172
+ args = append (args , updatedUser .Password )
173
+ argID ++
174
+ }
175
+ if updatedUser .FirstName != "" {
176
+ query += "first_name = $" + strconv .Itoa (argID ) + ", "
177
+ args = append (args , updatedUser .FirstName )
178
+ argID ++
179
+ }
180
+ if updatedUser .MiddleName != nil && * updatedUser .MiddleName != "" {
181
+ query += "middle_name = $" + strconv .Itoa (argID ) + ", "
182
+ args = append (args , updatedUser .MiddleName )
183
+ argID ++
184
+ }
185
+ if updatedUser .LastName != "" {
186
+ query += "last_name = $" + strconv .Itoa (argID ) + ", "
187
+ args = append (args , updatedUser .LastName )
188
+ argID ++
189
+ }
190
+ if updatedUser .Email != "" {
191
+ query += "email = $" + strconv .Itoa (argID ) + ", "
192
+ args = append (args , updatedUser .Email )
193
+ argID ++
194
+ }
195
+ if updatedUser .StudentID != "" {
196
+ query += "student_id = $" + strconv .Itoa (argID ) + ", "
197
+ args = append (args , updatedUser .StudentID )
198
+ argID ++
199
+ }
200
+ if updatedUser .Major != "" {
201
+ query += "major = $" + strconv .Itoa (argID ) + ", "
202
+ args = append (args , updatedUser .Major )
203
+ argID ++
204
+ }
205
+ if updatedUser .Year != "" {
206
+ query += "year = $" + strconv .Itoa (argID ) + ", "
207
+ args = append (args , updatedUser .Year )
208
+ argID ++
209
+ }
210
+ if updatedUser .DateOfBirth != nil {
211
+ query += "date_of_birth = $" + strconv .Itoa (argID ) + ", "
212
+ args = append (args , updatedUser .DateOfBirth )
213
+ argID ++
214
+ }
215
+ if updatedUser .RoleID != 0 {
216
+ query += "role_id = $" + strconv .Itoa (argID ) + ", "
217
+ args = append (args , updatedUser .RoleID )
218
+ argID ++
219
+ }
220
+ if ! updatedUser .UpdatedAt .IsZero () {
221
+ query += "updated_at = $" + strconv .Itoa (argID ) + ", "
222
+ args = append (args , updatedUser .UpdatedAt )
223
+ argID ++
224
+ }
225
+ if updatedUser .InstitutionName != nil && * updatedUser .InstitutionName != "" {
226
+ query += "institution_name = $" + strconv .Itoa (argID ) + ", "
227
+ args = append (args , updatedUser .InstitutionName )
228
+ argID ++
229
+ }
230
+ if updatedUser .Gender != "" {
231
+ query += "gender = $" + strconv .Itoa (argID ) + ", "
232
+ args = append (args , updatedUser .Gender )
233
+ argID ++
234
+ }
235
+ if updatedUser .TwoFAEnabled != false {
236
+ query += "twofa_enabled = $" + strconv .Itoa (argID ) + ", "
237
+ args = append (args , updatedUser .TwoFAEnabled )
238
+ argID ++
239
+ }
240
+ if updatedUser .TwoFAImage != nil && * updatedUser .TwoFAImage != "" {
241
+ query += "twofa_image = $" + strconv .Itoa (argID ) + ", "
242
+ args = append (args , updatedUser .TwoFAImage )
243
+ argID ++
244
+ }
245
+ if updatedUser .TwoFASecret != nil && * updatedUser .TwoFASecret != "" {
246
+ query += "twofa_secret = $" + strconv .Itoa (argID ) + ", "
247
+ args = append (args , updatedUser .TwoFASecret )
248
+ argID ++
249
+ }
250
+
251
+ // Remove the last comma and space
252
+ query = strings .TrimSuffix (query , ", " )
253
+
254
+ // Add the WHERE clause
255
+ query += " WHERE id = $" + strconv .Itoa (argID )
256
+ args = append (args , UserID )
257
+
258
+ _ , err := database .DB .Exec (context .Background (), query , args ... )
163
259
return err
164
260
}
165
261
@@ -195,6 +291,7 @@ func ListUsers() ([]models.User, error) {
195
291
& user .RoleID , & user .CreatedAt , & user .UpdatedAt , & user .Year , & user .EmailVerified ,
196
292
& user .EmailVerificationToken , & user .PasswordResetToken , & user .PasswordResetExpires ,
197
293
& user .StudentIDVerified , & user .StudentIDVerification , & user .InstitutionName , & user .Gender ,
294
+ & user .TwoFAEnabled , & user .TwoFAImage , & user .TwoFASecret ,
198
295
)
199
296
if err != nil {
200
297
log .Println ("Error scanning row:" , err )
0 commit comments