This commit is contained in:
Manav Rathi
2025-07-01 20:31:34 +05:30
parent 21738995cc
commit 7edb1fab7b
2 changed files with 64 additions and 3 deletions

View File

@@ -322,6 +322,7 @@ export type RemoteEnteFile = z.infer<typeof RemoteEnteFile>;
* a provided timestamp.
*
* - "/collections/v2/diff"
* - "/public-collection/diff"
* - "/cast/diff"
*/
export const FileDiffResponse = z.object({

View File

@@ -11,11 +11,19 @@ import {
type Collection,
type PublicURL,
} from "ente-media/collection";
import type { EnteFile } from "ente-media/file";
import {
decryptRemoteFile,
FileDiffResponse,
type EnteFile,
} from "ente-media/file";
import { z } from "zod/v4";
import {
savedPublicCollectionFiles,
savedPublicCollectionLastSyncTime,
saveLastPublicCollectionReferralCode,
savePublicCollection,
savePublicCollectionFiles,
savePublicCollectionLastSyncTime,
} from "./public-albums-fdb";
/**
@@ -155,10 +163,62 @@ const getPublicCollectionInfo = async (accessToken: string) => {
*
* This callback can get called multiple times during the pull.
*/
export const pullPublicCollectionFiles = (
export const pullPublicCollectionFiles = async (
credentials: PublicAlbumsCredentials,
collection: Collection,
onSetFiles: (files: EnteFile[]) => void,
) => {
throw new Error("X");
const { accessToken } = credentials;
const files = await savedPublicCollectionFiles(accessToken);
const filesByID = new Map(files.map((f) => [f.id, f]));
let sinceTime = (await savedPublicCollectionLastSyncTime(accessToken)) ?? 0;
while (true) {
const { diff, hasMore } = await getPublicCollectionDiff(
credentials,
sinceTime,
);
if (!diff.length) break;
for (const change of diff) {
sinceTime = Math.max(sinceTime, change.updationTime);
if (change.isDeleted) {
filesByID.delete(change.id);
} else {
filesByID.set(
change.id,
await decryptRemoteFile(change, collection.key),
);
}
}
const files = [...filesByID.values()];
await savePublicCollectionFiles(accessToken, files);
await savePublicCollectionLastSyncTime(accessToken, sinceTime);
onSetFiles(files);
if (!hasMore) break;
}
};
/**
* Fetch the public collection diff to obtain updates to the collection
* (identified by its {@link credentials}) since {@link sinceTime}.
*
* Remote only, does not modify local state.
*
* @param credentials
* @param number
*/
const getPublicCollectionDiff = async (
credentials: PublicAlbumsCredentials,
sinceTime: number,
) => {
const res = await fetch(
await apiURL("/public-collection/diff", { sinceTime }),
{ headers: authenticatedPublicAlbumsRequestHeaders(credentials) },
);
ensureOk(res);
return FileDiffResponse.parse(await res.json());
};