import { z } from "zod"; export const ErrorResponseSchema = z.object({ error: z.object({ code: z.string(), message: z.string(), }), }); export const HealthResponseSchema = z.object({ ok: z.literal(true), service: z.literal("dab"), }); export const DavScopeSchema = z.enum([ "dav:files:read", "dav:files:write", "dav:caldav:read", "dav:caldav:write", "dav:carddav:read", "dav:carddav:write", ]); export const PatCreateRequestSchema = z.object({ name: z.string().min(1), scopes: z.array(z.string()).min(1), expires_at: z.string().datetime().optional(), }); export const PatPatchRequestSchema = z.object({ name: z.string().min(1).optional(), expires_at: z.string().datetime().nullable().optional(), }); export const PatResponseSchema = z.object({ id: z.string(), name: z.string(), scopes: z.array(DavScopeSchema), created_at: z.string().datetime(), expires_at: z.string().datetime().nullable(), revoked_at: z.string().datetime().nullable().optional(), last_used_at: z.string().datetime().nullable().optional(), }); export const PatCreateResponseSchema = PatResponseSchema.extend({ token: z.string(), }); export const MeResponseSchema = z.object({ subject_id: z.string(), host_label: z.string(), control_plane_host: z.string(), dav_host: z.string(), urls: z.object({ api: z.string().url(), root: z.string().url(), files: z.string().url(), caldav: z.string().url(), carddav: z.string().url(), }), }); export const LogoutResponseSchema = z.object({ ok: z.literal(true), }); export const NamedResourceRequestSchema = z.object({ name: z.string().min(1), }); export const AddressbookCreateRequestSchema = z.object({ name: z.string().min(1).max(128), display_name: z.string().min(1).max(256).optional(), description: z.string().max(4096).nullable().optional(), }); export const AddressbookPatchRequestSchema = z.object({ display_name: z.string().min(1).max(256).optional(), description: z.string().max(4096).nullable().optional(), }); export const AddressbookResponseSchema = z.object({ id: z.string(), name: z.string(), display_name: z.string(), description: z.string().nullable(), href: z.string(), created_at: z.string().datetime(), modified_at: z.string().datetime(), sync_token: z.string(), }); export const CalendarCreateRequestSchema = z.object({ name: z.string().min(1).max(128), display_name: z.string().min(1).max(256).optional(), description: z.string().max(4096).nullable().optional(), color: z.string().max(64).nullable().optional(), order_index: z.number().int().optional(), timezone_ical: z.string().max(65536).nullable().optional(), }); export const CalendarPatchRequestSchema = z.object({ display_name: z.string().min(1).max(256).optional(), description: z.string().max(4096).nullable().optional(), color: z.string().max(64).nullable().optional(), order_index: z.number().int().optional(), timezone_ical: z.string().max(65536).nullable().optional(), }); export const CalendarResponseSchema = z.object({ id: z.string(), name: z.string(), display_name: z.string(), description: z.string().nullable(), href: z.string(), color: z.string().nullable(), order_index: z.number().int(), timezone_ical: z.string().nullable(), created_at: z.string().datetime(), modified_at: z.string().datetime(), sync_token: z.string(), }); export const FileMetadataResponseSchema = z.object({ href: z.string(), path: z.string(), name: z.string(), kind: z.enum(["collection", "file"]), size: z.number().int(), content_type: z.string().nullable(), content_language: z.string().nullable(), etag: z.string().nullable(), created_at: z.string().datetime(), modified_at: z.string().datetime(), }); export const FileListResponseSchema = z.object({ directory: FileMetadataResponseSchema, entries: z.array(FileMetadataResponseSchema), }); export const FileMetadataQuerySchema = z.object({ path: z.string().optional(), }); export const FileListQuerySchema = z.object({ path: z.string().optional(), }); export const FileMkdirRequestSchema = z.object({ path: z.string().min(1), }); export const FileRenameRequestSchema = z.object({ from: z.string().min(1), to: z.string().min(1), }); export const FileDeleteRequestSchema = z.object({ path: z.string().min(1), });