elearning/docs/api-docs/api_usage_examples.md

24 KiB

API Usage Examples

ตัวอย่างการใช้งาน API แบบละเอียดพร้อม Request/Response


📋 Table of Contents

  1. Authentication Flow
  2. Student Learning Journey
  3. Instructor Course Creation
  4. Quiz Management
  5. Announcements
  6. Reports & Analytics
  7. Payment Flow
  8. Admin Operations

1. Authentication Flow

1.1 Register New User

Request:

POST /api/auth/register
Content-Type: application/json

{
  "name": "John Doe",
  "email": "john@example.com",
  "password": "SecurePass123!",
  "role": "student"
}

Response 201:

{
  "user": {
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com",
    "role": "student",
    "created_at": "2024-12-22T16:00:00Z"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6InN0dWRlbnQiLCJpYXQiOjE3MDMyNTk2MDAsImV4cCI6MTcwMzM0NjAwMH0.xxx",
  "expiresIn": 86400
}

1.2 Login

Request:

POST /api/auth/login
Content-Type: application/json

{
  "email": "john@example.com",
  "password": "SecurePass123!",
  "rememberMe": true
}

Response 200:

{
  "user": {
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com",
    "role": "student"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expiresIn": 2592000
}

Error 401:

{
  "error": {
    "code": "INVALID_CREDENTIALS",
    "message": "Invalid email or password"
  }
}

1.3 Password Reset Flow

Step 1: Request Reset

POST /api/auth/password/reset-request
Content-Type: application/json

{
  "email": "john@example.com"
}

Response 200:

{
  "message": "Password reset email sent to john@example.com"
}

Step 2: Reset Password

POST /api/auth/password/reset
Content-Type: application/json

{
  "token": "reset_token_from_email_abc123",
  "password": "NewSecurePass456!"
}

Response 200:

{
  "message": "Password reset successfully. Please login with your new password."
}

2. Student Learning Journey

2.1 Browse Courses

Request:

GET /api/courses?page=1&limit=12&category=1&search=python&lang=th&is_free=false&sort=popular

Response 200:

{
  "data": [
    {
      "id": 1,
      "title": "Python สำหรับผู้เริ่มต้น",
      "description": "เรียนรู้ Python จากพื้นฐานถึงขั้นสูง",
      "thumbnail": "https://cdn.example.com/courses/python-101.jpg",
      "price": 990,
      "is_free": false,
      "instructor": {
        "id": 5,
        "name": "Jane Smith",
        "avatar": "https://cdn.example.com/avatars/jane.jpg"
      },
      "category": {
        "id": 1,
        "name": "การเขียนโปรแกรม"
      },
      "students_count": 1250,
      "rating": 4.8,
      "total_lessons": 45,
      "total_duration": "12:30:00",
      "status": "approved"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 12,
    "total": 150,
    "totalPages": 13
  }
}

2.2 Get Course Details

Request:

GET /api/courses/1?lang=th

Response 200:

{
  "id": 1,
  "title": "Python สำหรับผู้เริ่มต้น",
  "description": "เรียนรู้ Python จากพื้นฐานถึงขั้นสูง ครอบคลุมทุกหัวข้อสำคัญ",
  "thumbnail": "https://cdn.example.com/courses/python-101.jpg",
  "price": 990,
  "is_free": false,
  "status": "approved",
  "instructor": {
    "id": 5,
    "name": "Jane Smith",
    "bio": "Software Engineer with 10+ years experience",
    "avatar": "https://cdn.example.com/avatars/jane.jpg",
    "total_students": 5000,
    "total_courses": 8
  },
  "category": {
    "id": 1,
    "name": "การเขียนโปรแกรม",
    "description": "หลักสูตรด้านการเขียนโปรแกรม"
  },
  "chapters": [
    {
      "id": 1,
      "title": "บทที่ 1: เริ่มต้นกับ Python",
      "lessons_count": 5,
      "sort_order": 1
    },
    {
      "id": 2,
      "title": "บทที่ 2: ตัวแปรและชนิดข้อมูล",
      "lessons_count": 8,
      "sort_order": 2
    }
  ],
  "students_count": 1250,
  "rating": 4.8,
  "reviews_count": 320,
  "total_lessons": 45,
  "total_duration": "12:30:00",
  "created_at": "2024-01-15T10:00:00Z",
  "updated_at": "2024-12-20T15:30:00Z"
}

2.3 Enroll in Course

Request:

POST /api/courses/1/enroll
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 201:

{
  "enrollment_id": 456,
  "course_id": 1,
  "user_id": 123,
  "status": "enrolled",
  "progress_percentage": 0,
  "enrolled_at": "2024-12-22T16:05:00Z",
  "message": "Successfully enrolled in Python สำหรับผู้เริ่มต้น"
}

Error 409 (Already Enrolled):

{
  "error": {
    "code": "ALREADY_ENROLLED",
    "message": "You are already enrolled in this course",
    "enrollment_id": 456
  }
}

2.4 Get Learning Page

Request:

GET /api/students/courses/1/learn
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "course": {
    "id": 1,
    "title": "Python สำหรับผู้เริ่มต้น",
    "instructor": {
      "id": 5,
      "name": "Jane Smith"
    }
  },
  "enrollment": {
    "id": 456,
    "status": "enrolled",
    "progress_percentage": 35,
    "enrolled_at": "2024-12-22T16:05:00Z"
  },
  "chapters": [
    {
      "id": 1,
      "title": "บทที่ 1: เริ่มต้นกับ Python",
      "sort_order": 1,
      "lessons": [
        {
          "id": 1,
          "title": "1.1 แนะนำ Python",
          "type": "video",
          "duration": "00:15:30",
          "is_completed": true,
          "is_locked": false,
          "completed_at": "2024-12-22T16:20:00Z"
        },
        {
          "id": 2,
          "title": "1.2 ติดตั้ง Python",
          "type": "video",
          "duration": "00:20:00",
          "is_completed": true,
          "is_locked": false,
          "completed_at": "2024-12-22T16:45:00Z"
        },
        {
          "id": 3,
          "title": "1.3 แบบทดสอบท้ายบท",
          "type": "quiz",
          "is_completed": false,
          "is_locked": false
        }
      ]
    },
    {
      "id": 2,
      "title": "บทที่ 2: ตัวแปรและชนิดข้อมูล",
      "sort_order": 2,
      "lessons": [
        {
          "id": 4,
          "title": "2.1 ตัวแปรใน Python",
          "type": "video",
          "duration": "00:18:00",
          "is_completed": false,
          "is_locked": false
        }
      ]
    }
  ]
}

2.5 Get Lesson Content

Request:

GET /api/students/courses/1/lessons/1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "id": 1,
  "title": "1.1 แนะนำ Python",
  "content": {
    "th": "<h2>แนะนำ Python</h2><p>Python เป็นภาษาโปรแกรมที่...</p>",
    "en": "<h2>Introduction to Python</h2><p>Python is a programming language...</p>"
  },
  "type": "video",
  "video_url": "https://cdn.example.com/videos/lesson-1.m3u8",
  "duration": "00:15:30",
  "is_completed": true,
  "completed_at": "2024-12-22T16:20:00Z",
  "can_access": true,
  "next_lesson_id": 2,
  "prev_lesson_id": null,
  "chapter": {
    "id": 1,
    "title": "บทที่ 1: เริ่มต้นกับ Python"
  }
}

Error 403 (Locked Lesson):

{
  "error": {
    "code": "LESSON_LOCKED",
    "message": "Please complete previous lessons first",
    "required_lessons": [1, 2],
    "next_available_lesson": 3
  }
}

2.6 Mark Lesson as Complete

Request:

POST /api/students/courses/1/lessons/1/complete
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "lesson_id": 1,
  "is_completed": true,
  "completed_at": "2024-12-22T16:20:00Z",
  "progress_percentage": 38,
  "next_lesson": {
    "id": 2,
    "title": "1.2 ติดตั้ง Python",
    "is_locked": false
  }
}

