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

95.45% Statements 21/22
50% Branches 1/2
100% Functions 10/10
95.45% Lines 21/22

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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83          44x       73x 2541x   4013x   340113x   4013x     4013x       2541x         44x         120x   8746x 2972x     120x   8714x       120x                 44x           73x           73x 5353x       73x         73x            
import { DirectSignupsForProgramItem } from "server/features/direct-signup/directSignupTypes";
import { ProgramItem } from "shared/types/models/programItem";
import { User } from "shared/types/models/user";
import { isLotterySignupProgramItem } from "shared/utils/isLotterySignupProgramItem";
 
const getValidLotterySignupsUsers = (
  users: User[],
  programItems: ProgramItem[],
): User[] => {
  return users.map((user) => {
    const matchingLotterySignups = user.lotterySignups.filter(
      (lotterySignup) => {
        const foundProgramItem = programItems.find(
          (programItem) =>
            programItem.programItemId === lotterySignup.programItemId,
        );
        Iif (!foundProgramItem) {
          return false;
        }
        return isLotterySignupProgramItem(foundProgramItem);
      },
    );
 
    return { ...user, lotterySignups: matchingLotterySignups };
  });
};
 
// "Lottery participant" means program item took part in lottery and direct signup is either from lottery or after lottery
export const getLotteryParticipantDirectSignups = (
  directSignups: readonly DirectSignupsForProgramItem[],
  programItems: readonly ProgramItem[],
): readonly DirectSignupsForProgramItem[] => {
  // Take program items with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
  const lotteryValidProgramItemsIds = new Set(
    programItems
      .filter((programItem) => isLotterySignupProgramItem(programItem))
      .map((programItem) => programItem.programItemId),
  );
 
  const lotteryParticipantDirectSignups = directSignups.filter(
    (directSignup) => {
      return lotteryValidProgramItemsIds.has(directSignup.programItemId);
    },
  );
 
  return lotteryParticipantDirectSignups;
};
 
interface AssignmentParams {
  validLotterySignupsUsers: User[];
  validLotterySignupProgramItems: ProgramItem[];
  lotteryParticipantDirectSignups: readonly DirectSignupsForProgramItem[];
}
 
export const prepareAssignmentParams = (
  users: User[],
  programItems: ProgramItem[],
  directSignups: DirectSignupsForProgramItem[],
): AssignmentParams => {
  // Take lottery signups with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
  const validLotterySignupsUsers = getValidLotterySignupsUsers(
    users,
    programItems,
  );
 
  // Take program items with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
  const validLotterySignupProgramItems = programItems.filter((programItem) =>
    isLotterySignupProgramItem(programItem),
  );
 
  // Take direct signups with "twoPhaseSignupProgramTypes" which are not in "directSignupAlwaysOpenIds"
  const lotteryParticipantDirectSignups = getLotteryParticipantDirectSignups(
    directSignups,
    programItems,
  );
 
  return {
    validLotterySignupsUsers,
    validLotterySignupProgramItems,
    lotteryParticipantDirectSignups,
  };
};