mirror of
https://github.com/kmc7468/arkvault.git
synced 2026-02-04 08:06:56 +00:00
DB에 동시적으로 접근하더라도 데이터 무결성이 깨지지 않도록 DB 접근 코드 수정
This commit is contained in:
@@ -1,44 +1,15 @@
|
||||
import { error } from "@sveltejs/kit";
|
||||
import { unlink } from "fs/promises";
|
||||
import { IntegrityError } from "$lib/server/db/error";
|
||||
import {
|
||||
registerDirectory,
|
||||
getAllDirectoriesByParent,
|
||||
registerNewDirectory,
|
||||
getDirectory,
|
||||
setDirectoryEncName,
|
||||
unregisterDirectory,
|
||||
getAllFilesByParent,
|
||||
type NewDirectoryParams,
|
||||
} from "$lib/server/db/file";
|
||||
import { getActiveMekVersion } from "$lib/server/db/mek";
|
||||
|
||||
export const deleteDirectory = async (userId: number, directoryId: number) => {
|
||||
const directory = await getDirectory(userId, directoryId);
|
||||
if (!directory) {
|
||||
error(404, "Invalid directory id");
|
||||
}
|
||||
|
||||
const filePaths = await unregisterDirectory(userId, directoryId);
|
||||
filePaths.map((path) => unlink(path)); // Intended
|
||||
};
|
||||
|
||||
export const renameDirectory = async (
|
||||
userId: number,
|
||||
directoryId: number,
|
||||
dekVersion: Date,
|
||||
newEncName: string,
|
||||
newEncNameIv: string,
|
||||
) => {
|
||||
const directory = await getDirectory(userId, directoryId);
|
||||
if (!directory) {
|
||||
error(404, "Invalid directory id");
|
||||
} else if (directory.dekVersion.getTime() !== dekVersion.getTime()) {
|
||||
error(400, "Invalid DEK version");
|
||||
}
|
||||
|
||||
if (!(await setDirectoryEncName(userId, directoryId, dekVersion, newEncName, newEncNameIv))) {
|
||||
error(500, "Invalid directory id or DEK version");
|
||||
}
|
||||
};
|
||||
|
||||
export const getDirectoryInformation = async (userId: number, directoryId: "root" | number) => {
|
||||
const directory = directoryId !== "root" ? await getDirectory(userId, directoryId) : undefined;
|
||||
@@ -62,19 +33,52 @@ export const getDirectoryInformation = async (userId: number, directoryId: "root
|
||||
};
|
||||
};
|
||||
|
||||
export const createDirectory = async (params: NewDirectoryParams) => {
|
||||
const activeMekVersion = await getActiveMekVersion(params.userId);
|
||||
if (activeMekVersion === null) {
|
||||
error(500, "Invalid MEK version");
|
||||
} else if (activeMekVersion !== params.mekVersion) {
|
||||
error(400, "Invalid MEK version");
|
||||
export const deleteDirectory = async (userId: number, directoryId: number) => {
|
||||
try {
|
||||
const filePaths = await unregisterDirectory(userId, directoryId);
|
||||
filePaths.map((path) => unlink(path)); // Intended
|
||||
} catch (e) {
|
||||
if (e instanceof IntegrityError && e.message === "Directory not found") {
|
||||
error(404, "Invalid directory id");
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
export const renameDirectory = async (
|
||||
userId: number,
|
||||
directoryId: number,
|
||||
dekVersion: Date,
|
||||
newEncName: string,
|
||||
newEncNameIv: string,
|
||||
) => {
|
||||
try {
|
||||
await setDirectoryEncName(userId, directoryId, dekVersion, newEncName, newEncNameIv);
|
||||
} catch (e) {
|
||||
if (e instanceof IntegrityError) {
|
||||
if (e.message === "Directory not found") {
|
||||
error(404, "Invalid directory id");
|
||||
} else if (e.message === "Invalid DEK version") {
|
||||
error(400, "Invalid DEK version");
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
export const createDirectory = async (params: NewDirectoryParams) => {
|
||||
const oneMinuteAgo = new Date(Date.now() - 60 * 1000);
|
||||
const oneMinuteLater = new Date(Date.now() + 60 * 1000);
|
||||
if (params.dekVersion <= oneMinuteAgo || params.dekVersion >= oneMinuteLater) {
|
||||
error(400, "Invalid DEK version");
|
||||
}
|
||||
|
||||
await registerNewDirectory(params);
|
||||
try {
|
||||
await registerDirectory(params);
|
||||
} catch (e) {
|
||||
if (e instanceof IntegrityError && e.message === "Inactive MEK version") {
|
||||
error(400, "Invalid MEK version");
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user