package useCases import ( "RenewCMS/internal/domain/user" "sort" ) type LookupUserNamesUseCase struct { users user.Repository } type UserName struct { ID uint32 DisplayName string } func NewLookupUserNamesUseCase(users user.Repository) *LookupUserNamesUseCase { return &LookupUserNamesUseCase{users} } func (u *LookupUserNamesUseCase) Lookup(ids []uint32) ([]UserName, error) { distinct := distinctIDs(ids) if len(distinct) == 0 || len(distinct) > user.MaxLookupIDs { return nil, user.ErrInvalidLookup } found, err := u.users.FindByIDs(distinct) if err != nil { return nil, err } sort.Slice(found, func(i, j int) bool { return found[i].ID < found[j].ID }) names := make([]UserName, 0, len(found)) for _, record := range found { names = append(names, UserName{ID: record.ID, DisplayName: record.NameOrUsername()}) } return names, nil } func distinctIDs(ids []uint32) []uint32 { seen := make(map[uint32]bool, len(ids)) distinct := make([]uint32, 0, len(ids)) for _, id := range ids { if !seen[id] { seen[id] = true distinct = append(distinct, id) } } return distinct }