diff --git a/endpoint/user/query.go b/endpoint/user/query.go index a7fe9f88bcb8f00f23b1ceb6ea6861b353a1ba89..fb15e4da1c37d948da43c3e2cba67d2d1deb71b2 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 887676bb3b3c7febe4161a32b88ebae1e70a95ed..589c99a4907ab6936c64329a54705e908ff95c31 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 f8c5e8e54503ed66eea93ca31b8c18173d119be8..f845bf2d5457815a1bd17e627f9121dbc963711f 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")