diff --git a/src/lib/indexedDB/filesystem.ts b/src/lib/indexedDB/filesystem.ts index 7be44c7..c78ce4d 100644 --- a/src/lib/indexedDB/filesystem.ts +++ b/src/lib/indexedDB/filesystem.ts @@ -62,6 +62,16 @@ export const deleteDirectoryInfo = async (id: number) => { await filesystem.directory.delete(id); }; +export const deleteDanglingDirectoryInfos = async ( + parentId: DirectoryId, + validIds: Set, +) => { + await filesystem.directory + .where({ parentId }) + .and((directory) => !validIds.has(directory.id)) + .delete(); +}; + export const getAllFileInfos = async () => { return await filesystem.file.toArray(); }; @@ -86,6 +96,13 @@ export const deleteFileInfo = async (id: number) => { await filesystem.file.delete(id); }; +export const deleteDanglingFileInfos = async (parentId: DirectoryId, validIds: Set) => { + await filesystem.file + .where({ parentId }) + .and((file) => !validIds.has(file.id)) + .delete(); +}; + export const getCategoryInfos = async (parentId: CategoryId) => { return await filesystem.category.where({ parentId }).toArray(); }; @@ -106,6 +123,13 @@ export const deleteCategoryInfo = async (id: number) => { await filesystem.category.delete(id); }; +export const deleteDanglingCategoryInfos = async (parentId: CategoryId, validIds: Set) => { + await filesystem.category + .where({ parentId }) + .and((category) => !validIds.has(category.id)) + .delete(); +}; + export const cleanupDanglingInfos = async () => { const validDirectoryIds: number[] = []; const validFileIds: number[] = []; diff --git a/src/lib/modules/filesystem/category.ts b/src/lib/modules/filesystem/category.ts index dc25506..2ca3472 100644 --- a/src/lib/modules/filesystem/category.ts +++ b/src/lib/modules/filesystem/category.ts @@ -53,6 +53,9 @@ const fetchFromServer = async (id: CategoryId, masterKey: CryptoKey) => { subCategories: subCategoriesRaw, files: filesRaw, } = await trpc().category.get.query({ id, recurse: true }); + + void IndexedDB.deleteDanglingCategoryInfos(id, new Set(subCategoriesRaw.map(({ id }) => id))); + const subCategories = await Promise.all( subCategoriesRaw.map(async (category) => { const decrypted = await decryptCategoryMetadata(category, masterKey); diff --git a/src/lib/modules/filesystem/directory.ts b/src/lib/modules/filesystem/directory.ts index 6449480..8932698 100644 --- a/src/lib/modules/filesystem/directory.ts +++ b/src/lib/modules/filesystem/directory.ts @@ -39,6 +39,10 @@ const fetchFromServer = async (id: DirectoryId, masterKey: CryptoKey) => { subDirectories: subDirectoriesRaw, files: filesRaw, } = await trpc().directory.get.query({ id }); + + void IndexedDB.deleteDanglingDirectoryInfos(id, new Set(subDirectoriesRaw.map(({ id }) => id))); + void IndexedDB.deleteDanglingFileInfos(id, new Set(filesRaw.map(({ id }) => id))); + const existingFiles = await IndexedDB.bulkGetFileInfos(filesRaw.map((file) => file.id)); const [subDirectories, files, decryptedMetadata] = await Promise.all([ Promise.all(