package useCases import ( "RenewCMS/internal/domain/invite" "RenewCMS/internal/domain/role" "RenewCMS/internal/domain/user" "sort" "time" ) const ( EntryKindUser = "user" EntryKindInvite = "invite" ) type ListUsersAndInvitesUseCase struct { userRepository user.Repository inviteRepository invite.Repository roles role.Repository } type DirectoryEntry struct { ID uint32 Kind string Username string DisplayName string Email string Role *RoleRef Status string CreatedAt time.Time } func NewListUsersAndInvitesUseCase(userRepository user.Repository, inviteRepository invite.Repository, roles role.Repository) *ListUsersAndInvitesUseCase { return &ListUsersAndInvitesUseCase{userRepository, inviteRepository, roles} } func userEntry(account user.User, found *RoleRef) DirectoryEntry { return DirectoryEntry{ ID: account.ID, Kind: EntryKindUser, Username: account.Username, DisplayName: account.DisplayName, Email: account.Email, Role: found, Status: string(invite.StatusAccepted), CreatedAt: account.CreatedAt, } } func (g *ListUsersAndInvitesUseCase) ListUsersAndInvites() ([]DirectoryEntry, error) { refs, err := roleRefsByID(g.roles) if err != nil { return nil, err } now := time.Now() entries := []DirectoryEntry{} for _, existingUser := range g.userRepository.GetAll() { entries = append(entries, userEntry(existingUser, lookupRoleRef(refs, existingUser.RoleID))) } for _, existingInvite := range g.inviteRepository.GetAll() { status := existingInvite.StatusAt(now) if status == invite.StatusAccepted { continue } entries = append(entries, DirectoryEntry{ ID: existingInvite.ID, Kind: EntryKindInvite, Email: existingInvite.Email, Role: lookupRoleRef(refs, existingInvite.RoleID), Status: string(status), CreatedAt: existingInvite.CreatedAt, }) } sort.SliceStable(entries, func(i, j int) bool { return entries[i].CreatedAt.After(entries[j].CreatedAt) }) return entries, nil }