elearning/docs/edge_cases_quick_reference.md

12 KiB

Edge Cases Quick Reference

สรุปกรณีพิเศษที่ต้องระวังในระบบ E-Learning - สำหรับอ้างอิงด่วน

📋 สารบัญ Edge Cases

# Edge Case ความเสี่ยง แนวทางแก้ไข
1 การเปลี่ยนบทบาทโดย Admin 🟡 ปานกลาง Invalidate sessions + audit log
2 หลักสูตรถูกซ่อน/ลบ 🟡 ปานกลาง Read-only mode สำหรับผู้ลงทะเบียนแล้ว
3 ลงทะเบียนซ้ำ 🟢 ต่ำ ตรวจสอบและ redirect
4 ข้ามลำดับบทเรียน 🟡 ปานกลาง ตรวจสอบ prerequisite
5 ทำแบบทดสอบหลายครั้ง 🟡 ปานกลาง จำกัดครั้ง + cooldown
6 แก้ไขขณะมีคนใช้งาน 🔴 สูง Soft delete + แจ้งเตือน
7 ลบ Instructor ที่มีหลักสูตร 🔴 สูง บังคับโอนหลักสูตรก่อน
8 เข้าถึงข้อมูลข้ามหลักสูตร 🔴 สูง Middleware ตรวจสอบ ownership
9 เพิ่มเนื้อหาหลังจบหลักสูตร 🟡 ปานกลาง เนื้อหาใหม่ = เสริม (ไม่บังคับ)
10 Maintenance Mode 🟡 ปานกลาง Auto-save + แจ้งเตือนล่วงหน้า

1. การเปลี่ยนบทบาทผู้ใช้

หมายเหตุ: ไม่มีการเปลี่ยนบทบาทระหว่าง Student-Instructor ในการใช้งานปกติ
เกิดขึ้นเฉพาะกรณีพิเศษที่ Admin จัดการ (เช่น แก้ไขข้อมูลผิดพลาด)

ปัญหา: Token/Session เก่ายังมีสิทธิ์เดิม

วิธีแก้:

// Admin เปลี่ยนบทบาท (กรณีพิเศษ)
// 1. บันทึก audit log (ระบุเหตุผล)
// 2. อัปเดตบทบาท
// 3. Invalidate sessions ทั้งหมด
// 4. แจ้งเตือนผู้ใช้ทางอีเมล
// 5. บังคับ login ใหม่

Key Points:

  • เฉพาะ Admin เท่านั้น
  • ต้องระบุเหตุผลและบันทึก audit log
  • Invalidate sessions ทันที
  • แจ้งเตือนผู้ใช้ทางอีเมล

2. หลักสูตรถูกซ่อน/ลบ

ปัญหา: Student ที่ลงทะเบียนแล้วควรเข้าถึงได้หรือไม่?

วิธีแก้:

  • ซ่อน: Student ที่ลงทะเบียนแล้ว → เข้าถึงได้ปกติ
  • ลบ: Student ที่ลงทะเบียนแล้ว → Read-only mode

Key Points:

  • ใช้ Soft Delete
  • ใบประกาศนียบัตรที่ออกแล้วยังใช้ได้
  • ห้ามทำแบบทดสอบใหม่ในหลักสูตรที่ถูกลบ

3. ลงทะเบียนซ้ำ

ปัญหา: ข้อมูลความคืบหน้าจะเป็นอย่างไร?

วิธีแก้:

if (existingEnrollment) {
  return redirect(`/courses/${courseId}`);
}

Key Points:

  • ตรวจสอบก่อนสร้าง enrollment
  • Redirect ไปที่หลักสูตร
  • ห้ามรีเซ็ตความคืบหน้า

4. ข้ามลำดับบทเรียน

ปัญหา: Student ใช้ Direct URL ข้ามลำดับ

วิธีแก้:

// ตรวจสอบว่าเรียน Lesson ก่อนหน้าครบหรือไม่
if (!allPreviousCompleted) {
  return { access: false, nextAvailableLesson };
}

Key Points:

  • ตรวจสอบที่ Backend (ห้ามพึ่ง Frontend)
  • แสดง Lesson ถัดไปที่เข้าถึงได้
  • รองรับหลักสูตรที่ไม่บังคับลำดับ

5. ทำแบบทดสอบหลายครั้ง

ปัญหา: จำกัดครั้ง? คะแนนไหนที่นับ? รอกี่นาที?

วิธีแก้:

// ตรวจสอบ:
// 1. จำนวนครั้งที่ทำได้ (maxAttempts)
// 2. ระยะเวลารอ (cooldownMinutes)
// 3. นโยบายคะแนน (HIGHEST/LATEST/FIRST/AVERAGE)

Key Points:

  • ใช้คะแนนสูงสุด (HIGHEST) เป็นค่าเริ่มต้น
  • กำหนด cooldown ได้ต่อแบบทดสอบ
  • เก็บประวัติการทำทุกครั้ง

