38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import { isChatMessageSkeleton, isQuizAttemptSkeleton } from '@openmaic/dsl';
|
|
import type { RuntimePayloadValidator } from '@openmaic/storage';
|
|
|
|
import { whiteboardRuntimePayloadValidator } from '@/lib/whiteboard/runtime/validate';
|
|
|
|
const chat: RuntimePayloadValidator = (payload) =>
|
|
isChatMessageSkeleton(payload)
|
|
? { valid: true }
|
|
: {
|
|
valid: false,
|
|
errors: [
|
|
{
|
|
path: '/payload',
|
|
message: 'chat payload must match ChatMessageSkeleton (role + content)',
|
|
},
|
|
],
|
|
};
|
|
|
|
const quizAttempt: RuntimePayloadValidator = (payload) =>
|
|
isQuizAttemptSkeleton(payload)
|
|
? { valid: true }
|
|
: {
|
|
valid: false,
|
|
errors: [
|
|
{
|
|
path: '/payload',
|
|
message: 'quizAttempt payload must match QuizAttemptSkeleton (phase + answers)',
|
|
},
|
|
],
|
|
};
|
|
|
|
/** Complete app validator table. RuntimeStore options replace their defaults. */
|
|
export const APP_RUNTIME_PAYLOAD_VALIDATORS = Object.freeze({
|
|
chat,
|
|
quizAttempt,
|
|
whiteboard: whiteboardRuntimePayloadValidator,
|
|
}) satisfies Readonly<Record<string, RuntimePayloadValidator>>;
|