1
7
8import { z } from "zod";
9
10
11export const shareScopeSchema = z.enum(["private", "workspace", "team", "users", "public"]);
12export type ShareScope = z.infer<typeof shareScopeSchema>;
13
14const isoDate = z
15 .string()
16 .refine((s) => Number.isFinite(Date.parse(s)), { message: "invalid ISO date" });
17
18export const createShareSchema = z
19 .object({
20 scope: shareScopeSchema,
21
22 userIds: z.array(z.string().min(1)).min(1).max(100).optional(),
23
24 teamId: z.string().min(1).optional(),
25 allowComments: z.boolean().default(true),
26 allowDuplicate: z.boolean().default(false),
27 allowSearchIndexing: z.boolean().default(false),
28
29 password: z.string().min(4).max(128).optional(),
30
31 expiresAt: isoDate.optional(),
32 })
33 .strict()
34 .superRefine((val, ctx) => {
35 if (val.scope === "users" && (!val.userIds || val.userIds.length === 0)) {
36 ctx.addIssue({
37 code: z.ZodIssueCode.custom,
38 message: "scope 'users' requires userIds",
39 path: ["userIds"],
40 });
41 }
42 if (val.scope === "team" && !val.teamId) {
43 ctx.addIssue({
44 code: z.ZodIssueCode.custom,
45 message: "scope 'team' requires teamId",
46 path: ["teamId"],
47 });
48 }
49 if (val.password && val.scope !== "public") {
50 ctx.addIssue({
51 code: z.ZodIssueCode.custom,
52 message: "password is only supported for public shares",
53 path: ["password"],
54 });
55 }
56 });
57export type CreateShare = z.infer<typeof createShareSchema>;
58
59export const updateShareSchema = z
60 .object({
61 scope: shareScopeSchema.optional(),
62 userIds: z.array(z.string().min(1)).min(1).max(100).optional(),
63 teamId: z.string().min(1).nullable().optional(),
64 allowComments: z.boolean().optional(),
65 allowDuplicate: z.boolean().optional(),
66 allowSearchIndexing: z.boolean().optional(),
67 password: z.string().min(4).max(128).nullable().optional(),
68 expiresAt: isoDate.nullable().optional(),
69 })
70 .strict()
71 .refine((v) => Object.keys(v).length > 0, { message: "No fields to update" });
72export type UpdateShare = z.infer<typeof updateShareSchema>;
73