Files
arkvault/src/trpc/routers/directory.ts
T

86 lines
2.1 KiB
TypeScript

import { z } from "zod";
import { DirectoryService } from "#lib/server/services/index.js";
import { toDirectoryDto, toFileDto } from "#trpc/dto.js";
import { router, roleProcedure } from "#trpc/init.server.js";
import {
Base64Schema,
DirectoryIdSchema,
EncryptedNameSchema,
IdSchema,
toCiphertext,
} from "#trpc/schemas.js";
const directoryRouter = router({
get: roleProcedure["activeClient"]
.input(
z.object({
id: DirectoryIdSchema,
}),
)
.query(async ({ ctx, input }) => {
const { directory, subDirectories, files } = await DirectoryService.getDirectory(
ctx.session.userId,
input.id,
);
return {
metadata: directory && toDirectoryDto(directory),
subDirectories: subDirectories.map(toDirectoryDto),
files: files.map(toFileDto),
};
}),
create: roleProcedure["activeClient"]
.input(
z.object({
parent: DirectoryIdSchema,
mekVersion: IdSchema,
dek: Base64Schema,
dekVersion: z.date(),
...EncryptedNameSchema,
}),
)
.mutation(async ({ ctx, input }) => {
await DirectoryService.createDirectory({
userId: ctx.session.userId,
parentId: input.parent,
mekVersion: input.mekVersion,
encDek: input.dek,
dekVersion: input.dekVersion,
encName: toCiphertext(input.name, input.nameIv),
});
}),
rename: roleProcedure["activeClient"]
.input(
z.object({
id: IdSchema,
dekVersion: z.date(),
...EncryptedNameSchema,
}),
)
.mutation(async ({ ctx, input }) => {
await DirectoryService.renameDirectory(
ctx.session.userId,
input.id,
input.dekVersion,
toCiphertext(input.name, input.nameIv),
);
}),
delete: roleProcedure["activeClient"]
.input(
z.object({
id: IdSchema,
}),
)
.mutation(async ({ ctx, input }) => {
const { deletedFileIds } = await DirectoryService.deleteDirectory(
ctx.session.userId,
input.id,
);
return { deletedFiles: deletedFileIds };
}),
});
export default directoryRouter;