in pkg/client/keycloak/adapter/gocloak_adapter.go [689:750]
func (a GoCloakAdapter) GetUsersByNames(ctx context.Context, realm string, names []string) (map[string]gocloak.User, error) {
namesChan := make(chan string)
go func() {
defer close(namesChan)
for _, name := range names {
namesChan <- name
}
}()
const workersCount = 10
var wg sync.WaitGroup
wg.Add(workersCount)
results := make(chan *gocloak.User)
errc := make(chan error, workersCount)
for i := 0; i < workersCount; i++ {
go func(ctx context.Context, realm string, names <-chan string, results chan<- *gocloak.User, errc chan<- error) {
defer wg.Done()
for userName := range names {
users, err := a.client.GetUsers(ctx, a.token.AccessToken, realm, gocloak.GetUsersParams{
Max: gocloak.IntP(100),
BriefRepresentation: gocloak.BoolP(true),
Username: gocloak.StringP(userName),
})
if err != nil {
errc <- fmt.Errorf("failed to get user %s from realm %s: %w", userName, realm, err)
return
}
user, _ := checkFullUsernameMatch(userName, users)
results <- user
}
}(ctx, realm, namesChan, results, errc)
}
go func() {
wg.Wait()
close(results)
close(errc)
}()
users := make(map[string]gocloak.User, len(names))
for user := range results {
if user != nil && user.Username != nil {
users[*user.Username] = *user
}
}
if err := <-errc; err != nil {
return nil, err
}
return users, nil
}