49 lines
1.1 KiB
Go
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
|
|
}
|