import { z } from "zod"; // Base64 length of the 18 MiB transport limit documented for CSV uploads // (18 * 1024 * 1024 bytes, evenly divisible by 3, so ceil(N/3)*4 with no // padding). Keep in sync with the controller's raw byte-length check. export const MAX_CSV_CONTENT_BASE64_LENGTH = 25_165_824; export const updateExternalCsvConfigurationSchema = z .object({ expectedRevision: z.number().int().nonnegative(), configuration: z.unknown(), }) .strict(); export const previewExternalCsvSchema = z .object({ fileName: z.string().trim().min(1).max(255), contentBase64: z.string().min(1).max(MAX_CSV_CONTENT_BASE64_LENGTH), }) .strict(); export const planExternalInitialImportSchema = previewExternalCsvSchema; export const applyExternalInitialImportSchema = z.object({ expectedRevision: z.number().int().nonnegative(), expectedConfigurationVersion: z.number().int().positive(), expectedSha256: z.string().regex(/^[a-f0-9]{64}$/), fileName: z.string().trim().min(1).max(255), contentBase64: z.string().min(1).max(MAX_CSV_CONTENT_BASE64_LENGTH), sourceName: z.string().trim().min(1).max(200), roomDecisions: z.array(z.object({ sourceRoomKey: z.string().trim().min(1), roomId: z.string().trim().min(1).nullable(), defaultDistributionBoardId: z.string().trim().min(1).nullable(), }).strict()), familyProjectDeviceDecisions: z.array(z.object({ familyAndType: z.string(), projectDeviceId: z.string().trim().min(1).nullable(), }).strict()), }).strict();