feat: Add useCourse composable for course-related data and logic.

This commit is contained in:
supalerk-ar66 2026-01-28 10:01:21 +07:00
parent e9cdb0ddbe
commit bacb8a3824
2 changed files with 72 additions and 2 deletions

View file

@ -65,6 +65,38 @@ interface EnrolledCourseResponse {
limit: number
}
// Interface สำหรับการส่งคำตอบแบบทดสอบ (Quiz Submission)
export interface QuizAnswerSubmission {
question_id: number
choice_id: number
}
export interface QuizSubmitRequest {
answers: QuizAnswerSubmission[]
}
// Interface สำหรับผลลัพธ์การสอบ (Quiz Result)
export interface QuizResult {
answers_review: {
score: number
is_correct: boolean
correct_choice_id: number
selected_choice_id: number
question_id: number
}[]
completed_at: string
started_at: string
attempt_number: number
passing_score: number
is_passed: boolean
correct_answers: number
total_questions: number
total_score: number
score: number
quiz_id: number
attempt_id: number
}
// ==========================================
// Composable: useCourse
// หน้าที่: จัดการ Logic ทุกอย่างเกี่ยวกับคอร์สเรียน
@ -394,6 +426,39 @@ export const useCourse = () => {
}
}
// ฟังก์ชันส่งคำตอบ Quiz
// Endpoint: POST /students/courses/:cid/lessons/:lid/quiz/submit
const submitQuiz = async (courseId: number, lessonId: number, answers: QuizAnswerSubmission[]) => {
try {
const body: QuizSubmitRequest = { answers }
const data = await $fetch<{ code: number; message: string; data: QuizResult }>(`${API_BASE_URL}/students/courses/${courseId}/lessons/${lessonId}/quiz/submit`, {
method: 'POST',
headers: token.value ? {
Authorization: `Bearer ${token.value}`
} : {},
body: body
})
return {
success: true,
data: data.data
}
} catch (err: any) {
console.error('Submit quiz failed:', err)
return {
success: false,
error: err.data?.message || err.message || 'Error submitting quiz',
code: err.data?.code,
status: err.status
}
}
}
return {
fetchCourses,
fetchCourseById,
@ -404,7 +469,8 @@ export const useCourse = () => {
checkLessonAccess,
saveVideoProgress,
fetchVideoProgress,
markLessonComplete
markLessonComplete,
submitQuiz
}
}

View file

@ -75,7 +75,11 @@
- `GET /api/students/courses`: ดึง "คอร์สของฉัน"
- `GET /api/students/courses/{id}/learn`: ดึงโครงสร้างบทเรียน (Syllabus)
- `GET /api/students/courses/{id}/lessons/{lessonId}`: ดึงวิดีโอเนื้อหา
- `GET /api/students/courses/{id}/lessons/{lessonId}/access-check`: ตรวจสอบสิทธิ์การเข้าถึงบทเรียน
- `POST /api/students/lessons/{lessonId}/progress`: บันทึกเวลาเรียน (Video Progress)
- `GET /api/students/lessons/{lessonId}/progress`: ดึงเวลาเรียนล่าสุด
- `POST /api/students/courses/{id}/lessons/{lessonId}/complete`: บันทึกว่าเรียนจบแล้ว
- `POST /api/students/courses/{id}/lessons/{lessonId}/quiz/submit`: ส่งคำตอบแบบทดสอบ (Quiz)
### 3.3 `useCategory.ts` & Utilities
@ -98,7 +102,7 @@
---
## 6. Dependency Map & Relationships (แผนผังความสัมพันธ์ไฟล์)
## 6. Dependency Map & Relationships (แผนผังความสัมพันธ์ไฟล์)
ส่วนนี้ใช้อ้างอิงเวลาแก้ไขโค้ด เพื่อดูว่าไฟล์ไหนเชื่อมโยงหรือถูกเรียกใช้โดยไฟล์ใดบ้าง (Impact Analysis)