feat: Implement lesson creation with file uploads (video, attachments) and quiz data, integrating MinIO for storage.
This commit is contained in:
parent
4851182f4a
commit
04e2da43c4
6 changed files with 715 additions and 4 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue