in src/app/functions/server/getRelevantGuidedSteps.ts [261:355]
export function hasCompletedStep(
data: StepDeterminationData,
stepId: StepLink["id"],
enabledFeatureFlags?: FeatureFlagName[],
): boolean {
/* c8 ignore start */
if (
// TODO: MNTOR-3886 - Remove EnableRemovalUnderMaintenanceStep feature flag
enabledFeatureFlags?.includes("EnableRemovalUnderMaintenanceStep") &&
stepId === "DataBrokerManualRemoval"
) {
return (
data.latestScanData?.results?.every(
(result) =>
!(result.broker_status === "removal_under_maintenance") ||
result.status === "removed" ||
result.manually_resolved,
// MNTOR-3892
// Already covered by unit tests
) ?? false
);
}
/* c8 ignore stop */
if (stepId === "Scan") {
const hasRunScan =
typeof data.latestScanData?.scan === "object" &&
data.latestScanData?.scan !== null;
const hasResolvedAllScanResults =
(data.latestScanData?.scan?.onerep_scan_status === "finished" ||
data.latestScanData?.scan?.onerep_scan_status === "in_progress") &&
data.latestScanData.results.every(
(scanResult) =>
scanResult.manually_resolved || scanResult.status !== "new",
);
return hasRunScan && hasResolvedAllScanResults;
}
function isBreachResolved(
dataClass: (typeof BreachDataTypes)[keyof typeof BreachDataTypes],
): boolean {
return !data.subscriberBreaches.some((breach) => {
const affectedDataClasses = breach.dataClassesEffected.map(
(affectedDataClass) => Object.keys(affectedDataClass)[0],
);
return (
affectedDataClasses.includes(dataClass) &&
!breach.resolvedDataClasses.includes(dataClass)
);
});
}
if (stepId === "HighRiskSsn") {
return isBreachResolved(HighRiskDataTypes.SSN);
}
if (stepId === "HighRiskCreditCard") {
return isBreachResolved(HighRiskDataTypes.CreditCard);
}
if (stepId === "HighRiskBankAccount") {
return isBreachResolved(HighRiskDataTypes.BankAccount);
}
if (stepId === "HighRiskPin") {
return isBreachResolved(HighRiskDataTypes.PIN);
}
if (stepId === "LeakedPasswordsPassword") {
return isBreachResolved(BreachDataTypes.Passwords);
}
if (stepId === "LeakedPasswordsSecurityQuestion") {
return isBreachResolved(BreachDataTypes.SecurityQuestions);
}
if (stepId === "SecurityTipsPhone") {
return isBreachResolved(BreachDataTypes.Phone);
}
if (stepId === "SecurityTipsEmail") {
return isBreachResolved(BreachDataTypes.Email);
}
if (stepId === "SecurityTipsIp") {
return isBreachResolved(BreachDataTypes.IP);
}
if (stepId === "Done") {
return false;
// All steps should have been covered by the above conditions:
/* c8 ignore next 4 */
}
return false as never;
}