mirror of
https://github.com/kmc7468/arkvault.git
synced 2025-12-16 15:08:46 +00:00
카테고리 목록에서 파일 목록을 재귀적으로 표시할 수 있는 기능 구현
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { sql } from "kysely";
|
||||
import pg from "pg";
|
||||
import { IntegrityError } from "./error";
|
||||
import db from "./kysely";
|
||||
@@ -290,34 +291,37 @@ export const getAllFilesByParent = async (userId: number, parentId: DirectoryId)
|
||||
);
|
||||
};
|
||||
|
||||
export const getAllFilesByCategory = async (userId: number, categoryId: number) => {
|
||||
export const getAllFilesByCategory = async (
|
||||
userId: number,
|
||||
categoryId: number,
|
||||
recursive: boolean,
|
||||
) => {
|
||||
const files = await db
|
||||
.selectFrom("file")
|
||||
.innerJoin("file_category", "file.id", "file_category.file_id")
|
||||
.selectAll("file")
|
||||
.where("user_id", "=", userId)
|
||||
.where("category_id", "=", categoryId)
|
||||
.withRecursive("cte", (db) =>
|
||||
db
|
||||
.selectFrom("file")
|
||||
.innerJoin("file_category", "file.id", "file_category.file_id")
|
||||
.selectAll("file_category")
|
||||
.select(sql<number>`0`.as("depth"))
|
||||
.where("user_id", "=", userId)
|
||||
.where("category_id", "=", categoryId)
|
||||
.$if(recursive, (qb) =>
|
||||
qb.unionAll((db) =>
|
||||
db
|
||||
.selectFrom("file")
|
||||
.innerJoin("file_category", "file.id", "file_category.file_id")
|
||||
.innerJoin("category", "file_category.category_id", "category.id")
|
||||
.innerJoin("cte", "category.parent_id", "cte.category_id")
|
||||
.selectAll("file_category")
|
||||
.select(sql<number>`cte.depth + 1`.as("depth"))
|
||||
.where("file.user_id", "=", userId),
|
||||
),
|
||||
),
|
||||
)
|
||||
.selectFrom("cte")
|
||||
.select(["file_id", "depth"])
|
||||
.execute();
|
||||
return files.map(
|
||||
(file) =>
|
||||
({
|
||||
id: file.id,
|
||||
parentId: file.parent_id ?? "root",
|
||||
userId: file.user_id,
|
||||
path: file.path,
|
||||
mekVersion: file.master_encryption_key_version,
|
||||
encDek: file.encrypted_data_encryption_key,
|
||||
dekVersion: file.data_encryption_key_version,
|
||||
hskVersion: file.hmac_secret_key_version,
|
||||
contentHmac: file.content_hmac,
|
||||
contentType: file.content_type,
|
||||
encContentIv: file.encrypted_content_iv,
|
||||
encContentHash: file.encrypted_content_hash,
|
||||
encName: file.encrypted_name,
|
||||
encCreatedAt: file.encrypted_created_at,
|
||||
encLastModifiedAt: file.encrypted_last_modified_at,
|
||||
}) satisfies File,
|
||||
);
|
||||
return files.map(({ file_id, depth }) => ({ id: file_id, isRecursive: depth > 0 }));
|
||||
};
|
||||
|
||||
export const getAllFileIdsByContentHmac = async (
|
||||
|
||||
@@ -23,7 +23,12 @@ export const categoryFileAddRequest = z.object({
|
||||
export type CategoryFileAddRequest = z.infer<typeof categoryFileAddRequest>;
|
||||
|
||||
export const categoryFileListResponse = z.object({
|
||||
files: z.number().int().positive().array(),
|
||||
files: z.array(
|
||||
z.object({
|
||||
file: z.number().int().positive(),
|
||||
isRecursive: z.boolean(),
|
||||
}),
|
||||
),
|
||||
});
|
||||
export type CategoryFileListResponse = z.infer<typeof categoryFileListResponse>;
|
||||
|
||||
|
||||
@@ -66,14 +66,14 @@ export const addCategoryFile = async (userId: number, categoryId: number, fileId
|
||||
}
|
||||
};
|
||||
|
||||
export const getCategoryFiles = async (userId: number, categoryId: number) => {
|
||||
export const getCategoryFiles = async (userId: number, categoryId: number, recursive: boolean) => {
|
||||
const category = await getCategory(userId, categoryId);
|
||||
if (!category) {
|
||||
error(404, "Invalid category id");
|
||||
}
|
||||
|
||||
const files = await getAllFilesByCategory(userId, categoryId);
|
||||
return { files: files.map(({ id }) => id) };
|
||||
const files = await getAllFilesByCategory(userId, categoryId, recursive);
|
||||
return { files };
|
||||
};
|
||||
|
||||
export const removeCategoryFile = async (userId: number, categoryId: number, fileId: number) => {
|
||||
|
||||
Reference in New Issue
Block a user