controllers/keycloakrealm/chain/users_roles.go (54 lines of code) (raw):

package chain import ( "context" "github.com/pkg/errors" keycloakApi "github.com/epam/edp-keycloak-operator/api/v1" "github.com/epam/edp-keycloak-operator/controllers/keycloakrealm/chain/handler" "github.com/epam/edp-keycloak-operator/pkg/client/keycloak" "github.com/epam/edp-keycloak-operator/pkg/client/keycloak/dto" ) type PutUsersRoles struct { next handler.RealmHandler } func (h PutUsersRoles) ServeRequest(ctx context.Context, realm *keycloakApi.KeycloakRealm, kClient keycloak.Client) error { rLog := log.WithValues("keycloak users", realm.Spec.Users) rLog.Info("Start putting roles to users") rDto := dto.ConvertSpecToRealm(&realm.Spec) err := putRolesToUsers(ctx, rDto, kClient) if err != nil { return errors.Wrap(err, "error during putRolesToUsers") } rLog.Info("End put role to users") return nextServeOrNil(ctx, h.next, realm, kClient) } func putRolesToUsers(ctx context.Context, realm *dto.Realm, kClient keycloak.Client) error { for _, user := range realm.Users { err := putRolesToOneUser(ctx, realm, &user, kClient) if err != nil { return errors.Wrap(err, "error during putRolesToOneUser") } } return nil } func putRolesToOneUser(ctx context.Context, realm *dto.Realm, user *dto.User, kClient keycloak.Client) error { for _, role := range user.RealmRoles { if err := putOneRealmRoleToOneUser(ctx, realm, user, role, kClient); err != nil { return errors.Wrap(err, "error during putOneRoleToOneUser") } } return nil } func putOneRealmRoleToOneUser(ctx context.Context, realm *dto.Realm, user *dto.User, role string, kClient keycloak.Client) error { exist, err := kClient.HasUserRealmRole(realm.Name, user, role) if err != nil { return errors.Wrap(err, "error during check of client role") } if exist { log.Info("Role already exists", "user", user, "role", role) return nil } if err := kClient.AddRealmRoleToUser(ctx, realm.Name, user.Username, role); err != nil { return errors.Wrap(err, "unable to add realm role to user") } return nil }