const fs = require('fs'); const path = require('path'); const filePath = path.join(__dirname, 'apps/backend/src/routes/pages.ts'); let content = fs.readFileSync(filePath, 'utf8'); content = content.replace(/import \{[\s\S]*?\} from "@homaroma\/types";/, `import { LocalizedStringSchema, HeroSectionPayloadSchema, CategoriesSectionPayloadSchema, ProductsSectionPayloadSchema, BannerSectionPayloadSchema, TextSectionPayloadSchema, AnnouncementBarSectionPayloadSchema, NewsletterSectionPayloadSchema, EditorialTileSectionPayloadSchema, EditorialCarouselSectionPayloadSchema, HeroArticleSectionPayloadSchema, RichTextSectionPayloadSchema, ScentNotesBreakdownSectionPayloadSchema, QuoteCalloutSectionPayloadSchema, ProductCarouselSectionPayloadSchema, AccordionSectionPayloadSchema, ContactInfoSectionPayloadSchema, ContactFormSectionPayloadSchema } from "@homaroma/types"; import { z } from "zod";`); // Remove manual validation functions content = content.replace(/function isLocalizedStringValue[\s\S]*?function validateContactFormPayload[^{]*\{[\s\S]*?return null;\n\}/, ''); // Refactor validateSectionPayload content = content.replace(/function validateSectionPayload\(type: string, payload: any\): string \| null \{[\s\S]*?return null;\n\}/, `function validateSectionPayload(type: string, payload: any): { success: boolean; issues?: z.ZodIssue[] } { if (!payload || typeof payload !== 'object') { return { success: false, issues: [{ code: 'custom', message: "Payload must be a JSON object", path: [] }] }; } let schema: z.ZodTypeAny; switch (type.toUpperCase()) { case 'HERO': schema = HeroSectionPayloadSchema; break; case 'CATEGORIES': schema = CategoriesSectionPayloadSchema; break; case 'PRODUCTS': schema = ProductsSectionPayloadSchema; break; case 'BANNER': schema = BannerSectionPayloadSchema; break; case 'TEXT': schema = TextSectionPayloadSchema; break; case 'ANNOUNCEMENT_BAR': schema = AnnouncementBarSectionPayloadSchema; break; case 'NEWSLETTER': schema = NewsletterSectionPayloadSchema; break; case 'EDITORIAL_TILE': schema = EditorialTileSectionPayloadSchema; break; case 'EDITORIAL_CAROUSEL': schema = EditorialCarouselSectionPayloadSchema; break; case 'HERO_ARTICLE': schema = HeroArticleSectionPayloadSchema; break; case 'RICH_TEXT': schema = RichTextSectionPayloadSchema; break; case 'SCENT_NOTES_BREAKDOWN': schema = ScentNotesBreakdownSectionPayloadSchema; break; case 'QUOTE_CALLOUT': schema = QuoteCalloutSectionPayloadSchema; break; case 'PRODUCT_CAROUSEL': schema = ProductCarouselSectionPayloadSchema; break; case 'ACCORDION': schema = AccordionSectionPayloadSchema; break; case 'CONTACT_INFO': schema = ContactInfoSectionPayloadSchema; break; case 'CONTACT_FORM': schema = ContactFormSectionPayloadSchema; break; default: return { success: false, issues: [{ code: 'custom', message: \`Unknown section type: \${type}\`, path: [] }] }; } const res = schema.safeParse(payload); if (!res.success) { return { success: false, issues: res.error.issues }; } return { success: true }; }`); // Update error handling in POST /:slug/sections content = content.replace( /const validationError = validateSectionPayload\(type, payload\);\n\s*if \(validationError\) \{\n\s*set\.status = 400;\n\s*return \{ error: validationError \};\n\s*\}/g, `const validationResult = validateSectionPayload(type, payload); if (!validationResult.success) { set.status = 400; return { error: "Validation failed", details: validationResult.issues }; }` ); // Update error handling in PUT /sections/:sectionId content = content.replace( /const validationError = validateSectionPayload\(validationType, payload\);\n\s*if \(validationError\) \{\n\s*set\.status = 400;\n\s*return \{ error: validationError \};\n\s*\}/g, `const validationResult = validateSectionPayload(validationType, payload); if (!validationResult.success) { set.status = 400; return { error: "Validation failed", details: validationResult.issues }; }` ); fs.writeFileSync(filePath, content);