From 5379acd179f46e39bfcb073094a442793a062b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Schro=CC=88ter?= Date: Sun, 4 Oct 2020 04:13:54 +0200 Subject: [PATCH] Create repository method to fetch userdata incl an hash of the password --- endpoint/user/query.go | 24 ++++++++++++++++++++++++ schemas/user.go | 7 +++++++ test/user_test.go | 4 ++++ 3 files changed, 35 insertions(+) diff --git a/endpoint/user/query.go b/endpoint/user/query.go index a7fe9f8..fb15e4d 100755 --- a/endpoint/user/query.go +++ b/endpoint/user/query.go @@ -31,6 +31,7 @@ type UserQuery interface { Insert(user *schemas.FullUserSchema, password string) (id uint32, err error) Select(id uint32) ([]schemas.FullUserSchema, error) SelectByUsername(username string) ([]schemas.InfoUserSchema, error) + SelectCredentialsByField(field UserField, value interface{}) (*schemas.CredentialsSchema, error) Authenticate(name string, password string) (uint32, error) Update(userID uint32, params PatchUserRequest, titleRepository title.TitleQuery) error UpdatePassword(userID uint32, password string) error @@ -38,6 +39,12 @@ type UserQuery interface { VerifyUser(uint32, string) error } +type UserField string + +const FieldID UserField = "iduser" +const FieldUsername UserField = "username" +const FieldEmail UserField = "email" + type MySQLUserQuery struct{} /* @@ -236,6 +243,23 @@ func (MySQLUserQuery) Select(id uint32) ([]schemas.FullUserSchema, error) { return users, nil } +func (MySQLUserQuery) SelectCredentialsByField(field UserField, value interface{}) (*schemas.CredentialsSchema, error) { + db, err := dbhandler.GetDBConnection() + if err != nil { + return nil, err + } + + row := db.QueryRow(fmt.Sprintf("SELECT iduser, username, email, SHA2(password, 512) FROM `user` WHERE %s=?", field), value) + + var result schemas.CredentialsSchema + + if err := row.Scan(&result.ID, &result.Username, &result.Email, &result.PasswordCipher); err != nil { + return nil, err + } + + return &result, nil +} + func (MySQLUserQuery) SelectByUsername(username string) ([]schemas.InfoUserSchema, error) { db, err := dbhandler.GetDBConnection() if err != nil { diff --git a/schemas/user.go b/schemas/user.go index 887676b..589c99a 100644 --- a/schemas/user.go +++ b/schemas/user.go @@ -23,6 +23,13 @@ type FullUserSchema struct { Verified bool `json:"verified,omitempty"` } +type CredentialsSchema struct { + ID uint32 + Username string + Email string + PasswordCipher string +} + // InfoUserFromFullUser creates and returns an InfoUserSchema struct from a given FullUserSchema func InfoUserFromFullUser(user FullUserSchema) InfoUserSchema { return InfoUserSchema{ diff --git a/test/user_test.go b/test/user_test.go index f8c5e8e..f845bf2 100644 --- a/test/user_test.go +++ b/test/user_test.go @@ -107,6 +107,10 @@ var errBadRequest = user.ErrBadRequest type mockUser struct { } +func (mockUser) SelectCredentialsByField(field user.UserField, value interface{}) (*schemas.CredentialsSchema, error) { + return nil, errors.New("method SelectCredentialsByField not implemented") +} + func (mockUser) Insert(user *schemas.FullUserSchema, password string) (id uint32, err error) { if _, exists := getMockUserByName(user.Username); exists { return 0, errors.New("User already exists") -- GitLab