파일 업로드에 성공한 경우 캐시에도 파일을 저장하도록 개선

This commit is contained in:
static
2025-01-25 01:16:02 +09:00
parent a01137bbf9
commit cdbe5594f9
8 changed files with 34 additions and 15 deletions

View File

@@ -15,6 +15,7 @@ import type {
DuplicateFileScanRequest,
DuplicateFileScanResponse,
FileUploadRequest,
FileUploadResponse,
} from "$lib/server/schemas";
import {
fileUploadStatusStore,
@@ -131,7 +132,7 @@ const requestFileUpload = limitFunction(
return value;
});
await axios.post("/api/file/upload", form, {
const res = await axios.post("/api/file/upload", form, {
onUploadProgress: ({ progress, rate, estimated }) => {
status.update((value) => {
value.progress = progress;
@@ -141,11 +142,14 @@ const requestFileUpload = limitFunction(
});
},
});
const { file }: FileUploadResponse = res.data;
status.update((value) => {
value.status = "uploaded";
return value;
});
return { fileId: file };
},
{ concurrency: 1 },
);
@@ -156,7 +160,7 @@ export const uploadFile = async (
hmacSecret: HmacSecret,
masterKey: MasterKey,
onDuplicate: () => Promise<boolean>,
) => {
): Promise<{ fileId: number; fileBuffer: ArrayBuffer } | undefined> => {
const status = writable<FileUploadStatus>({
name: file.name,
parentId,
@@ -182,7 +186,7 @@ export const uploadFile = async (
value = value.filter((v) => v !== status);
return value;
});
return false;
return undefined;
}
const {
@@ -219,8 +223,8 @@ export const uploadFile = async (
form.set("content", new Blob([fileEncrypted.ciphertext]));
form.set("checksum", fileEncryptedHash);
await requestFileUpload(status, form);
return true;
const { fileId } = await requestFileUpload(status, form);
return { fileId, fileBuffer };
} catch (e) {
status.update((value) => {
value.status = "error";

View File

@@ -50,7 +50,7 @@ export const createClient = async (encPubKey: string, sigPubKey: string, userId:
.insertInto("user_client")
.values({ user_id: userId, client_id: clientId })
.execute();
return { clientId };
return { id: clientId };
});
};

View File

@@ -203,7 +203,7 @@ export const registerFile = async (params: NewFile) => {
throw new Error("Invalid arguments");
}
await db.transaction().execute(async (trx) => {
return await db.transaction().execute(async (trx) => {
const mek = await trx
.selectFrom("master_encryption_key")
.select("version")
@@ -259,6 +259,7 @@ export const registerFile = async (params: NewFile) => {
new_name: params.encName,
})
.execute();
return { id: fileId };
});
};

View File

@@ -60,3 +60,8 @@ export const fileUploadRequest = z.object({
lastModifiedAtIv: z.string().base64().nonempty(),
});
export type FileUploadRequest = z.infer<typeof fileUploadRequest>;
export const fileUploadResponse = z.object({
file: z.number().int().positive(),
});
export type FileUploadResponse = z.infer<typeof fileUploadResponse>;

View File

@@ -63,7 +63,7 @@ export const registerUserClient = async (
}
try {
const { clientId } = await createClient(encPubKey, sigPubKey, userId);
const { id: clientId } = await createClient(encPubKey, sigPubKey, userId);
return { challenge: await createUserClientChallenge(ip, userId, clientId, encPubKey) };
} catch (e) {
if (e instanceof IntegrityError && e.message === "Public key(s) already registered") {

View File

@@ -131,11 +131,12 @@ export const uploadFile = async (
throw new Error("Invalid checksum");
}
await registerFile({
const { id: fileId } = await registerFile({
...params,
path,
encContentHash: hash,
});
return { fileId };
} catch (e) {
await safeUnlink(path);

View File

@@ -1,7 +1,7 @@
import { callGetApi, callPostApi } from "$lib/hooks";
import { storeHmacSecrets } from "$lib/indexedDB";
import { generateDataKey, wrapDataKey, unwrapHmacSecret, encryptString } from "$lib/modules/crypto";
import { deleteFileCache, uploadFile } from "$lib/modules/file";
import { storeFileCache, deleteFileCache, uploadFile } from "$lib/modules/file";
import type {
DirectoryRenameRequest,
DirectoryCreateRequest,
@@ -63,7 +63,11 @@ export const requestFileUpload = async (
masterKey: MasterKey,
onDuplicate: () => Promise<boolean>,
) => {
return await uploadFile(file, parentId, hmacSecret, masterKey, onDuplicate);
const res = await uploadFile(file, parentId, hmacSecret, masterKey, onDuplicate);
if (!res) return false;
storeFileCache(res.fileId, res.fileBuffer); // Intended
return true;
};
export const requestDirectoryEntryRename = async (

View File

@@ -1,8 +1,12 @@
import Busboy from "@fastify/busboy";
import { error, text } from "@sveltejs/kit";
import { error, json } from "@sveltejs/kit";
import { Readable, Writable } from "stream";
import { authorize } from "$lib/server/modules/auth";
import { fileUploadRequest } from "$lib/server/schemas";
import {
fileUploadRequest,
fileUploadResponse,
type FileUploadResponse,
} from "$lib/server/schemas";
import { uploadFile } from "$lib/server/services/file";
import type { RequestHandler } from "./$types";
@@ -87,8 +91,8 @@ export const POST: RequestHandler = async ({ locals, request }) => {
if (!metadata || content) error(400, "Invalid request body");
content = file;
await uploadFile(metadata, content, checksum);
resolve(text("File uploaded", { headers: { "Content-Type": "text/plain" } }));
const { fileId } = await uploadFile(metadata, content, checksum);
resolve(json(fileUploadResponse.parse({ file: fileId } satisfies FileUploadResponse)));
}),
);
bb.on("finish", () => rejectChecksum(new Error("Invalid request body")));