3. Instructor Course Creation

3.1 Create Course

Request:

POST /api/instructor/courses
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "title": {
    "th": "JavaScript สำหรับผู้เริ่มต้น",
    "en": "JavaScript for Beginners"
  },
  "description": {
    "th": "เรียนรู้ JavaScript จากพื้นฐาน",
    "en": "Learn JavaScript from scratch"
  },
  "category_id": 1,
  "price": 1200,
  "is_free": false,
  "thumbnail": "https://cdn.example.com/thumbnails/js-101.jpg"
}

Response 201:

{
  "id": 25,
  "title": {
    "th": "JavaScript สำหรับผู้เริ่มต้น",
    "en": "JavaScript for Beginners"
  },
  "description": {
    "th": "เรียนรู้ JavaScript จากพื้นฐาน",
    "en": "Learn JavaScript from scratch"
  },
  "category_id": 1,
  "price": 1200,
  "is_free": false,
  "status": "draft",
  "instructor_id": 5,
  "created_at": "2024-12-22T16:30:00Z",
  "message": "Course created successfully. Add chapters and lessons to continue."
}

3.2 Create Chapter

Request:

POST /api/instructor/courses/25/chapters
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "title": {
    "th": "บทที่ 1: เริ่มต้นกับ JavaScript",
    "en": "Chapter 1: Getting Started with JavaScript"
  },
  "sort_order": 1
}

