From f615b06bf800e7d628a63ad8812299ad38b6c0c1 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Mon, 8 Jun 2026 00:52:37 +0100 Subject: [PATCH] refactor: update landing page metadata schema --- .../core/src/services/agent/agent-tool-schemas.ts | 4 ++-- packages/utils/src/validation/course/course.ts | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/core/src/services/agent/agent-tool-schemas.ts b/packages/core/src/services/agent/agent-tool-schemas.ts index e6ad4e0f..f5923999 100644 --- a/packages/core/src/services/agent/agent-tool-schemas.ts +++ b/packages/core/src/services/agent/agent-tool-schemas.ts @@ -7,7 +7,7 @@ import { } from '@cio/ai-assistant/tools'; import { QUESTION_TYPE_REGISTRY } from '@cio/question-types'; import { ZExerciseSectionAfterBehavior } from '@cio/utils/validation/exercise'; -import { ZCourseLandingPageUpdate, ZCourseLandingPageMetadataUpdate } from '@cio/utils/validation/course'; +import { ZCourseLandingPageUpdate, ZCourseLandingPageMetadataUpdateFields } from '@cio/utils/validation/course'; // courseId is NOT a parameter — it's injected from the authenticated request context. // This prevents prompt injection from tricking the LLM into targeting another course. @@ -251,7 +251,7 @@ export const agentLessonTabsOrder = z.array( name: z.string() }) ); -export const agentLandingPageMetadataUpdate = ZCourseLandingPageMetadataUpdate.extend({ +export const agentLandingPageMetadataUpdate = ZCourseLandingPageMetadataUpdateFields.extend({ lessonTabsOrder: agentLessonTabsOrder.optional(), requirements: z.string().optional().describe(LANDING_PAGE_SECTION_HTML_AGENT_HINT), description: z.string().optional().describe(LANDING_PAGE_METADATA_DESCRIPTION_SECTION_HINT), diff --git a/packages/utils/src/validation/course/course.ts b/packages/utils/src/validation/course/course.ts index 9773ad6e..1f07f027 100644 --- a/packages/utils/src/validation/course/course.ts +++ b/packages/utils/src/validation/course/course.ts @@ -357,14 +357,16 @@ const ZCourseMetadataFields = z.object({ export const ZCourseMetadata = z.preprocess(preprocessCourseMetadata, ZCourseMetadataFields); export type TCourseMetadata = z.infer; +export const ZCourseLandingPageMetadataUpdateFields = ZCourseMetadataFields.omit({ allowNewStudent: true }).extend({ + allowNewStudent: z.boolean().optional(), + reward: ZCourseReward.partial().optional(), + instructor: ZCourseInstructor.partial().optional(), + certificate: ZCourseCertificate.partial().optional() +}); + export const ZCourseLandingPageMetadataUpdate = z.preprocess( preprocessCourseMetadata, - ZCourseMetadataFields.omit({ allowNewStudent: true }).extend({ - allowNewStudent: z.boolean().optional(), - reward: ZCourseReward.partial().optional(), - instructor: ZCourseInstructor.partial().optional(), - certificate: ZCourseCertificate.partial().optional() - }) + ZCourseLandingPageMetadataUpdateFields ); export type TCourseLandingPageMetadataUpdate = z.infer;