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

88.23% Statements 15/17
75% Branches 3/4
100% Functions 8/8
88.23% Lines 15/17

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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60              46x         70x 334x 334x             334x   2874x   43072x       2874x                 334x 850x   850x 540x     334x             850x         70x    
import { first, groupBy, shuffle } from "remeda";
import { Group } from "server/types/assignmentTypes";
import { isStartTimeMatch } from "server/utils/isStartTimeMatch";
import { logger } from "server/utils/logger";
import { ProgramItem } from "shared/types/models/programItem";
import { User } from "shared/types/models/user";
 
export const getGroups = (
  attendeeGroups: readonly User[][],
  assignmentTime: string,
  lotterySignupProgramItems: readonly ProgramItem[],
): Group[] => {
  const results = attendeeGroups.flatMap((attendeeGroup) => {
    const firstMember = first(attendeeGroup);
    Iif (!firstMember) {
      logger.error(
        new Error("Assignment getGroups: error getting first member"),
      );
      return [];
    }
 
    const lotterySignupsForStartTime = firstMember.lotterySignups.filter(
      (lotterySignup) => {
        const programItem = lotterySignupProgramItems.find(
          (lotterySignupProgramItem) =>
            lotterySignupProgramItem.programItemId ===
            lotterySignup.programItemId,
        );
 
        return isStartTimeMatch(
          lotterySignup.signedToStartTime,
          assignmentTime,
          programItem?.parentId,
        );
      },
    );
 
    // Sort by priority, randomize between same priority values
    const sortedLotterySignups = Object.values(
      groupBy(lotterySignupsForStartTime, (item) => item.priority),
    ) // Group by priority
      .map((group) => shuffle(group)) // Shuffle each group
      .toSorted((a, b) => a[0].priority - b[0].priority) // Sort groups by priority, ascending
      .flat();
 
    return {
      id:
        firstMember.groupCode === "0"
          ? firstMember.serial
          : firstMember.groupCode,
      size: attendeeGroup.length,
      pref: sortedLotterySignups.map(
        (lotterySignup) => lotterySignup.programItemId,
      ),
    };
  });
 
  return results;
};