/** * @factory/shared — search DTOs (PRODUCT-SPEC §15; prisma `SearchDocument`). */ import { z } from "zod"; import { LIMITS } from "../constants.js"; /** Searchable document kinds (PRODUCT-SPEC §15: "search everything"). */ export const searchTypeSchema = z.enum([ "page", "block", "database", "record", "comment", "file", "user", ]); export type SearchType = z.infer; const isoDate = z .string() .refine((s) => Number.isFinite(Date.parse(s)), { message: "invalid ISO date" }); export const searchRequestSchema = z .object({ query: z.string().min(1, "Query is required").max(500), types: z.array(searchTypeSchema).min(1).max(7).optional(), workspaceId: z.string().min(1).optional(), teamId: z.string().min(1).optional(), updatedFrom: isoDate.optional(), updatedTo: isoDate.optional(), /** Opaque cursor for the next page. */ cursor: z.string().min(1).optional(), limit: z.number().int().min(1).max(LIMITS.MAX_SEARCH_LIMIT).default(20), }) .strict(); export type SearchRequest = z.infer;