Response 201:

{
  "id": 50,
  "course_id": 25,
  "title": {
    "th": "บทที่ 1: เริ่มต้นกับ JavaScript",
    "en": "Chapter 1: Getting Started with JavaScript"
  },
  "sort_order": 1,
  "created_at": "2024-12-22T16:32:00Z"
}

3.3 Create Lesson with Video

Request:

POST /api/instructor/courses/25/chapters/50/lessons
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "title": {
    "th": "1.1 แนะนำ JavaScript",
    "en": "1.1 Introduction to JavaScript"
  },
  "content": {
    "th": "<p>JavaScript เป็นภาษาโปรแกรมที่ใช้ในการพัฒนาเว็บไซต์</p>",
    "en": "<p>JavaScript is a programming language used for web development</p>"
  },
  "type": "video",
  "sort_order": 1
}

Response 201:

{
  "id": 100,
  "chapter_id": 50,
  "title": {
    "th": "1.1 แนะนำ JavaScript",
    "en": "1.1 Introduction to JavaScript"
  },
  "content": {
    "th": "<p>JavaScript เป็นภาษาโปรแกรมที่ใช้ในการพัฒนาเว็บไซต์</p>",
    "en": "<p>JavaScript is a programming language used for web development</p>"
  },
  "type": "video",
  "video_url": null,
  "sort_order": 1,
  "created_at": "2024-12-22T16:35:00Z",
  "message": "Lesson created. Upload video to complete."
}

3.4 Upload Video

Request:

POST /api/instructor/courses/25/lessons/100/video
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: multipart/form-data

file: <video_file.mp4>

Response 200:

{
  "lesson_id": 100,
  "video_url": "https://cdn.example.com/videos/course-25/lesson-100.m3u8",
  "duration": "00:15:30",
  "file_size": 52428800,
  "upload_completed_at": "2024-12-22T16:40:00Z"
}

3.5 Submit Course for Approval

Request:

POST /api/instructor/courses/25/submit
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "id": 25,
  "status": "pending",
  "submitted_at": "2024-12-22T16:45:00Z",
  "message": "Course submitted for approval. You will be notified once reviewed."
}

