async function getAllEmailsAndBreaches()

in src/utils/breaches.ts [38:100]


async function getAllEmailsAndBreaches(
  user: userType,
  allBreaches: HibpLikeDbBreach[],
): Promise<AllEmailsAndBreaches> {
  const verifiedEmails: BundledVerifiedEmails[] = [];
  const unverifiedEmails: EmailAddressRow[] = [];

  if (!user) {
    const errMsg = "getAllEmailsAndBreaches: subscriber cannot be undefined";
    console.error(errMsg);
    captureMessage(errMsg);

    return { verifiedEmails, unverifiedEmails };
  }
  if (!allBreaches || allBreaches.length === 0) {
    const errMsg =
      "getAllEmailsAndBreaches: allBreaches object cannot be empty";
    console.error(errMsg);
    captureMessage(errMsg);

    return { verifiedEmails, unverifiedEmails };
  }

  const monitoredEmails = await getUserEmails(user.id);
  verifiedEmails.push(
    await bundleVerifiedEmails({
      user,
      email: user.primary_email,
      recordId: user.id,
      recordVerified: user.primary_verified,
      allBreaches,
    }),
  );
  for (const email of monitoredEmails) {
    if (email.verified) {
      verifiedEmails.push(
        await bundleVerifiedEmails({
          user,
          email: email.email,
          recordId: email.id,
          recordVerified: email.verified,
          allBreaches,
        }),
      );
    } else {
      unverifiedEmails.push(email);
    }
  }

  // get new breaches since last shown
  for (const emailEntry of verifiedEmails) {
    const newBreachesForEmail = emailEntry.breaches.filter(
      (breach) => breach.AddedDate >= user.breaches_last_shown,
    );

    for (const newBreachForEmail of newBreachesForEmail) {
      newBreachForEmail.NewBreach = true; // add "NewBreach" property to the new breach.
      emailEntry.hasNewBreaches = newBreachesForEmail.length; // add the number of new breaches to the email
    }
  }

  return { verifiedEmails, unverifiedEmails };
}