1import { z } from "zod";
2
3export const CreatePageDto = z.object({
4 title: z.string().max(200).default(""),
5
6
7
8
9
10 parentId: z.string().min(1).nullable().optional(),
11
12
13
14 type: z.enum(["page", "database", "whiteboard"]).default("page"),
15 teamId: z.string().min(1).optional(),
16 templateId: z.string().min(1).optional()
17});
18export type CreatePageInput = z.infer<typeof CreatePageDto>;
19
20export const UpdatePageDto = z.object({
21 title: z.string().max(200).optional(),
22 parentId: z.string().nullable().optional(),
23 teamId: z.string().nullable().optional(),
24 archived: z.boolean().optional(),
25 icon: z.string().max(20).nullable().optional(),
26 coverUrl: z.string().url().max(2048).nullable().optional(),
27 description: z.string().max(500).nullable().optional()
28});
29export type UpdatePageInput = z.infer<typeof UpdatePageDto>;
30
31
34const queryBool = (raw: unknown) =>
35 raw === "true" || raw === true || raw === "1" ? true : undefined;
36
37export const ListPagesQuery = z.object({
38 parentId: z.string().nullable().optional(),
39 cursor: z.string().optional(),
40 limit: z.string().optional(),
41
42
43
44
45 trashed: z.preprocess(queryBool, z.boolean().optional()),
46 favorites: z.preprocess(queryBool, z.boolean().optional())
47});
48export type ListPagesInput = z.infer<typeof ListPagesQuery>;
49
50export const CreateTemplateDto = z.object({
51 name: z.string().min(1).max(100),
52 icon: z.string().max(20).optional(),
53
54 category: z.string().min(1).max(50).optional(),
55 description: z.string().max(500).optional(),
56
57 variables: z.array(z.record(z.unknown())).max(50).optional()
58});
59export type CreateTemplateInput = z.infer<typeof CreateTemplateDto>;
60
61export const ApplyTemplateDto = z.object({
62 workspaceId: z.string().min(1).optional(),
63 parentId: z.string().min(1).nullable().optional(),
64 title: z.string().max(200).optional(),
65
66 values: z.record(z.unknown()).optional()
67});
68export type ApplyTemplateInput = z.infer<typeof ApplyTemplateDto>;
69
70
71
72export const DuplicatePageDto = z.object({
73 parentId: z.string().min(1).nullable().optional(),
74 title: z.string().max(200).optional()
75});
76export type DuplicatePageInput = z.infer<typeof DuplicatePageDto>;
77
78
79
80export const MovePageDto = z.object({
81 toWorkspaceId: z.string().min(1),
82 toParentId: z.string().min(1).nullable().optional()
83});
84export type MovePageInput = z.infer<typeof MovePageDto>;
85
86
87
88export const CompareVersionsQuery = z.object({
89 from: z.coerce.number().int().min(1),
90 to: z.coerce.number().int().min(1)
91});
92export type CompareVersionsInput = z.infer<typeof CompareVersionsQuery>;
93
94
95
96export const BulkPagesDto = z.object({
97 action: z.enum(["trash", "archive", "unarchive", "favorite", "unfavorite"]),
98 ids: z.array(z.string().min(1)).min(1).max(200)
99});
100export type BulkPagesInput = z.infer<typeof BulkPagesDto>;
101
102
103
104
112export const ConvertSelectionDto = z.object({
113 elementIds: z.array(z.string().min(1)).min(1).max(100),
114 target: z.enum(["page", "task"]).default("page"),
115 title: z.string().max(200).default(""),
116 parentId: z.string().min(1).nullable().optional()
117});
118export type ConvertSelectionInput = z.infer<typeof ConvertSelectionDto>;
119