feat: Implement lesson creation with file uploads (video, attachments) and quiz data, integrating MinIO for storage.

This commit is contained in:
JakkrapartXD 2026-01-20 16:51:42 +07:00
parent 4851182f4a
commit 04e2da43c4
6 changed files with 715 additions and 4 deletions

View file

@ -105,6 +105,8 @@ export interface GetChapterRequest {
}
export interface CreateChapterInput {
token: string;
course_id: number;
title: MultiLanguageText;
description?: MultiLanguageText;
sort_order?: number;
@ -118,6 +120,9 @@ export interface CreateChapterRequest {
}
export interface UpdateChapterInput {
token: string;
course_id: number;
chapter_id: number;
title?: MultiLanguageText;
description?: MultiLanguageText;
sort_order?: number;
@ -140,7 +145,8 @@ export interface DeleteChapterRequest {
export interface ReorderChapterRequest {
token: string;
course_id: number;
chapter_ids: number[]; // Ordered array of chapter IDs
chapter_id: number;
sort_order: number;
}
// ============================================
@ -212,7 +218,20 @@ export interface GetLessonRequest {
lesson_id: number;
}
/**
* Uploaded file information from multer
*/
export interface UploadedFileInfo {
originalname: string;
mimetype: string;
size: number;
buffer: Buffer;
}
export interface CreateLessonInput {
token: string;
course_id: number;
chapter_id: number;
title: MultiLanguageText;
content?: MultiLanguageText;
type: 'VIDEO' | 'QUIZ';
@ -222,6 +241,68 @@ export interface CreateLessonInput {
prerequisite_lesson_ids?: number[];
require_pass_quiz?: boolean;
is_published?: boolean;
// File upload fields
video?: UploadedFileInfo;
attachments?: UploadedFileInfo[];
// Quiz data for QUIZ type lessons (one quiz per lesson)
quiz_data?: {
title: MultiLanguageText;
description?: MultiLanguageText;
passing_score?: number;
time_limit?: number;
shuffle_questions?: boolean;
shuffle_choices?: boolean;
show_answers_after_completion?: boolean;
questions: CreateQuizQuestionInput[];
};
}
/**
* Input for creating quiz questions (matches Prisma QuestionType enum)
*/
export interface CreateQuizQuestionInput {
question: MultiLanguageText;
explanation?: MultiLanguageText;
question_type: 'MULTIPLE_CHOICE' | 'TRUE_FALSE' | 'SHORT_ANSWER';
score?: number;
sort_order?: number;
choices?: CreateQuizChoiceInput[];
}
/**
* Input for creating quiz choices (matches Prisma Choice model)
*/
export interface CreateQuizChoiceInput {
text: MultiLanguageText; // "text" matches Prisma field name
is_correct: boolean;
sort_order?: number;
}
/**
* Response data for quiz questions (with IDs after creation)
*/
export interface QuizQuestionData {
id: number;
quiz_id: number;
question: MultiLanguageText;
explanation: MultiLanguageText | null;
question_type: 'MULTIPLE_CHOICE' | 'TRUE_FALSE' | 'SHORT_ANSWER';
score: number;
sort_order: number;
created_at: Date;
updated_at: Date | null;
choices?: QuizChoiceData[];
}
/**
* Response data for quiz choices (matches Prisma Choice model - no timestamps)
*/
export interface QuizChoiceData {
id: number;
question_id: number;
text: MultiLanguageText; // "text" matches Prisma field name
is_correct: boolean;
sort_order: number;
}
export interface CreateLessonRequest {