diff --git a/internal/repository/user.go b/internal/repository/user.go index 307916eb..a341e5be 100644 --- a/internal/repository/user.go +++ b/internal/repository/user.go @@ -14,6 +14,7 @@ import ( "path/filepath" "reflect" "runtime" + "sort" "strings" "sync" @@ -210,6 +211,12 @@ func (r *UserRepository) AddUserIfNotExists(user *schema.User) error { return err } +func sortedRoles(roles []string) []string { + cp := append([]string{}, roles...) + sort.Strings(cp) + return cp +} + func (r *UserRepository) UpdateUser(dbUser *schema.User, user *schema.User) error { // user contains updated info -> Apply to dbUser // --- Simple Name Update --- @@ -279,6 +286,15 @@ func (r *UserRepository) UpdateUser(dbUser *schema.User, user *schema.User) erro } } + // --- Fallback: sync any remaining role differences not covered above --- + // This handles admin role assignment/removal and any other combinations that + // the specific branches above do not cover (e.g. user→admin, admin→user). + if !reflect.DeepEqual(sortedRoles(dbUser.Roles), sortedRoles(user.Roles)) { + if err := updateRoles(user.Roles); err != nil { + return err + } + } + return nil }