Files
RenewCMS/internal/infrastructure/useCases/LookupUserNames.go
T

49 lines
1.1 KiB
Go

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
}