WayrApp Backend & Ecosystem Documentation - v1.0.0
    Preparing search index...

    Variable ExerciseSchemaConst

    ExerciseSchema: ZodObject<
        {
            id: ZodString;
            exercise_type: ZodEnum<
                [
                    "translation",
                    "translation-word-bank",
                    "fill-in-the-blank",
                    "vof",
                    "pairs",
                    "informative",
                    "ordering",
                ],
            >;
            data: ZodUnion<[ZodRecord<ZodString, ZodAny>, ZodArray<ZodAny, "many">]>;
        },
        "strip",
        ZodTypeAny,
        {
            id: string;
            exercise_type: | "translation"
            | "fill-in-the-blank"
            | "vof"
            | "pairs"
            | "informative"
            | "ordering"
            | "translation-word-bank";
            data: any[]
            | Record<string, any>;
        },
        {
            id: string;
            exercise_type: | "translation"
            | "fill-in-the-blank"
            | "vof"
            | "pairs"
            | "informative"
            | "ordering"
            | "translation-word-bank";
            data: any[]
            | Record<string, any>;
        },
    > = ...

    Exercise validation schema for interactive learning activities

    Validation schema for interactive exercises that provide hands-on learning experiences within lessons. Exercises represent the core interactive elements of the learning platform, supporting various activity types from translation and comprehension to matching and ordering activities, each with flexible data structures to accommodate different learning modalities.

    The exercise schema enforces proper categorization through exercise type validation, provides compact identification suitable for frequent database operations, and supports flexible data structures through JSON validation that can accommodate the varying requirements of different exercise types.

    Interactive learning support includes multiple exercise types that address different learning styles and skills, flexible data structures that can accommodate complex exercise configurations, and compact identification that supports efficient exercise delivery and tracking in interactive learning sessions.

    // Different exercise types with their data structures
    const exerciseExamples = [
    {
    id: 'trans-001',
    exercise_type: 'translation',
    data: {
    source_text: 'Hello, how are you?',
    target_text: 'Hola, ¿cómo estás?',
    hints: ['greeting', 'question']
    }
    },
    {
    id: 'fill-002',
    exercise_type: 'fill-in-the-blank',
    data: {
    text: 'My name ___ Maria',
    blanks: [{ position: 8, answer: 'is', alternatives: ['are', 'am'] }]
    }
    },
    {
    id: 'pairs-003',
    exercise_type: 'pairs',
    data: {
    pairs: [
    { left: 'casa', right: 'house' },
    { left: 'agua', right: 'water' },
    { left: 'fuego', right: 'fire' }
    ]
    }
    }
    ];
    // Exercise creation with type-specific validation
    router.post('/exercises',
    validate({ body: ExerciseSchema }),
    async (req, res) => {
    const exerciseData = req.body; // Validated exercise data

    // Type-specific data validation
    switch (exerciseData.exercise_type) {
    case 'translation':
    if (!exerciseData.data.source_text || !exerciseData.data.target_text) {
    return res.status(400).json({ error: 'Translation exercises require source and target text' });
    }
    break;
    case 'pairs':
    if (!Array.isArray(exerciseData.data.pairs) || exerciseData.data.pairs.length < 2) {
    return res.status(400).json({ error: 'Pairs exercises require at least 2 pairs' });
    }
    break;
    }

    const exercise = await exerciseService.create(exerciseData);
    res.status(201).json({ exercise });
    }
    );
    // Exercise completion and scoring
    const exerciseResponseSchema = z.object({
    exerciseId: z.string(),
    userResponse: JsonSchema,
    timeSpent: z.number().min(0)
    });

    router.post('/exercises/:exerciseId/submit',
    validate({ body: exerciseResponseSchema }),
    async (req, res) => {
    const { userResponse, timeSpent } = req.body;
    const exercise = await exerciseService.findById(req.params.exerciseId);

    // Type-specific scoring logic
    const score = await scoringService.evaluateResponse(
    exercise.exercise_type,
    exercise.data,
    userResponse
    );

    res.json({ score, timeSpent, correct: score >= 70 });
    }
    );