ch17
This commit is contained in:
@@ -22,6 +22,8 @@ type UserModelInterface interface {
|
||||
Insert(name, email, password string) error
|
||||
Authenticate(email, password string) (int, error)
|
||||
Exists(id int) (bool, error)
|
||||
GetById(id int) (*User, error)
|
||||
ChangePassword(id int, curr_pass, new_pass string) error
|
||||
}
|
||||
|
||||
type UserModel struct {
|
||||
@@ -82,3 +84,46 @@ func (m *UserModel) Exists(id int) (bool, error) {
|
||||
err := m.DB.QueryRow(stmt, id).Scan(&exists)
|
||||
return exists, err
|
||||
}
|
||||
|
||||
func (a *UserModel) GetById(id int) (*User, error) {
|
||||
acc := User{}
|
||||
|
||||
stmt := `SELECT name, email, created FROM users WHERE id = ?`
|
||||
err := a.DB.QueryRow(stmt, id).Scan(&acc.Name, &acc.Email, &acc.Created)
|
||||
if err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, ErrInvalidCredentials
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &acc, nil
|
||||
}
|
||||
|
||||
func (a *UserModel) ChangePassword(id int, curr_pass, new_pass string) error {
|
||||
hashedNewPassword, err := bcrypt.GenerateFromPassword([]byte(new_pass), 12)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var hashedDBPassword []byte
|
||||
stmt := `SELECT hashed_password FROM users WHERE id = ?`
|
||||
err = a.DB.QueryRow(stmt, id).Scan(&hashedDBPassword)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = bcrypt.CompareHashAndPassword(hashedDBPassword, []byte(curr_pass))
|
||||
if err != nil {
|
||||
if errors.Is(err, bcrypt.ErrMismatchedHashAndPassword) {
|
||||
return ErrInvalidCredentials
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
stmt = `UPDATE users SET hashed_password = ? WHERE id = ?`
|
||||
_, err = a.DB.Exec(stmt, hashedNewPassword, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user