All files / server/src/features/assignment/utils getAssignmentResultGroups.ts

100% Statements 12/12
50% Branches 1/2
100% Functions 6/6
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40                  44x         37x       37x 37x       37x     37x 350x     37x 173x 65x     59x 167x      
import { groupBy } from "remeda";
import { User } from "shared/types/models/user";
import { ProgramItem } from "shared/types/models/programItem";
import { AssignmentResultGroup } from "shared/types/models/result";
import { getStartingProgramItems } from "server/features/assignment/utils/getStartingProgramItems";
import { getGroupCreators } from "server/features/assignment/utils/getGroupCreators";
import { getGroupMembersWithCreatorLotterySignups } from "server/features/assignment/utils/getGroupMembers";
 
// Snapshot the groups that took part in the lottery for this assignment time, as they were when it ran
export const getAssignmentResultGroups = (
  users: readonly User[],
  programItems: readonly ProgramItem[],
  assignmentTime: string,
): AssignmentResultGroup[] => {
  const startingProgramItems = getStartingProgramItems(
    programItems,
    assignmentTime,
  );
  const groupCreators = getGroupCreators(users, startingProgramItems);
  const groupMembers = getGroupMembersWithCreatorLotterySignups(
    groupCreators,
    users,
  );
  const allAttendees = [...groupCreators, ...groupMembers];
 
  // Drop individual users (groupCode "0"); keep only actual groups
  const attendeesInGroups = allAttendees.filter(
    (attendee) => attendee.groupCode !== "0",
  );
 
  return Object.entries(
    groupBy(attendeesInGroups, (attendee) => attendee.groupCode),
  ).map(([groupCode, members]) => ({
    groupCode,
    groupCreator:
      members.find((member) => member.isGroupCreator)?.username ?? "",
    groupMembers: members.map((member) => member.username),
  }));
};