func()

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
}