package admin import ( "context" "strings" "tug/internal/storage" ) func split(users []storage.User) (enabled, disabled []storage.User) { for _, u := range users { if u.Disabled { disabled = append(disabled, u) } else { enabled = append(enabled, u) } } return enabled, disabled } func membersOf(users []storage.User) []Member { out := make([]Member, 0, len(users)) for _, u := range users { out = append(out, Member{ID: u.ID, Username: u.Username, DisplayName: u.DisplayName}) } return out } func (s *Service) GroupCandidates(ctx context.Context, groupID, query string) ([]Member, error) { g, err := s.store.GroupByID(ctx, groupID) if err != nil { return nil, target("read group", err) } needle := strings.ToLower(strings.TrimSpace(query)) if needle == "" || g.Name == s.primaryGroup { return nil, nil } members, err := s.members(ctx, g) if err != nil { return nil, err } in := make(map[string]bool, len(members)) for _, u := range members { in[u.ID] = true } users, err := s.store.ListUsers(ctx) if err != nil { return nil, failed("list users", err) } var found []storage.User for _, u := range users { if !in[u.ID] && matches(u, needle) { found = append(found, u) if len(found) == CandidatesShown { break } } } return membersOf(found), nil }