Skip to content

Commit

Permalink
Merge pull request #4277 from mozilla/revert-4212-mntor-2871
Browse files Browse the repository at this point in the history
Revert "Derive isResolved dynamically from subscribers resolved breach data classes (MNTOR-2871)"
  • Loading branch information
mansaj authored Feb 28, 2024
2 parents 6492cea + 5eb7556 commit 5ae3cb6
Show file tree
Hide file tree
Showing 20 changed files with 150 additions and 507 deletions.
9 changes: 3 additions & 6 deletions src/apiMocks/mockData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,11 @@ export function createRandomBreach(

faker.seed(options.fakerSeed);
const isResolved = options.isResolved ?? faker.datatype.boolean();
const dataClassesEffected = options.dataClassesEffected ?? [];
const resolvedDataClasses = isResolved ? dataClasses : [];

return {
addedDate: options.addedDate ?? faker.date.recent(),
breachDate: faker.date.recent(),
dataClasses: dataClasses,
resolvedDataClasses,
resolvedDataClasses: isResolved ? dataClasses : [],
description: faker.word.words(),
domain: faker.internet.domainName(),
id: faker.number.int(),
Expand All @@ -128,8 +125,8 @@ export function createRandomBreach(
name: faker.word.noun(),
title: faker.word.noun(),
emailsAffected: Array.from({ length: 3 }, () => faker.internet.email()),
isResolved,
dataClassesEffected,
isResolved: isResolved,
dataClassesEffected: options.dataClassesEffected ?? [],
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,13 @@ export default async function AutomaticRemovePage() {
session.user.subscriber.id,
);

const countryCode = getCountryCode(headers());
const profileId = await getOnerepProfileId(session.user.subscriber.id);
const scanData = await getLatestOnerepScanResults(profileId);
const subBreaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const subBreaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);

const data: StepDeterminationData = {
countryCode,
countryCode: getCountryCode(headers()),
latestScanData: scanData,
subscriberBreaches: subBreaches,
user: session.user,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,9 @@ export default async function ManualRemovePage() {
redirect("/user/dashboard/");
}

const countryCode = getCountryCode(headers());
const profileId = await getOnerepProfileId(session.user.subscriber.id);
const scanData = await getLatestOnerepScanResults(profileId);
const subBreaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const subBreaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);
const enabledFlags = await getEnabledFeatureFlags({
email: session.user.email,
Expand All @@ -39,9 +35,12 @@ export default async function ManualRemovePage() {
breaches={subBreaches}
scanData={scanData}
isPremiumUser={hasPremium(session.user)}
isEligibleForPremium={isEligibleForPremium(countryCode, enabledFlags)}
isEligibleForPremium={isEligibleForPremium(
getCountryCode(headers()),
enabledFlags,
)}
user={session.user}
countryCode={countryCode}
countryCode={getCountryCode(headers())}
subscriberEmails={subscriberEmails}
/>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,10 @@ export default async function StartFreeScanPage() {
}

const data: StepDeterminationData = {
countryCode,
countryCode: countryCode,
user: session.user,
latestScanData: latestScanData ?? null,
subscriberBreaches: await getSubscriberBreaches({
user: session.user,
countryCode,
}),
subscriberBreaches: await getSubscriberBreaches(session.user),
};
const subscriberEmails = await getSubscriberEmails(session.user);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,13 @@ export default async function ViewDataBrokers() {
redirect("/user/dashboard/");
}

const countryCode = getCountryCode(headers());
const profileId = await getOnerepProfileId(session.user.subscriber.id);
const latestScan = await getLatestOnerepScanResults(profileId);
const data: StepDeterminationData = {
countryCode,
countryCode: getCountryCode(headers()),
user: session.user,
latestScanData: latestScan ?? null,
subscriberBreaches: await getSubscriberBreaches({
user: session.user,
countryCode,
}),
subscriberBreaches: await getSubscriberBreaches(session.user),
};
const subscriberEmails = await getSubscriberEmails(session.user);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,11 @@ export default async function WelcomeToPlusPage() {
}

const scanData = await getLatestOnerepScanResults(profileId);
const countryCode = getCountryCode(headers());
const subBreaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const subBreaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);

const data: StepDeterminationData = {
countryCode,
countryCode: getCountryCode(headers()),
latestScanData: scanData,
subscriberBreaches: subBreaches,
user: session.user,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,7 @@ export default async function SecurityRecommendations({
if (!session?.user?.subscriber?.id) {
return redirect("/");
}
const countryCode = getCountryCode(headers());
const breaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const breaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);

const { type } = params;
Expand All @@ -54,12 +50,15 @@ export default async function SecurityRecommendations({
subscriberEmails={subscriberEmails}
type={type}
data={{
countryCode,
countryCode: getCountryCode(headers()),
subscriberBreaches: breaches,
user: session.user,
latestScanData: scanData,
}}
isEligibleForPremium={isEligibleForPremium(countryCode, enabledFlags)}
isEligibleForPremium={isEligibleForPremium(
getCountryCode(headers()),
enabledFlags,
)}
/>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ export default async function HighRiskDataBreaches() {
return redirect("/");
}

const countryCode = getCountryCode(headers());
const breaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const breaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);
const profileId = await getOnerepProfileId(session.user.subscriber.id);
const scanData = await getLatestOnerepScanResults(profileId);
Expand All @@ -39,12 +35,15 @@ export default async function HighRiskDataBreaches() {
subscriberEmails={subscriberEmails}
type="none"
data={{
countryCode,
countryCode: getCountryCode(headers()),
subscriberBreaches: breaches,
user: session.user,
latestScanData: scanData,
}}
isEligibleForPremium={isEligibleForPremium(countryCode, enabledFlags)}
isEligibleForPremium={isEligibleForPremium(
getCountryCode(headers()),
enabledFlags,
)}
/>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,7 @@ export default async function LeakedPasswords({
if (!session?.user?.subscriber?.id) {
return redirect("/");
}
const countryCode = getCountryCode(headers());
const breaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const breaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);

const { type } = params;
Expand All @@ -54,12 +50,15 @@ export default async function LeakedPasswords({
subscriberEmails={subscriberEmails}
type={type}
data={{
countryCode,
countryCode: getCountryCode(headers()),
subscriberBreaches: breaches,
user: session.user,
latestScanData: scanData,
}}
isEligibleForPremium={isEligibleForPremium(countryCode, enabledFlags)}
isEligibleForPremium={isEligibleForPremium(
getCountryCode(headers()),
enabledFlags,
)}
/>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,7 @@ export default async function SecurityRecommendations({
if (!session?.user?.subscriber?.id) {
return redirect("/");
}
const countryCode = getCountryCode(headers());
const breaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const breaches = await getSubscriberBreaches(session.user);
const subscriberEmails = await getSubscriberEmails(session.user);

const { type } = params;
Expand All @@ -54,12 +50,15 @@ export default async function SecurityRecommendations({
subscriberEmails={subscriberEmails}
type={type}
data={{
countryCode,
countryCode: getCountryCode(headers()),
subscriberBreaches: breaches,
user: session.user,
latestScanData: scanData,
}}
isEligibleForPremium={isEligibleForPremium(countryCode, enabledFlags)}
isEligibleForPremium={isEligibleForPremium(
getCountryCode(headers()),
enabledFlags,
)}
/>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export default async function DashboardPage() {
(isNewUser &&
canSubscribeToPremium({
user: session.user,
countryCode,
countryCode: countryCode,
}))
) {
return redirect("/user/welcome/");
Expand All @@ -75,10 +75,7 @@ export default async function DashboardPage() {
typeof profileId === "number"
? await getScansCountForProfile(profileId)
: 0;
const subBreaches = await getSubscriberBreaches({
user: session.user,
countryCode,
});
const subBreaches = await getSubscriberBreaches(session.user);

const userIsEligibleForFreeScan = await isEligibleForFreeScan(
session.user,
Expand Down
4 changes: 4 additions & 0 deletions src/app/api/v1/user/breaches/bulk-resolve/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,15 @@ export async function PUT(req: NextRequest): Promise<NextResponse> {
currentResolutionsChecked.push(dataTypeToResolve);
}

const isResolved =
currentResolutionsChecked.length === currentBreachDataTypes.length;

currentBreachResolution[currentEmail] = {
...(currentBreachResolution[currentEmail] || {}),
...{
[breachId]: {
resolutionsChecked: currentResolutionsChecked,
isResolved,
},
},
};
Expand Down
5 changes: 5 additions & 0 deletions src/app/api/v1/user/breaches/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,20 +114,25 @@ export async function PUT(req: NextRequest) {
// email_id: {
// recency_index: {
// resolutions: ['email', ...],
// isResolved: true
// }
// }
// }
// */

const currentBreachDataTypes = currentBreaches[0].DataClasses; // get this from existing breaches
// Typed as `any` because `subscriber` used to be typed as `any`, and
// making that type more specific was enough work just by itself:
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const currentBreachResolution: any = subscriber.breach_resolution || {}; // get this from existing breach resolution if available
const isResolved =
resolutionsChecked.length === currentBreachDataTypes.length;
currentBreachResolution[affectedEmail] = {
...(currentBreachResolution[affectedEmail] || {}),
...{
[breachIdNumber]: {
resolutionsChecked,
isResolved,
},
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export interface SubscriberBreachResolution {
useBreachId?: boolean;
[email: string]: {
[id: number]: {
isResolved: boolean;
resolutionsChecked: Array<string>;
};
};
Expand Down
18 changes: 4 additions & 14 deletions src/app/functions/server/getUserBreaches.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,10 @@ export async function getUserBreaches({
* NOTE: new function to replace getUserBreaches
*
* @param user
* @param user.user
* @param user.countryCode
*/
export async function getSubscriberBreaches({
user,
countryCode,
}: {
user: Session["user"];
countryCode: string;
}): Promise<SubscriberBreach[]> {
export async function getSubscriberBreaches(
user: Session["user"],
): Promise<SubscriberBreach[]> {
if (!user.subscriber?.fxa_uid) {
throw new Error("No fxa_uid found in session");
}
Expand All @@ -113,11 +107,7 @@ export async function getSubscriberBreaches({
throw new Error("No subscriber found for the given user data.");
}
const allBreaches = await getBreaches();
const breachesData = await getSubBreaches(
subscriber,
allBreaches,
countryCode,
);
const breachesData = await getSubBreaches(subscriber, allBreaches);
return breachesData;
}

Expand Down
15 changes: 0 additions & 15 deletions src/app/functions/universal/breach.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

import { DataClassEffected } from "../../../utils/subscriberBreaches";
import { HibpBreachDataTypes } from "../../deprecated/(authenticated)/user/breaches/breaches";

// TODO: Move pure functions that operate on breaches to this file

export const BreachDataTypes = {
Expand Down Expand Up @@ -52,15 +49,3 @@ export const SecurityRecommendationDataTypes = {
Phone: BreachDataTypes.Phone,
IP: BreachDataTypes.IP,
} as const;

export function isBreachResolved(
dataClassesAffected: DataClassEffected[],
resolvedDataClasses: Array<HibpBreachDataTypes[keyof HibpBreachDataTypes]>,
) {
return dataClassesAffected.every((dataClassAffected) => {
const dataClassAffectedKey = Object.keys(
dataClassAffected,
)[0] as (typeof BreachDataTypes)[keyof typeof BreachDataTypes];
return resolvedDataClasses.includes(dataClassAffectedKey);
});
}
Loading

0 comments on commit 5ae3cb6

Please sign in to comment.