검색 기능 구현

This commit is contained in:
static
2026-01-15 15:11:03 +09:00
parent 96d5397cb5
commit 37bd6a9315
26 changed files with 757 additions and 35 deletions

View File

@@ -9,6 +9,7 @@ import {
fileRouter,
hskRouter,
mekRouter,
searchRouter,
uploadRouter,
userRouter,
} from "./routers";
@@ -21,6 +22,7 @@ export const appRouter = router({
file: fileRouter,
hsk: hskRouter,
mek: mekRouter,
search: searchRouter,
upload: uploadRouter,
user: userRouter,
});

View File

@@ -5,5 +5,6 @@ export { default as directoryRouter } from "./directory";
export { default as fileRouter } from "./file";
export { default as hskRouter } from "./hsk";
export { default as mekRouter } from "./mek";
export { default as searchRouter } from "./search";
export { default as uploadRouter } from "./upload";
export { default as userRouter } from "./user";

View File

@@ -0,0 +1,54 @@
import { z } from "zod";
import { DirectoryIdSchema } from "$lib/schemas";
import { FileRepo } from "$lib/server/db";
import { router, roleProcedure } from "../init.server";
const searchRouter = router({
search: roleProcedure["activeClient"]
.input(
z.object({
ancestor: DirectoryIdSchema.default("root"),
includeCategories: z.number().positive().array().default([]),
excludeCategories: z.number().positive().array().default([]),
}),
)
.query(async ({ ctx, input }) => {
const [directories, files] = await Promise.all([
input.includeCategories.length === 0 && input.excludeCategories.length === 0
? FileRepo.getAllRecursiveDirectoriesByParent(ctx.session.userId, input.ancestor)
: [],
FileRepo.searchFiles(ctx.session.userId, {
parentId: input.ancestor,
includeCategoryIds: input.includeCategories,
excludeCategoryIds: input.excludeCategories,
}),
]);
return {
directories: directories.map((directory) => ({
id: directory.id,
parent: directory.parentId,
mekVersion: directory.mekVersion,
dek: directory.encDek,
dekVersion: directory.dekVersion,
name: directory.encName.ciphertext,
nameIv: directory.encName.iv,
})),
files: files.map((file) => ({
id: file.id,
parent: file.parentId,
mekVersion: file.mekVersion,
dek: file.encDek,
dekVersion: file.dekVersion,
contentType: file.contentType,
name: file.encName.ciphertext,
nameIv: file.encName.iv,
createdAt: file.encCreatedAt?.ciphertext,
createdAtIv: file.encCreatedAt?.iv,
lastModifiedAt: file.encLastModifiedAt.ciphertext,
lastModifiedAtIv: file.encLastModifiedAt.iv,
})),
};
}),
});
export default searchRouter;