mirror of
https://github.com/kmc7468/arkvault.git
synced 2026-11-04 08:10:28 +09:00
47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import {
|
|
getDirectoryInfo,
|
|
getFileInfo,
|
|
isExistingFileInfo,
|
|
isLocalDirectoryInfo,
|
|
type FileInfo,
|
|
type LocalCategoryInfo,
|
|
type LocalDirectoryInfo,
|
|
} from "#lib/features/filesystem/index.ts";
|
|
import { trpc } from "#trpc/client.ts";
|
|
|
|
export interface SearchFilter {
|
|
ancestorId: DirectoryId;
|
|
inFavorites: boolean;
|
|
categories: { info: LocalCategoryInfo; type: "include" | "exclude" }[];
|
|
}
|
|
|
|
export interface SearchResult {
|
|
directories: LocalDirectoryInfo[];
|
|
files: FileInfo[];
|
|
}
|
|
|
|
const getCategoryIds = (filter: SearchFilter, type: "include" | "exclude") => {
|
|
return filter.categories.filter((category) => category.type === type).map(({ info }) => info.id);
|
|
};
|
|
|
|
export const search = async (filter: SearchFilter) => {
|
|
const { directories: directoriesRaw, files: filesRaw } = await trpc.search.search.query({
|
|
ancestor: filter.ancestorId,
|
|
inFavorites: filter.inFavorites,
|
|
includeCategories: getCategoryIds(filter, "include"),
|
|
excludeCategories: getCategoryIds(filter, "exclude"),
|
|
});
|
|
const [directories, files] = await Promise.all([
|
|
Promise.all(
|
|
directoriesRaw.map((directory) =>
|
|
getDirectoryInfo(directory.id, { serverResponse: directory }),
|
|
),
|
|
),
|
|
Promise.all(filesRaw.map((file) => getFileInfo(file.id, { serverResponse: file }))),
|
|
]);
|
|
return {
|
|
directories: directories.filter(isLocalDirectoryInfo),
|
|
files: files.filter(isExistingFileInfo),
|
|
} satisfies SearchResult;
|
|
};
|