Error 422 (Incomplete Course):

{
  "error": {
    "code": "INCOMPLETE_COURSE",
    "message": "Course must have at least 1 chapter and 3 lessons",
    "details": {
      "chapters_count": 1,
      "lessons_count": 1,
      "required_lessons": 3
    }
  }
}

4. Quiz Management

4.1 Create Quiz (Instructor)

Request:

POST /api/instructor/courses/25/lessons/103/quiz
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "title": {
    "th": "แบบทดสอบท้ายบทที่ 1",
    "en": "Chapter 1 Quiz"
  },
  "passing_score": 70,
  "time_limit": 30,
  "max_attempts": 3,
  "cooldown_minutes": 60,
  "score_policy": "highest"
}

Response 201:

{
  "id": 15,
  "lesson_id": 103,
  "title": {
    "th": "แบบทดสอบท้ายบทที่ 1",
    "en": "Chapter 1 Quiz"
  },
  "passing_score": 70,
  "time_limit": 30,
  "max_attempts": 3,
  "cooldown_minutes": 60,
  "score_policy": "highest",
  "created_at": "2024-12-22T16:50:00Z"
}

4.2 Add Question

Request:

POST /api/instructor/quizzes/15/questions
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "question": {
    "th": "JavaScript ย่อมาจากอะไร?",
    "en": "What does JavaScript stand for?"
  },
  "question_type": "multiple_choice",
  "score": 10,
  "sort_order": 1,
  "choices": [
    {
      "text": {
        "th": "Java Script Language",
        "en": "Java Script Language"
      },
      "is_correct": false,
      "sort_order": 1
    },
    {
      "text": {
        "th": "ไม่ได้ย่อมาจากอะไร เป็นชื่อภาษา",
        "en": "It's not an acronym, it's a language name"
      },
      "is_correct": true,
      "sort_order": 2
    },
    {
      "text": {
        "th": "Just Another Scripting Language",
        "en": "Just Another Scripting Language"
      },
      "is_correct": false,
      "sort_order": 3
    }
  ]
}

Response 201:

{
  "id": 45,
  "quiz_id": 15,
  "question": {
    "th": "JavaScript ย่อมาจากอะไร?",
    "en": "What does JavaScript stand for?"
  },
  "question_type": "multiple_choice",
  "score": 10,
  "sort_order": 1,
  "choices": [
    {
      "id": 180,
      "text": {
        "th": "Java Script Language",
        "en": "Java Script Language"
      },
      "is_correct": false,
      "sort_order": 1
    },
    {
      "id": 181,
      "text": {
        "th": "ไม่ได้ย่อมาจากอะไร เป็นชื่อภาษา",
        "en": "It's not an acronym, it's a language name"
      },
      "is_correct": true,
      "sort_order": 2
    },
    {
      "id": 182,
      "text": {
        "th": "Just Another Scripting Language",
        "en": "Just Another Scripting Language"
      },
      "is_correct": false,
      "sort_order": 3
    }
  ],
  "created_at": "2024-12-22T16:55:00Z"
}

4.3 Take Quiz (Student)

Step 1: Get Quiz

GET /api/students/quizzes/15
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "id": 15,
  "title": "แบบทดสอบท้ายบทที่ 1",
  "passing_score": 70,
  "time_limit": 30,
  "max_attempts": 3,
  "cooldown_minutes": 60,
  "score_policy": "highest",
  "attempts_used": 1,
  "can_take": true,
  "next_attempt_at": null,
  "best_score": 60,
  "questions": [
    {
      "id": 45,
      "question": "JavaScript ย่อมาจากอะไร?",
      "question_type": "multiple_choice",
      "score": 10,
      "sort_order": 1,
      "choices": [
        {
          "id": 180,
          "text": "Java Script Language",
          "sort_order": 1
        },
        {
          "id": 181,
          "text": "ไม่ได้ย่อมาจากอะไร เป็นชื่อภาษา",
          "sort_order": 2
        },
        {
          "id": 182,
          "text": "Just Another Scripting Language",
          "sort_order": 3
        }
      ]
    }
  ]
}