6. แก้ไขขณะมีคนใช้งาน

ปัญหา: Student กำลังดู Lesson อยู่ แต่ Instructor ลบ

วิธีแก้:

// ใช้ Soft Delete
if (activeViewers.length > 0) {
  markAsDeleted(); // ลบถาวรใน 24 ชม.
  notifyInstructor();
}

Key Points:

  • ใช้ Soft Delete แทน Hard Delete
  • แจ้งเตือน Instructor ว่ามีคนดูอยู่
  • Student ที่เข้าถึงก่อนหน้า → ดูต่อได้

7. ลบ Instructor ที่มีหลักสูตร

ปัญหา: หลักสูตรจะกลายเป็น "ไม่มีเจ้าของ"

วิธีแก้:

if (courses.length > 0) {
  return error('กรุณาโอนหลักสูตรก่อน');
}
// ใช้ Soft Delete (deactivate)

Key Points:

  • บังคับโอนหลักสูตรก่อนลบ
  • ใช้ Soft Delete (deactivate)
  • เก็บ Audit Log

8. เข้าถึงข้อมูลข้ามหลักสูตร

ปัญหา: Instructor A ดูข้อมูลหลักสูตรของ Instructor B

วิธีแก้:

// Middleware ตรวจสอบ ownership
if (role === 'INSTRUCTOR' && course.instructorId !== userId) {
  return 403;
}

Key Points:

  • ตรวจสอบ ownership ที่ Backend
  • Admin → read-only access
  • Instructor → เฉพาะหลักสูตรของตนเอง

9. เพิ่มเนื้อหาหลังจบหลักสูตร

ปัญหา: ความคืบหน้ากลับไม่ครบ 100%

วิธีแก้:

// คำนวณจากเนื้อหาตอนลงทะเบียน
if (originalProgress === 100 && certificateIssued) {
  return { progress: 100, newContentAvailable: true };
}

Key Points:

  • ใบประกาศนียบัตรยังใช้ได้
  • เนื้อหาใหม่ = เสริม (ไม่บังคับ)
  • แสดงป้าย "มีเนื้อหาใหม่"

10. Maintenance Mode

ปัญหา: Student กำลังทำแบบทดสอบ

วิธีแก้:

// 1. แจ้งเตือนล่วงหน้า 24 ชม.
// 2. Auto-save ทุก 30 วินาที
// 3. เก็บ draft 24 ชม.
// 4. Admin เข้าถึงได้

Key Points:

  • Auto-save แบบทดสอบทุก 30 วินาที
  • แจ้งเตือนล่วงหน้า
  • กู้คืนข้อมูลได้ภายใน 24 ชม.

🔒 หลักการสำคัญ (Best Practices)

1. Soft Delete > Hard Delete

  • ใช้ isDeleted flag แทนการลบจริง
  • เก็บข้อมูลไว้สำหรับ audit trail
  • ป้องกันการสูญหายของข้อมูล

2. Invalidate Sessions เมื่อเปลี่ยนสิทธิ์

  • เปลี่ยนบทบาท → logout ทันที
  • ลบบัญชี → invalidate sessions
  • เปลี่ยนรหัสผ่าน → logout devices อื่น

3. ตรวจสอบสิทธิ์ที่ Backend เสมอ

  • Frontend = UX (ซ่อน/แสดง UI)
  • Backend = Security (ป้องกันการเข้าถึง)
  • ห้ามพึ่งพา Frontend เพียงอย่างเดียว

4. Auto-save สำหรับข้อมูลสำคัญ

  • แบบทดสอบ → auto-save ทุก 30 วินาที
  • เนื้อหาที่กำลังเขียน → auto-save
  • เก็บ draft ไว้อย่างน้อย 24 ชม.

5. แจ้งเตือนผู้ใช้

  • Maintenance → แจ้งล่วงหน้า 24 ชม.
  • ลบเนื้อหา → แจ้งว่ามีคนดูอยู่
  • เปลี่ยนแปลงสำคัญ → ส่งอีเมลแจ้ง

📊 สรุปความเสี่ยงและลำดับความสำคัญ

🔴 ความเสี่ยงสูง (ต้องจัดการก่อน)

  1. แก้ไขขณะมีคนใช้งาน
  2. ลบ Instructor ที่มีหลักสูตร
  3. เข้าถึงข้อมูลข้ามหลักสูตร

🟡 ความเสี่ยงปานกลาง

  1. การเปลี่ยนบทบาทโดย Admin (กรณีพิเศษ)
  2. หลักสูตรถูกซ่อน/ลบ
  3. ข้ามลำดับบทเรียน
  4. ทำแบบทดสอบหลายครั้ง
  5. เพิ่มเนื้อหาหลังจบหลักสูตร
  6. Maintenance Mode

🟢 ความเสี่ยงต่ำ

  1. ลงทะเบียนซ้ำ

🔗 เอกสารที่เกี่ยวข้อง