Files
documenso/packages/trpc/server/folder-router/schema.ts
Lucas Smith 68a3608aee fix: handle bracket notation arrays (#2178)
Co-authored-by: David Nguyen <davidngu28@gmail.com>
2025-11-12 16:38:06 +11:00

110 lines
3.3 KiB
TypeScript

import { z } from 'zod';
import { ZFolderTypeSchema } from '@documenso/lib/types/folder-type';
import { ZFindResultResponse, ZFindSearchParamsSchema } from '@documenso/lib/types/search-params';
import { DocumentVisibility } from '@documenso/prisma/generated/types';
import FolderSchema from '@documenso/prisma/generated/zod/modelSchema/FolderSchema';
export const ZFolderSchema = FolderSchema.pick({
id: true,
name: true,
userId: true,
teamId: true,
parentId: true,
pinned: true,
createdAt: true,
updatedAt: true,
visibility: true,
type: true,
});
export type TFolder = z.infer<typeof ZFolderSchema>;
const ZFolderCountSchema = z.object({
documents: z.number(),
templates: z.number(),
subfolders: z.number(),
});
const ZSubfolderSchema = ZFolderSchema.extend({
subfolders: z.array(z.any()),
_count: ZFolderCountSchema,
});
export const ZFolderWithSubfoldersSchema = ZFolderSchema.extend({
subfolders: z.array(ZSubfolderSchema),
_count: ZFolderCountSchema,
});
export type TFolderWithSubfolders = z.infer<typeof ZFolderWithSubfoldersSchema>;
const ZFolderParentIdSchema = z
.string()
.describe(
'The folder ID to place this folder within. Leave empty to place folder at the root level.',
);
export const ZCreateFolderRequestSchema = z.object({
name: z.string(),
parentId: ZFolderParentIdSchema.optional(),
type: ZFolderTypeSchema.optional(),
});
export const ZCreateFolderResponseSchema = ZFolderSchema;
export const ZUpdateFolderRequestSchema = z.object({
folderId: z.string().describe('The ID of the folder to update'),
data: z.object({
name: z.string().optional().describe('The name of the folder'),
parentId: ZFolderParentIdSchema.optional().nullable(),
visibility: z
.nativeEnum(DocumentVisibility)
.optional()
.describe('The visibility of the folder'),
pinned: z.boolean().optional().describe('Whether the folder should be pinned'),
}),
});
export type TUpdateFolderRequestSchema = z.infer<typeof ZUpdateFolderRequestSchema>;
export const ZUpdateFolderResponseSchema = ZFolderSchema;
export const ZDeleteFolderRequestSchema = z.object({
folderId: z.string(),
});
export const ZGetFoldersSchema = z.object({
parentId: z.string().nullable().optional(),
type: ZFolderTypeSchema.optional(),
});
export const ZGetFoldersResponseSchema = z.object({
folders: z.array(ZFolderWithSubfoldersSchema),
breadcrumbs: z.array(ZFolderSchema),
type: ZFolderTypeSchema.optional(),
});
export type TGetFoldersResponse = z.infer<typeof ZGetFoldersResponseSchema>;
export const ZFindFoldersRequestSchema = ZFindSearchParamsSchema.extend({
parentId: z.string().optional().describe('Filter folders by the parent folder ID'),
type: ZFolderTypeSchema.optional().describe('Filter folders by the folder type'),
});
export const ZFindFoldersResponseSchema = ZFindResultResponse.extend({
data: z.array(ZFolderSchema),
});
export const ZFindFoldersInternalRequestSchema = ZFindSearchParamsSchema.extend({
parentId: z.string().nullable().optional(),
type: ZFolderTypeSchema.optional(),
});
export const ZFindFoldersInternalResponseSchema = z.object({
data: z.array(ZFolderWithSubfoldersSchema),
breadcrumbs: z.array(ZFolderSchema),
type: ZFolderTypeSchema.optional(),
});
export type TFindFoldersResponse = z.infer<typeof ZFindFoldersResponseSchema>;