RivaLMS
Tham khảo

Tài liệu API

Thao tác ghi dữ liệu đi qua các Route Handler trong src/app/api. Trang đọc dữ liệu trực tiếp bằng Prisma trong Server Component, nên không có API công khai để đọc danh mục khóa học. Các API nhận và trả JSON, xác thực bằng cookie phiên và tự kiểm tra quyền.

Xác thực

Đăng nhập và phiên do Auth.js xử lý.

GET
POST
/api/auth/[...nextauth]

Đăng nhập, đăng xuất và đọc phiên (Auth.js)

POST
/api/auth/change-password

Đổi mật khẩu (bắt buộc ở lần đăng nhập đầu)

POST
/api/auth/register

Tự đăng ký; trả 404 khi ALLOW_SELF_REGISTER khác true

GET
/api/auth/session-expired

Xóa cookie của phiên không còn hợp lệ (ví dụ tài khoản bị khóa) rồi chuyển về trang đăng nhập

Ví dụ: GET /api/auth/session

{
  "user": {
    "id": "clx...",
    "name": "...",
    "email": "learner@lms.rivasoft.vn",
    "role": "LEARNER",
    "mustChangePassword": false
  },
  "expires": "2026-10-26T00:00:00.000Z"
}

Khoa, khóa học và lớp học

Quản lý đào tạo (Quản lý đào tạo trở lên)
Quản lý đào tạo+

GET
POST
/api/admin/departments

Xem danh sách, tạo khoa

PATCH
DELETE
/api/admin/departments/[id]

Sửa, xóa khoa

POST
/api/admin/courses

Tạo khóa học

GET
PATCH
/api/admin/courses/[id]

Xem, sửa khóa học

POST
PATCH
/api/admin/courses/[id]/teachers

Phân công giảng viên, đổi vai trò giảng viên trong khóa

DELETE
/api/admin/courses/[id]/teachers/[userId]

Gỡ giảng viên khỏi khóa học

POST
/api/admin/classes

Tạo lớp học

GET
PATCH
/api/admin/classes/[id]

Xem, sửa lớp học

PATCH
/api/admin/classes/[id]/status

Đổi trạng thái lớp học

POST
/api/admin/classes/[id]/transfer

Chuyển lớp cho giảng viên phụ trách khác

POST
/api/admin/classes/[id]/enrollments

Ghi danh học viên vào lớp theo danh sách email hoặc tệp CSV

POST
/api/admin/classes/[id]/enrollments/[enrollmentId]/cancel

Hủy ghi danh của một học viên

POST
/api/admin/classes/[id]/enrollments/[enrollmentId]/transfer

Chuyển học viên sang lớp khác của cùng khóa học

POST
/api/admin/users

Tạo tài khoản (trả về mật khẩu tạm)

PATCH
/api/admin/users/[id]/role

Đổi vai trò

PATCH
/api/admin/users/[id]/status

Khóa hoặc mở khóa tài khoản

POST
/api/admin/users/[id]/reset-password

Đặt lại mật khẩu

PUT
/api/admin/settings/site-name

Đổi tên hệ thống (chỉ Quản trị hệ thống)

GET
/api/cron/chat-retention

Job định kỳ: xóa lịch sử trò chuyện AI cũ hơn CHAT_RETENTION_DAYS ngày (mặc định 180). Gọi kèm header Authorization: Bearer <CRON_SECRET>

Soạn nội dung (giảng viên được phân công, Quản lý đào tạo trở lên)
Giảng viên+

GET
POST
/api/trainer/courses/[courseId]/lessons

Xem danh sách, tạo bài học

PATCH
/api/trainer/courses/[courseId]/lessons/order

Sắp xếp thứ tự bài học

GET
PATCH
DELETE
/api/trainer/courses/[courseId]/lessons/[lessonId]

Xem, sửa, xóa bài học

POST
/api/trainer/courses/[courseId]/lessons/[lessonId]/materials

Thêm tài liệu

PATCH
DELETE
/api/trainer/courses/[courseId]/lessons/[lessonId]/materials/[materialId]

Sửa, xóa tài liệu

POST
/api/trainer/courses/[courseId]/lessons/[lessonId]/materials/from-library

Đưa một học liệu từ kho học liệu khóa học vào bài học (bản trong bài học tự cập nhật khi học liệu gốc được sửa)

GET
POST
/api/trainer/courses/[courseId]/library

Xem, thêm học liệu khóa học (video YouTube/Vimeo/MP4, PDF, hình ảnh, liên kết, văn bản) dùng chung cho mọi lớp

PATCH
DELETE
/api/trainer/courses/[courseId]/library/[itemId]

Sửa (đồng bộ sang các bài học đang dùng), xóa học liệu khóa học

GET
PUT
/api/trainer/courses/[courseId]/lessons/[lessonId]/materials/[materialId]/video-settings

