Date 관련 Zod 스키마 수정

z.coerce.date()가 아닌 z.string().datetime()을 사용하도록 변경하여, 번거롭더라도 버그를 줄일 수 있는 방향으로 수정하였습니다.
This commit is contained in:
static
2025-01-08 22:08:20 +09:00
parent 5f6894d953
commit d7396945df
10 changed files with 34 additions and 34 deletions

View File

@@ -26,7 +26,7 @@ const fetchDirectoryInfo = async (directoryId: "root" | number, masterKey: Crypt
newInfo = {
id: directoryId,
dataKey,
dataKeyVersion: metadata!.dekVersion,
dataKeyVersion: new Date(metadata!.dekVersion),
name: await decryptString(metadata!.name, metadata!.nameIv, dataKey),
subDirectoryIds: subDirectories,
fileIds: files,
@@ -63,7 +63,7 @@ const fetchFileInfo = async (fileId: number, masterKey: CryptoKey) => {
const newInfo: FileInfo = {
id: fileId,
dataKey,
dataKeyVersion: metadata.dekVersion,
dataKeyVersion: new Date(metadata.dekVersion),
contentType: metadata.contentType,
contentIv: metadata.contentIv,
name: await decryptString(metadata.name, metadata.nameIv, dataKey),

View File

@@ -1,19 +1,12 @@
import { z } from "zod";
export const directoryRenameRequest = z.object({
dekVersion: z.coerce.date(),
name: z.string().base64().nonempty(),
nameIv: z.string().base64().nonempty(),
});
export type DirectoryRenameRequest = z.infer<typeof directoryRenameRequest>;
export const directoryInfoResponse = z.object({
metadata: z
.object({
createdAt: z.date(),
createdAt: z.string().datetime(),
mekVersion: z.number().int().positive(),
dek: z.string().base64().nonempty(),
dekVersion: z.date(),
dekVersion: z.string().datetime(),
name: z.string().base64().nonempty(),
nameIv: z.string().base64().nonempty(),
})
@@ -23,11 +16,18 @@ export const directoryInfoResponse = z.object({
});
export type DirectoryInfoResponse = z.infer<typeof directoryInfoResponse>;
export const directoryRenameRequest = z.object({
dekVersion: z.string().datetime(),
name: z.string().base64().nonempty(),
nameIv: z.string().base64().nonempty(),
});
export type DirectoryRenameRequest = z.infer<typeof directoryRenameRequest>;
export const directoryCreateRequest = z.object({
parentId: z.union([z.enum(["root"]), z.number().int().positive()]),
mekVersion: z.number().int().positive(),
dek: z.string().base64().nonempty(),
dekVersion: z.coerce.date(),
dekVersion: z.string().datetime(),
name: z.string().base64().nonempty(),
nameIv: z.string().base64().nonempty(),
});

View File

@@ -1,18 +1,11 @@
import mime from "mime";
import { z } from "zod";
export const fileRenameRequest = z.object({
dekVersion: z.coerce.date(),
name: z.string().base64().nonempty(),
nameIv: z.string().base64().nonempty(),
});
export type FileRenameRequest = z.infer<typeof fileRenameRequest>;
export const fileInfoResponse = z.object({
createdAt: z.date(),
createdAt: z.string().datetime(),
mekVersion: z.number().int().positive(),
dek: z.string().base64().nonempty(),
dekVersion: z.date(),
dekVersion: z.string().datetime(),
contentType: z
.string()
.nonempty()
@@ -23,11 +16,18 @@ export const fileInfoResponse = z.object({
});
export type FileInfoResponse = z.infer<typeof fileInfoResponse>;
export const fileRenameRequest = z.object({
dekVersion: z.string().datetime(),
name: z.string().base64().nonempty(),
nameIv: z.string().base64().nonempty(),
});
export type FileRenameRequest = z.infer<typeof fileRenameRequest>;
export const fileUploadRequest = z.object({
parentId: z.union([z.enum(["root"]), z.number().int().positive()]),
mekVersion: z.number().int().positive(),
dek: z.string().base64().nonempty(),
dekVersion: z.coerce.date(),
dekVersion: z.string().datetime(),
contentType: z
.string()
.nonempty()

View File

@@ -33,7 +33,7 @@ export const requestDirectoryCreation = async (
parentId,
mekVersion: masterKey.version,
dek: await wrapDataKey(dataKey, masterKey.key),
dekVersion: dataKeyVersion,
dekVersion: dataKeyVersion.toISOString(),
name: encodeToBase64(nameEncrypted.ciphertext),
nameIv: nameEncrypted.iv,
});
@@ -52,7 +52,7 @@ export const requestFileUpload = (file: File, parentId: "root" | number, masterK
parentId,
mekVersion: masterKey.version,
dek: await wrapDataKey(dataKey, masterKey.key),
dekVersion: dataKeyVersion,
dekVersion: dataKeyVersion.toISOString(),
contentType: file.type,
contentIv: fileEncrypted.iv,
name: nameEncrypted.ciphertext,
@@ -85,13 +85,13 @@ export const requestDirectoryEntryRename = async (
if (entry.type === "directory") {
await callPostApi<DirectoryRenameRequest>(`/api/directory/${entry.id}/rename`, {
dekVersion: entry.dataKeyVersion,
dekVersion: entry.dataKeyVersion.toISOString(),
name: newNameEncrypted.ciphertext,
nameIv: newNameEncrypted.iv,
});
} else {
await callPostApi<FileRenameRequest>(`/api/file/${entry.id}/rename`, {
dekVersion: entry.dataKeyVersion,
dekVersion: entry.dataKeyVersion.toISOString(),
name: newNameEncrypted.ciphertext,
nameIv: newNameEncrypted.iv,
});

View File

@@ -20,10 +20,10 @@ export const GET: RequestHandler = async ({ cookies, params }) => {
return json(
directoryInfoResponse.parse({
metadata: metadata && {
createdAt: metadata.createdAt,
createdAt: metadata.createdAt.toISOString(),
mekVersion: metadata.mekVersion,
dek: metadata.encDek,
dekVersion: metadata.dekVersion,
dekVersion: metadata.dekVersion.toISOString(),
name: metadata.encName.ciphertext,
nameIv: metadata.encName.iv,
},

View File

@@ -20,6 +20,6 @@ export const POST: RequestHandler = async ({ request, cookies, params }) => {
if (!bodyZodRes.success) error(400, "Invalid request body");
const { dekVersion, name, nameIv } = bodyZodRes.data;
await renameDirectory(userId, id, dekVersion, name, nameIv);
await renameDirectory(userId, id, new Date(dekVersion), name, nameIv);
return text("Directory renamed", { headers: { "Content-Type": "text/plain" } });
};

View File

@@ -16,7 +16,7 @@ export const POST: RequestHandler = async ({ request, cookies }) => {
parentId,
mekVersion,
encDek: dek,
dekVersion,
dekVersion: new Date(dekVersion),
encName: name,
encNameIv: nameIv,
});

View File

@@ -20,10 +20,10 @@ export const GET: RequestHandler = async ({ cookies, params }) => {
await getFileInformation(userId, id);
return json(
fileInfoResponse.parse({
createdAt,
createdAt: createdAt.toISOString(),
mekVersion,
dek: encDek,
dekVersion,
dekVersion: dekVersion.toISOString(),
contentType: contentType,
contentIv: encContentIv,
name: encName.ciphertext,

View File

@@ -20,6 +20,6 @@ export const POST: RequestHandler = async ({ request, cookies, params }) => {
if (!bodyZodRes.success) error(400, "Invalid request body");
const { dekVersion, name, nameIv } = bodyZodRes.data;
await renameFile(userId, id, dekVersion, name, nameIv);
await renameFile(userId, id, new Date(dekVersion), name, nameIv);
return text("File renamed", { headers: { "Content-Type": "text/plain" } });
};

View File

@@ -25,7 +25,7 @@ export const POST: RequestHandler = async ({ request, cookies }) => {
parentId,
mekVersion,
encDek: dek,
dekVersion,
dekVersion: new Date(dekVersion),
contentType,
encContentIv: contentIv,
encName: name,