Supabase 1 — Khóa học APMATHS liên kết AI-CLO hiện có
Project đích duy nhất: yhfburffwzvcayjadskr. Không chạy các migration này trên Supabase 2 hoặc AI-CLO PTITHCM.
Nguyên tắc không làm hỏng môn học
subjectslà nguồn môn học duy nhất của AI-CLO. Không nhân bản môn từpersonal_courses.subject_memberslà nguồn quyết định quyền vào môn, bài kiểm tra và kết quả. Gói thương mại không tự sửa bảng này.personal_courses.subject_idchỉ là khóa ngoại chỉ tới môn đã có; dùng trang web/courses/apmaths/để giới thiệu và quản lý gói học, còn học tập diễn ra trong/ai-clo/app.html.- Không thay đổi các bảng
subjects,subject_members,profiles,questions,question_banks,exams,exam_attemptshoặc Edge Functions đang hoạt động. - Không cấp quyền học cho người mua trước khi có giao dịch được xác thực phía backend; chưa tích hợp payment provider trong đợt này.
Migrations đã áp dụng ngày 12/10/2026
File (trong supabase-personal/migrations/) |
Nội dung |
|---|---|
20261012155353_apmaths_personal_classes_and_offers_v1.sql |
Tạo 4 bảng phụ: personal_courses, personal_course_offers, personal_course_enrollments, personal_course_orders với RLS |
20261012163525_apmaths_personal_link_existing_subjects_v2.sql |
Khóa học muốn xuất bản phải liên kết một môn có sẵn; mỗi môn tối đa một trang khóa học; cấm đổi môn sau công bố hoặc sau khi có ghi danh |
Migration v2 không chèn, sửa, xóa bản ghi nào trong subjects hoặc subject_members. Chỉ bổ sung ràng buộc và trigger cho personal_courses.
Hiện trạng đối chiếu sau migration
- AI-CLO có 2 môn:
Đại số tuyến tính_UTC2_S4vàToán cơ sở_HK261. subject_memberscó 1 bản ghi thành viên (giảng viên môn Toán cơ sở), giữ nguyên trước/sau.personal_courseshiện 0 khóa học: chưa tự tạo trang thương mại hoặc liên kết môn.- Đã chạy SQL integration trong transaction có
ROLLBACK: Admin tạo nháp cho môn tồn tại, xuất bản thành công; không cho liên kết trùng, đổi môn đã xuất bản hoặc công bố khóa học chưa gắn môn. Không còn bản ghi thử sau rollback.
Giao diện
/courses/apmaths/: Admin của Supabase 1 chỉ được chọn một mônsubjectschưa gắn trang khóa học, tạo nội dung giới thiệu/gói nháp và công bố. Trang web không tạo môn mới. Người học nhìn thấy các môn họ được phép truy cập theo RLS của AI-CLO, kể cả các môn không có gói thương mại./ai-clo/app.html: menu Khóa học của tôi đối với sinh viên vẫn sử dụng danh sáchstate.subjectscủa AI-CLO, không tạo một danh sách lớp độc lập. Giảng viên/Admin vẫn thấy mục Môn học như cũ; nút Vào môn học được giữ nguyên.- Không có tự động cấp quyền sau khi đăng ký gói, vì chưa có thanh toán và bước xác minh backend.
Bảo mật và ghi danh
- Tài khoản Admin trong Supabase 2 không có quyền Admin trong Supabase 1. Admin Supabase 1 được xác định bằng
profiles.role='admin'vàis_active=true. - Mọi quyền vào bài học/kiểm tra tiếp tục dựa trên
subject_members.personal_course_enrollmentshiện chỉ theo dõi quyền lợi gói thương mại, không thay thế membership. - Admin có thể cấp thành viên môn bằng luồng AI-CLO hiện tại. Không được tự động upsert/xóa các bản ghi thành viên đang hoạt động từ logic thương mại.
- Khi bổ sung thanh toán, phải triển khai backend đối soát
paidvà cơ chế ghi danh idempotent, chỉ thêm membershipstudentkhi chưa tồn tại; tuyệt đối không ghi đè role giáo viên hay thành viên cũ.
Kiểm thử và rollback
- CI:
node --check ai-clo/js/ui/navigation.js,node --check courses/apmaths/courses.js,node --test tests/test-personal-course-bridge.mjs. - Kiểm thử DB trong transaction
BEGIN ... ROLLBACK, đối chiếu count/ID các môn và thành viên trước/sau. - Nếu giao diện có vấn đề, revert thay đổi GitHub trên nhánh để AI-CLO trở lại menu cũ. Không xóa môn, tài khoản, ngân hàng câu hỏi hoặc migration v1 để xử lý lỗi UI.
- Migration đã áp dụng trên Supabase 1: không chạy lại thủ công. Mọi rollback schema phải có migration riêng và xác minh không còn khóa học sử dụng liên kết trước khi gỡ ràng buộc.
Chưa Cloudinary/media, chưa thanh toán, chưa merge PR #4, chưa thay DNS hoặc chuyển hướng đường dẫn cũ.