From 30c56e09267a956a32fa60ecf05c3b69e0585484 Mon Sep 17 00:00:00 2001 From: static Date: Sat, 3 Jan 2026 00:54:32 +0900 Subject: [PATCH] =?UTF-8?q?=EC=82=AD=EC=A0=9C=EB=90=9C=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC,=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC,=20=EB=94=94?= =?UTF-8?q?=EB=A0=89=ED=84=B0=EB=A6=AC=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EA=B0=80=20IndexedDB=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/indexedDB/filesystem.ts | 24 ++++++++++++++++++++++++ src/lib/modules/filesystem/category.ts | 3 +++ src/lib/modules/filesystem/directory.ts | 4 ++++ 3 files changed, 31 insertions(+) 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(