Step 2: Submit Quiz

POST /api/students/quizzes/15/submit
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "answers": [
    {
      "question_id": 45,
      "choice_id": 181
    },
    {
      "question_id": 46,
      "choice_id": 185
    }
  ]
}

Response 200:

{
  "attempt_id": 89,
  "score": 85,
  "total_questions": 10,
  "correct_answers": 8,
  "is_passed": true,
  "attempt_number": 2,
  "started_at": "2024-12-22T17:00:00Z",
  "completed_at": "2024-12-22T17:15:00Z",
  "time_spent": "00:15:00",
  "answers": [
    {
      "question_id": 45,
      "selected_choice_id": 181,
      "is_correct": true,
      "score_earned": 10
    },
    {
      "question_id": 46,
      "selected_choice_id": 185,
      "is_correct": false,
      "score_earned": 0,
      "correct_choice_id": 186
    }
  ]
}

5. Announcements

5.1 Create Announcement with Attachments

Request:

POST /api/instructor/courses/1/announcements
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: multipart/form-data

title: {"th": "ประกาศสำคัญ: เปลี่ยนแปลงตารางเรียน", "en": "Important: Schedule Change"}
content: {"th": "เนื้อหาประกาศ...", "en": "Announcement content..."}
is_pinned: true
published_at: 2024-12-25T10:00:00Z
attachments[]: <file1.pdf>
attachments[]: <file2.docx>

Response 201:

{
  "id": 78,
  "course_id": 1,
  "instructor_id": 5,
  "title": {
    "th": "ประกาศสำคัญ: เปลี่ยนแปลงตารางเรียน",
    "en": "Important: Schedule Change"
  },
  "content": {
    "th": "เนื้อหาประกาศ...",
    "en": "Announcement content..."
  },
  "is_pinned": true,
  "published_at": "2024-12-25T10:00:00Z",
  "attachments": [
    {
      "id": 120,
      "file_name": "file1.pdf",
      "file_size": 2048576,
      "mime_type": "application/pdf",
      "download_url": "https://api.example.com/announcements/78/attachments/120/download"
    },
    {
      "id": 121,
      "file_name": "file2.docx",
      "file_size": 1024000,
      "mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      "download_url": "https://api.example.com/announcements/78/attachments/121/download"
    }
  ],
  "created_at": "2024-12-22T17:20:00Z"
}

5.2 Get Course Announcements

Request:

GET /api/courses/1/announcements?page=1&limit=10
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "data": [
    {
      "id": 78,
      "title": "ประกาศสำคัญ: เปลี่ยนแปลงตารางเรียน",
      "content": "เนื้อหาประกาศ...",
      "is_pinned": true,
      "published_at": "2024-12-25T10:00:00Z",
      "instructor": {
        "id": 5,
        "name": "Jane Smith",
        "avatar": "https://cdn.example.com/avatars/jane.jpg"
      },
      "attachments_count": 2,
      "created_at": "2024-12-22T17:20:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 25,
    "totalPages": 3
  }
}

6. Reports & Analytics

6.1 Student Progress Report

Request:

GET /api/students/courses/1/progress
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "course": {
    "id": 1,
    "title": "Python สำหรับผู้เริ่มต้น"
  },
  "enrollment": {
    "enrolled_at": "2024-12-22T16:05:00Z",
    "status": "enrolled"
  },
  "progress_percentage": 65,
  "completed_lessons": 29,
  "total_lessons": 45,
  "completed_quizzes": 3,
  "total_quizzes": 5,
  "quiz_scores": [
    {
      "quiz_id": 1,
      "title": "แบบทดสอบบทที่ 1",
      "best_score": 85,
      "attempts": 2,
      "is_passed": true
    },
    {
      "quiz_id": 2,
      "title": "แบบทดสอบบทที่ 2",
      "best_score": 90,
      "attempts": 1,
      "is_passed": true
    }
  ],
  "time_spent": "08:45:30",
  "last_activity": "2024-12-22T17:00:00Z",
  "estimated_completion": "2024-12-30T00:00:00Z"
}

