From c577ccd7e41bff416ceff141099324579c099ec1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 15 Nov 2024 12:41:10 +0530 Subject: [PATCH] Filter out rejected face IDs when using remote cgroups --- web/packages/new/photos/services/ml/people.ts | 18 +++++++++++++++--- .../new/photos/services/user-details.ts | 10 ++++++---- .../new/photos/services/user-entity/index.ts | 4 ++-- web/packages/utils/transform.ts | 5 +++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 48d6edb56e..349336336d 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -67,6 +67,9 @@ export interface CGroupUserEntityData { /** * An unordered set of faces (IDs) that the user has manually marked as not * belonging to this group. + * + * For ease of transportation and persistence this is an array, but it + * should conceptually be thought of as a set. */ rejectedFaceIDs: string[]; /** @@ -265,11 +268,20 @@ export const reconstructPeopleState = async (): Promise => { // their name to an empty string. if (!name) isHidden = true; + let assignedFaceIDs: string[][]; + if (data.rejectedFaceIDs.length == 0) { + // Fast path for when there are no rejected faces. + assignedFaceIDs = assigned.map(({ faces }) => faces); + } else { + const rejectedFaceIDs = new Set(data.rejectedFaceIDs); + assignedFaceIDs = assigned.map(({ faces }) => + faces.filter((id) => !rejectedFaceIDs.has(id)), + ); + } + // Person faces from all the clusters assigned to this cgroup, sorted by // recency (then score). - const faces = personFacesSortedNewestFirst( - assigned.map(({ faces }) => faces).flat(), - ); + const faces = personFacesSortedNewestFirst(assignedFaceIDs.flat()); // Ignore this cgroup if we don't have visible faces left in it. const mostRecentFace = faces[0]; diff --git a/web/packages/new/photos/services/user-details.ts b/web/packages/new/photos/services/user-details.ts index 995e3a3dc9..f3d9dfc13f 100644 --- a/web/packages/new/photos/services/user-details.ts +++ b/web/packages/new/photos/services/user-details.ts @@ -2,7 +2,11 @@ import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { getKV, setKV } from "@/base/kv"; import { apiURL, familyAppOrigin, paymentsAppOrigin } from "@/base/origins"; import { ensure } from "@/utils/ensure"; -import { nullishToZero, nullToUndefined } from "@/utils/transform"; +import { + nullishToEmpty, + nullishToZero, + nullToUndefined, +} from "@/utils/transform"; import { getData, LS_KEYS, setLSUser } from "@ente/shared/storage/localStorage"; import isElectron from "is-electron"; import { z } from "zod"; @@ -112,9 +116,7 @@ const BonusData = z.object({ /** * List of bonuses applied for the user. */ - storageBonuses: Bonus.array() - .nullish() - .transform((v) => v ?? []), + storageBonuses: Bonus.array().nullish().transform(nullishToEmpty), }); /** diff --git a/web/packages/new/photos/services/user-entity/index.ts b/web/packages/new/photos/services/user-entity/index.ts index 813a1859d2..ad7fb76eb9 100644 --- a/web/packages/new/photos/services/user-entity/index.ts +++ b/web/packages/new/photos/services/user-entity/index.ts @@ -4,7 +4,7 @@ import { encryptBoxB64, generateNewBlobOrStreamKey, } from "@/base/crypto"; -import { nullToUndefined } from "@/utils/transform"; +import { nullishToEmpty, nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip, gzip } from "../../utils/gzip"; import type { CGroupUserEntityData } from "../ml/people"; @@ -85,7 +85,7 @@ const RemoteFaceCluster = z.object({ const RemoteCGroupData = z.object({ name: z.string().nullish().transform(nullToUndefined), assigned: z.array(RemoteFaceCluster), - rejectedFaceIDs: z.array(z.string()).nullish().transform(nullToUndefined), + rejectedFaceIDs: z.array(z.string()).nullish().transform(nullishToEmpty), isHidden: z.boolean(), avatarFaceID: z.string().nullish().transform(nullToUndefined), }); diff --git a/web/packages/utils/transform.ts b/web/packages/utils/transform.ts index 16e1c1c4e0..60053b0fae 100644 --- a/web/packages/utils/transform.ts +++ b/web/packages/utils/transform.ts @@ -8,3 +8,8 @@ export const nullToUndefined = (v: T | null | undefined): T | undefined => * Convert `null` and `undefined` to `0`, passthrough everything else unchanged. */ export const nullishToZero = (v: number | null | undefined) => v ?? 0; + +/** + * Convert `null` and `undefined` to `[]`, passthrough everything else unchanged. + */ +export const nullishToEmpty = (v: T[] | null | undefined) => v ?? [];