From c2362421363fee47892be3451cefd5eb417f5ba2 Mon Sep 17 00:00:00 2001 From: static Date: Sat, 5 Jul 2025 05:54:55 +0900 Subject: [PATCH] =?UTF-8?q?thumbnail=20=ED=85=8C=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=9D=98=20created=5Fat=20=EC=BB=AC=EB=9F=BC=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20updated=5Fat=EC=9C=BC=EB=A1=9C=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 --- src/lib/server/db/media.ts | 8 ++++---- src/lib/server/db/migrations/1738409340-AddThumbnail.ts | 2 +- src/lib/server/db/schema/media.ts | 2 +- src/lib/server/schemas/file.ts | 1 + src/lib/server/services/file.ts | 2 +- src/routes/api/file/[id]/thumbnail/+server.ts | 7 +++++-- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/lib/server/db/media.ts b/src/lib/server/db/media.ts index 1f1e065..fbd8976 100644 --- a/src/lib/server/db/media.ts +++ b/src/lib/server/db/media.ts @@ -5,7 +5,7 @@ import db from "./kysely"; interface Thumbnail { id: number; path: string; - createdAt: Date; + updatedAt: Date; encContentIv: string; } @@ -49,13 +49,13 @@ export const updateFileThumbnail = async ( .values({ file_id: fileId, path, - created_at: now, + updated_at: now, encrypted_content_iv: encContentIv, }) .onConflict((oc) => oc.column("file_id").doUpdateSet({ path, - created_at: now, + updated_at: now, encrypted_content_iv: encContentIv, }), ) @@ -80,7 +80,7 @@ export const getFileThumbnail = async (userId: number, fileId: number) => { fileId: thumbnail.file_id, path: thumbnail.path, encContentIv: thumbnail.encrypted_content_iv, - createdAt: thumbnail.created_at, + updatedAt: thumbnail.updated_at, } satisfies FileThumbnail) : null; }; diff --git a/src/lib/server/db/migrations/1738409340-AddThumbnail.ts b/src/lib/server/db/migrations/1738409340-AddThumbnail.ts index 0e38647..c3ce806 100644 --- a/src/lib/server/db/migrations/1738409340-AddThumbnail.ts +++ b/src/lib/server/db/migrations/1738409340-AddThumbnail.ts @@ -16,7 +16,7 @@ export const up = async (db: Kysely) => { col.references("category.id").onDelete("cascade").unique(), ) .addColumn("path", "text", (col) => col.unique().notNull()) - .addColumn("created_at", "timestamp(3)", (col) => col.notNull()) + .addColumn("updated_at", "timestamp(3)", (col) => col.notNull()) .addColumn("encrypted_content_iv", "text", (col) => col.notNull()) .addCheckConstraint( "thumbnail_ck01", diff --git a/src/lib/server/db/schema/media.ts b/src/lib/server/db/schema/media.ts index ad593b4..ebfbf29 100644 --- a/src/lib/server/db/schema/media.ts +++ b/src/lib/server/db/schema/media.ts @@ -6,7 +6,7 @@ interface ThumbnailTable { file_id: number | null; category_id: number | null; path: string; - created_at: Date; + updated_at: Date; encrypted_content_iv: string; // Base64 } diff --git a/src/lib/server/schemas/file.ts b/src/lib/server/schemas/file.ts index 4cf140f..1d7ccb5 100644 --- a/src/lib/server/schemas/file.ts +++ b/src/lib/server/schemas/file.ts @@ -31,6 +31,7 @@ export const fileRenameRequest = z.object({ export type FileRenameRequest = z.infer; export const fileThumbnailInfoResponse = z.object({ + updatedAt: z.string().datetime(), encContentIv: z.string().base64().nonempty(), }); export type FileThumbnailInfoResponse = z.infer; diff --git a/src/lib/server/services/file.ts b/src/lib/server/services/file.ts index 83e5750..7616739 100644 --- a/src/lib/server/services/file.ts +++ b/src/lib/server/services/file.ts @@ -92,7 +92,7 @@ export const getFileThumbnailInformation = async (userId: number, fileId: number error(404, "File or its thumbnail not found"); } - return { encContentIv: thumbnail.encContentIv }; + return { updatedAt: thumbnail.updatedAt, encContentIv: thumbnail.encContentIv }; }; export const getFileThumbnailStream = async (userId: number, fileId: number) => { diff --git a/src/routes/api/file/[id]/thumbnail/+server.ts b/src/routes/api/file/[id]/thumbnail/+server.ts index ab9d48c..7bc81ca 100644 --- a/src/routes/api/file/[id]/thumbnail/+server.ts +++ b/src/routes/api/file/[id]/thumbnail/+server.ts @@ -16,8 +16,11 @@ export const GET: RequestHandler = async ({ locals, params }) => { if (!zodRes.success) error(400, "Invalid path parameters"); const { id } = zodRes.data; - const { encContentIv } = await getFileThumbnailInformation(userId, id); + const { updatedAt, encContentIv } = await getFileThumbnailInformation(userId, id); return json( - fileThumbnailInfoResponse.parse({ encContentIv } satisfies FileThumbnailInfoResponse), + fileThumbnailInfoResponse.parse({ + updatedAt: updatedAt.toISOString(), + encContentIv, + } satisfies FileThumbnailInfoResponse), ); };