6.2 Instructor Course Statistics

Request:

GET /api/instructor/courses/1/statistics
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "course": {
    "id": 1,
    "title": "Python สำหรับผู้เริ่มต้น"
  },
  "total_students": 1250,
  "active_students": 850,
  "completed_students": 400,
  "average_progress": 68,
  "average_rating": 4.8,
  "total_reviews": 320,
  "total_revenue": 1237500,
  "completion_rate": 32,
  "average_completion_time": "45 days",
  "quiz_statistics": {
    "average_score": 78,
    "pass_rate": 85
  },
  "engagement": {
    "daily_active_users": 120,
    "weekly_active_users": 450,
    "monthly_active_users": 850
  }
}

7. Payment Flow

7.1 Create Order

Request:

POST /api/orders
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "course_ids": [1, 5, 8]
}

Response 201:

{
  "order_id": 567,
  "user_id": 123,
  "total_amount": 3570,
  "status": "pending",
  "items": [
    {
      "course_id": 1,
      "title": "Python สำหรับผู้เริ่มต้น",
      "price": 990
    },
    {
      "course_id": 5,
      "title": "JavaScript Advanced",
      "price": 1290
    },
    {
      "course_id": 8,
      "title": "React Fundamentals",
      "price": 1290
    }
  ],
  "created_at": "2024-12-22T17:30:00Z",
  "expires_at": "2024-12-22T18:30:00Z"
}

7.2 Process Payment

Request:

POST /api/orders/567/payment
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

{
  "provider": "stripe",
  "payment_method_id": "pm_1234567890"
}

Response 200:

{
  "payment_id": 890,
  "order_id": 567,
  "status": "success",
  "provider": "stripe",
  "transaction_id": "txn_abc123xyz",
  "amount": 3570,
  "paid_at": "2024-12-22T17:32:00Z",
  "enrollments_created": [
    {
      "course_id": 1,
      "enrollment_id": 456
    },
    {
      "course_id": 5,
      "enrollment_id": 457
    },
    {
      "course_id": 8,
      "enrollment_id": 458
    }
  ]
}

8. Admin Operations

8.1 Approve Course

Request:

POST /api/admin/courses/25/approve
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "id": 25,
  "title": "JavaScript สำหรับผู้เริ่มต้น",
  "status": "approved",
  "approved_by": 1,
  "approved_at": "2024-12-22T17:40:00Z",
  "message": "Course approved successfully. Instructor has been notified."
}

8.2 System Statistics

Request:

GET /api/admin/statistics
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Response 200:

{
  "users": {
    "total": 10000,
    "students": 9850,
    "instructors": 150,
    "admins": 5,
    "new_this_month": 450
  },
  "courses": {
    "total": 500,
    "approved": 450,
    "pending": 30,
    "rejected": 20,
    "new_this_month": 25
  },
  "enrollments": {
    "total": 25000,
    "active": 18000,
    "completed": 7000,
    "new_this_month": 1200
  },
  "revenue": {
    "total": 12500000,
    "this_month": 850000,
    "last_month": 780000,
    "growth_percentage": 8.97
  },
  "engagement": {
    "daily_active_users": 2500,
    "weekly_active_users": 6000,
    "monthly_active_users": 9000
  }
}

📝 Notes

  • All timestamps are in ISO 8601 format (UTC)
  • All monetary values are in THB (Thai Baht)
  • File sizes are in bytes
  • Durations are in HH:MM:SS format
  • Multi-language fields support th and en keys