1
14import { z } from "zod";
15
16export const OrgPolicySchema = z
17 .object({
18
19 require2FA: z.boolean().default(false),
20
22 ssoEnforced: z.boolean().default(false),
23
24 disableGuestPublicShare: z.boolean().default(false),
25
26 maxFileSizeMB: z.number().int().min(1).max(10240).optional(),
27
29 sessionLifetimeHours: z.number().int().min(1).max(720).optional(),
30
31 allowExternalEmbeds: z.boolean().default(true)
32 })
33 .default({});
34
35export type OrgPolicy = z.infer<typeof OrgPolicySchema>;
36
37
38export const OrgPolicyUpdateSchema = z
39 .object({
40 require2FA: z.boolean().optional(),
41 ssoEnforced: z.boolean().optional(),
42 disableGuestPublicShare: z.boolean().optional(),
43 maxFileSizeMB: z.number().int().min(1).max(10240).nullable().optional(),
44 sessionLifetimeHours: z.number().int().min(1).max(720).nullable().optional(),
45 allowExternalEmbeds: z.boolean().optional()
46 })
47 .refine((v) => Object.keys(v).length > 0, { message: "No policy fields provided" });
48
49export type OrgPolicyUpdate = z.infer<typeof OrgPolicyUpdateSchema>;
50
51
54export function parseStoredPolicy(raw: unknown): OrgPolicy {
55 if (raw === null || raw === undefined) return OrgPolicySchema.parse({});
56 if (typeof raw !== "object") return OrgPolicySchema.parse({});
57
58 const known = Object.fromEntries(
59 Object.entries(raw as Record<string, unknown>).filter(([k]) =>
60 ["require2FA", "ssoEnforced", "disableGuestPublicShare", "maxFileSizeMB", "sessionLifetimeHours", "allowExternalEmbeds"].includes(k)
61 )
62 );
63 return OrgPolicySchema.parse(known);
64}
65