Xem, lưu cài đặt video: xem tiếp, vị trí bắt đầu, ngưỡng hoàn thành (0–1), chế độ câu hỏi

GET
POST
/api/trainer/courses/[courseId]/lessons/[lessonId]/materials/[materialId]/quizzes

Xem danh sách mốc câu hỏi trong video (kèm đáp án), tạo mốc kèm câu hỏi Một lựa chọn / Nhiều lựa chọn / Đúng-Sai

PATCH
DELETE
/api/trainer/courses/[courseId]/lessons/[lessonId]/materials/[materialId]/quizzes/[quizId]

Sửa, xóa mốc câu hỏi; sửa câu hỏi, đáp án hoặc điểm khi đã có lần làm bài thì tăng phiên bản

GET
POST
/api/trainer/courses/[courseId]/lessons/[lessonId]/assignments

Xem danh sách, tạo bài tập của bài học

PATCH
DELETE
/api/trainer/courses/[courseId]/lessons/[lessonId]/assignments/[assignmentId]

Sửa, xóa bài tập (không xóa được khi đã có bài nộp)

PATCH
/api/trainer/courses/[courseId]/lessons/[lessonId]/assignments/[assignmentId]/classes/[classId]

Đặt hạn nộp riêng cho một lớp

GET
/api/trainer/grading

Hàng chờ chấm của giảng viên, lọc theo lớp, bài tập và trạng thái

GET
POST
/api/trainer/grading/[submissionId]

Xem bài nộp và lịch sử chấm; chấm điểm theo tiêu chí hoặc trả bài

Ghi danh và học tập

Dành cho mọi người đã đăng nhập.

POST
/api/enrollments

Ghi danh vào lớp học (lớp đang mở, cho phép tự ghi danh và còn chỗ)

GET
/api/enrollments

Danh sách ghi danh của bạn

POST
/api/lessons/complete

Đánh dấu hoàn thành bài học

POST
/api/assignments/submit

Nộp bài tập

POST
/api/assignments/[assignmentId]/submission

Nộp bài hoặc nộp lại (chỉ nộp lại khi bài bị trả về)

POST
/api/uploads

Tải file lên (multipart: file, kind)

GET
/api/files/[...key]

Tải file về; quyền đọc tùy loại file

POST
/api/ai/chat

Gửi tin nhắn cho trợ lý AI

POST
/api/ai/chat/stream

Gửi tin nhắn cho trợ lý AI, câu trả lời trả về dần (NDJSON)

GET
/api/ai/quota

Số lượt hỏi AI còn lại hôm nay

POST
/api/learning/quizzes/[quizId]/attempts

Bắt đầu hoặc tiếp tục lần làm bài của một mốc câu hỏi trong video (body: enrollmentId). Trả câu hỏi không kèm đáp án đúng; 409 khi hết lượt làm

POST
/api/learning/quiz-attempts/[attemptId]/submit

Nộp lần làm bài và chấm trên server. Header Idempotency-Key (không bắt buộc): gửi lại trả đúng kết quả cũ. Trả điểm (0–1), đạt hay chưa, trạng thái hoàn thành bài học

GET
/api/learning/materials/[materialId]/quiz-status

Trạng thái các mốc câu hỏi của một video theo ghi danh (enrollmentId), không kèm câu hỏi

GET
/api/learning/materials/[materialId]/video

Video tương tác của học viên (?enrollmentId=): cấu hình, vị trí xem tiếp, tỷ lệ đã xem và các mốc câu hỏi kèm trạng thái (không kèm câu hỏi, đáp án)

POST
/api/learning/materials/[materialId]/progress

Ghi nhận thời gian đã xem (heartbeat mỗi 15 giây, nhận cả sendBeacon): { enrollmentId, segments, positionSec, rate, durationSec, clientSeq }; tự hoàn thành bài học khi đủ điều kiện

Ví dụ: POST /api/enrollments

// Yêu cầu
{ "classId": "clx..." }

// Phản hồi
{
  "success": true,
  "enrollmentId": "clx...",
  "status": "PENDING",
  "courseSlug": "...",
  "message": "Đã gửi đăng ký. Đơn của bạn đang chờ duyệt."
}

Phản hồi lỗi

Mọi API trả lỗi cùng một dạng: message là thông báo tiếng Việt hiển thị được cho người dùng, code là mã lỗi để code xử lý.

// 401
{ "message": "Vui lòng đăng nhập để tiếp tục", "code": "UNAUTHORIZED" }

// 403
{ "message": "Bạn không có quyền thực hiện thao tác này", "code": "FORBIDDEN" }

// 403 (POST /api/enrollments)
{ "message": "Lớp học này không cho phép tự ghi danh. Vui lòng liên hệ quản lý đào tạo.", "code": "SELF_ENROLL_CLOSED" }

// 404
{ "message": "Không tìm thấy dữ liệu", "code": "NOT_FOUND" }