From bcb57bb12d41ad2052c7cf56ae8ee57eace27086 Mon Sep 17 00:00:00 2001 From: static Date: Sun, 18 Jan 2026 11:33:30 +0900 Subject: [PATCH] =?UTF-8?q?IndexedDB=EC=97=90=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=95=AD?= =?UTF-8?q?=EC=83=81=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../atoms/buttons/FileThumbnailButton.svelte | 4 ++-- .../labels/DirectoryEntryLabel.svelte | 2 +- src/lib/indexedDB/filesystem.ts | 21 +++++++++++++++++-- src/lib/modules/filesystem/category.ts | 2 +- src/lib/modules/filesystem/directory.ts | 2 ++ src/lib/modules/filesystem/file.ts | 4 ++-- src/lib/modules/filesystem/types.ts | 6 +++--- .../db/migrations/1768643000-AddFavorites.ts | 2 +- src/lib/types/utils.d.ts | 1 + .../settings/migration/service.svelte.ts | 1 + .../settings/thumbnail/service.ts | 1 + src/trpc/routers/file.ts | 2 ++ 12 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 src/lib/types/utils.d.ts diff --git a/src/lib/components/atoms/buttons/FileThumbnailButton.svelte b/src/lib/components/atoms/buttons/FileThumbnailButton.svelte index e95d07c..7c112d5 100644 --- a/src/lib/components/atoms/buttons/FileThumbnailButton.svelte +++ b/src/lib/components/atoms/buttons/FileThumbnailButton.svelte @@ -24,10 +24,10 @@
{/if} {#if info.isFavorite} -
+
{/if} diff --git a/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte b/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte index 001631b..049fb1f 100644 --- a/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte +++ b/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte @@ -43,7 +43,7 @@
{/if} diff --git a/src/lib/indexedDB/filesystem.ts b/src/lib/indexedDB/filesystem.ts index d5c3e4d..daaf100 100644 --- a/src/lib/indexedDB/filesystem.ts +++ b/src/lib/indexedDB/filesystem.ts @@ -4,7 +4,7 @@ interface DirectoryInfo { id: number; parentId: DirectoryId; name: string; - isFavorite?: boolean; + isFavorite: boolean; } interface FileInfo { @@ -15,7 +15,7 @@ interface FileInfo { createdAt?: Date; lastModifiedAt: Date; categoryIds?: number[]; - isFavorite?: boolean; + isFavorite: boolean; } interface CategoryInfo { @@ -48,6 +48,23 @@ filesystem }); }); +filesystem.version(4).upgrade(async (trx) => { + await Promise.all([ + trx + .table("directory") + .toCollection() + .modify((directory) => { + directory.isFavorite = false; + }), + trx + .table("file") + .toCollection() + .modify((file) => { + file.isFavorite = false; + }), + ]); +}); + export const getDirectoryInfos = async (parentId: DirectoryId) => { return await filesystem.directory.where({ parentId }).toArray(); }; diff --git a/src/lib/modules/filesystem/category.ts b/src/lib/modules/filesystem/category.ts index db0ec45..041dbb1 100644 --- a/src/lib/modules/filesystem/category.ts +++ b/src/lib/modules/filesystem/category.ts @@ -66,8 +66,8 @@ const cache = new FilesystemCache({ id: file.id, parentId: file.parent, contentType: file.contentType, - isRecursive: file.isRecursive, isFavorite: file.isFavorite, + isRecursive: file.isRecursive, ...(await decryptFileMetadata(file, masterKey)), })), ), diff --git a/src/lib/modules/filesystem/directory.ts b/src/lib/modules/filesystem/directory.ts index 361b3c5..5626e31 100644 --- a/src/lib/modules/filesystem/directory.ts +++ b/src/lib/modules/filesystem/directory.ts @@ -27,6 +27,7 @@ const cache = new FilesystemCache({ name: directory.name, subDirectories, files, + isFavorite: directory.isFavorite, }; } }, @@ -62,6 +63,7 @@ const cache = new FilesystemCache({ parentId: directory.metadata!.parent, subDirectories, files, + isFavorite: directory.metadata!.isFavorite, ...metadata!, } : { id, subDirectories, files }, diff --git a/src/lib/modules/filesystem/file.ts b/src/lib/modules/filesystem/file.ts index 2517c02..3298f31 100644 --- a/src/lib/modules/filesystem/file.ts +++ b/src/lib/modules/filesystem/file.ts @@ -27,8 +27,8 @@ const cache = new FilesystemCache({ name: file.name, createdAt: file.createdAt, lastModifiedAt: file.lastModifiedAt, - isFavorite: file.isFavorite, categories: categories?.filter((category) => !!category) ?? [], + isFavorite: file.isFavorite, }; } }, @@ -56,8 +56,8 @@ const cache = new FilesystemCache({ name: metadata.name, createdAt: metadata.createdAt, lastModifiedAt: metadata.lastModifiedAt, - isFavorite: file.isFavorite, categories, + isFavorite: file.isFavorite, }); } catch (e) { if (isTRPCClientError(e) && e.data?.code === "NOT_FOUND") { diff --git a/src/lib/modules/filesystem/types.ts b/src/lib/modules/filesystem/types.ts index f2bfbe6..254d4c7 100644 --- a/src/lib/modules/filesystem/types.ts +++ b/src/lib/modules/filesystem/types.ts @@ -1,14 +1,13 @@ export type DataKey = { key: CryptoKey; version: Date }; -type AllUndefined = { [K in keyof T]?: undefined }; export interface LocalDirectoryInfo { id: number; parentId: DirectoryId; dataKey?: DataKey; name: string; - isFavorite?: boolean; subDirectories: SubDirectoryInfo[]; files: SummarizedFileInfo[]; + isFavorite: boolean; } export interface RootDirectoryInfo { @@ -18,6 +17,7 @@ export interface RootDirectoryInfo { name?: undefined; subDirectories: SubDirectoryInfo[]; files: SummarizedFileInfo[]; + isFavorite?: undefined; } export type DirectoryInfo = LocalDirectoryInfo | RootDirectoryInfo; @@ -37,7 +37,7 @@ export interface FileInfo { createdAt?: Date; lastModifiedAt: Date; categories: FileCategoryInfo[]; - isFavorite?: boolean; + isFavorite: boolean; } export type MaybeFileInfo = diff --git a/src/lib/server/db/migrations/1768643000-AddFavorites.ts b/src/lib/server/db/migrations/1768643000-AddFavorites.ts index d18cce0..660e116 100644 --- a/src/lib/server/db/migrations/1768643000-AddFavorites.ts +++ b/src/lib/server/db/migrations/1768643000-AddFavorites.ts @@ -1,4 +1,4 @@ -import { Kysely, sql } from "kysely"; +import { Kysely } from "kysely"; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const up = async (db: Kysely) => { diff --git a/src/lib/types/utils.d.ts b/src/lib/types/utils.d.ts new file mode 100644 index 0000000..498b8ae --- /dev/null +++ b/src/lib/types/utils.d.ts @@ -0,0 +1 @@ +type AllUndefined = { [K in keyof T]?: undefined }; diff --git a/src/routes/(fullscreen)/settings/migration/service.svelte.ts b/src/routes/(fullscreen)/settings/migration/service.svelte.ts index 9f1f7eb..a304e38 100644 --- a/src/routes/(fullscreen)/settings/migration/service.svelte.ts +++ b/src/routes/(fullscreen)/settings/migration/service.svelte.ts @@ -48,6 +48,7 @@ export const requestLegacyFiles = async ( isLegacy: file.isLegacy, parentId: file.parent, contentType: file.contentType, + isFavorite: file.isFavorite, ...metadata, }; }, diff --git a/src/routes/(fullscreen)/settings/thumbnail/service.ts b/src/routes/(fullscreen)/settings/thumbnail/service.ts index ce06b78..11ef262 100644 --- a/src/routes/(fullscreen)/settings/thumbnail/service.ts +++ b/src/routes/(fullscreen)/settings/thumbnail/service.ts @@ -53,6 +53,7 @@ export const requestMissingThumbnailFiles = async ( isLegacy: file.isLegacy, parentId: file.parent, contentType: file.contentType, + isFavorite: file.isFavorite, ...metadata, }; }, diff --git a/src/trpc/routers/file.ts b/src/trpc/routers/file.ts index ad06cdc..30aaacd 100644 --- a/src/trpc/routers/file.ts +++ b/src/trpc/routers/file.ts @@ -114,6 +114,7 @@ const fileRouter = router({ createdAtIv: file.encCreatedAt?.iv, lastModifiedAt: file.encLastModifiedAt.ciphertext, lastModifiedAtIv: file.encLastModifiedAt.iv, + isFavorite: file.isFavorite, })); }), @@ -133,6 +134,7 @@ const fileRouter = router({ createdAtIv: file.encCreatedAt?.iv, lastModifiedAt: file.encLastModifiedAt.ciphertext, lastModifiedAtIv: file.encLastModifiedAt.iv, + isFavorite: file.isFavorite, })); }),