User management improvements (#1101)
* Show more descriptive success messages for User actions * Check username uniqueness when creating/updating User * Adjust translations * Add tests for `validateUsernameUnique()` Co-authored-by: Deluan <deluan@navidrome.org>
This commit is contained in:
@@ -134,6 +134,9 @@ func (r *userRepository) Save(entity interface{}) (string, error) {
|
||||
return "", rest.ErrPermissionDenied
|
||||
}
|
||||
u := entity.(*model.User)
|
||||
if err := validateUsernameUnique(r, u); err != nil {
|
||||
return "", err
|
||||
}
|
||||
err := r.Put(u)
|
||||
if err != nil {
|
||||
return "", err
|
||||
@@ -157,6 +160,9 @@ func (r *userRepository) Update(entity interface{}, cols ...string) error {
|
||||
if err := validatePasswordChange(u, usr); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := validateUsernameUnique(r, u); err != nil {
|
||||
return err
|
||||
}
|
||||
err := r.Put(u)
|
||||
if err == model.ErrNotFound {
|
||||
return rest.ErrNotFound
|
||||
@@ -186,6 +192,20 @@ func validatePasswordChange(newUser *model.User, logged *model.User) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateUsernameUnique(r model.UserRepository, u *model.User) error {
|
||||
usr, err := r.FindByUsername(u.UserName)
|
||||
if err == model.ErrNotFound {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if usr.ID != u.ID {
|
||||
return &rest.ValidationError{Errors: map[string]string{"userName": "ra.validation.unique"}}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *userRepository) Delete(id string) error {
|
||||
usr := loggedUser(r.ctx)
|
||||
if !usr.IsAdmin {
|
||||
|
||||
Reference in New Issue
Block a user