Supabase 2 — APMATHS Platform (giáo viên bên ngoài)
Chỉ dành cho project mhgsvxsjrzaeafvifydu. Database/Authentication độc lập hoàn toàn với Supabase 1 (yhfburffwzvcayjadskr) và AI-CLO PTITHCM.
Các migration đã áp dụng ngày 12/10/2026
Migration trong supabase/migrations/ |
Mục đích |
|---|---|
20261012150743_apmaths_platform_core_v1.sql |
8 bảng tài khoản/hồ sơ, xét duyệt, workspace, lớp, ghi danh, mã mời |
20261012151205_apmaths_platform_security_v2.sql |
Schema riêng cho privileged RPC, RLS và giới hạn GRANT |
20261012152052_apmaths_platform_profiles_rls_v3.sql |
Tối ưu policy xem hồ sơ chính mình/học sinh cùng lớp |
20261012154209_apmaths_platform_class_lifecycle_v4.sql |
Xóa học sinh khỏi lớp/rời lớp qua RPC |
20261012154346_apmaths_platform_exams_v5.sql |
Ngân hàng câu hỏi riêng, đề lớp, lượt làm, chấm điểm phía server |
20261012155111_apmaths_platform_expired_attempt_fix_v6.sql |
Chốt trạng thái hết hạn bài làm |
20261012155553_apmaths_platform_plans_foundation_v7.sql |
Danh mục gói, gói miễn phí tự gán workspace, usage events nội bộ |
20261012160743_apmaths_platform_fk_indexes_v8.sql |
Bổ sung index cho khóa ngoại composite của ngân hàng và đề thi |
Các migration đã được apply trên Supabase 2, không chạy lại thủ công. Source SQL lưu để đối soát và phục hồi trên project mới. Các bảng public mới đều bật RLS; app_private không lộ qua Data API.
Đợt 3B — Tài khoản Admin
- Tài khoản
[email protected]tồn tại, email đã xác minh trên Supabase 2. - Đã cấp quyền
platform_adminduy nhất cho tài khoản trên theo email và trạng thái đã xác minh; truy vấn update trảupdated=1. - Không dùng
user_metadatađể cấp quyền và không tạo đường dẫn cấp Admin từ browser. - Kiểm tra Supabase Dashboard > Authentication > URL Configuration: Site URL và Redirect allowlist cho
https://apmaths.io.vn/platform/+ Preview cụ thể, không allow wildcard tùy tiện. - Kiểm tra Authentication > Providers: yêu cầu xác minh email, chính sách mật khẩu, CAPTCHA/rate limits. Leaked password protection có thể yêu cầu gói Pro; xem cảnh báo trên Security Advisor.
- Thử xác minh email + đăng nhập trên domain Cloudflare bằng tài khoản giáo viên/học sinh thử thật, không sử dụng tài khoản Admin cho đăng ký công khai.
- Thử duyệt/từ chối qua UI, tạo lớp, mời học sinh, bài làm có thời gian thực qua trình duyệt.
Đợt 3C — Lớp và học sinh
Trang /platform/: Teacher duyệt có workspace của mình, tạo/đổi tên/lưu trữ lớp, tạo mã mời 32 ký tự ngẫu nhiên, xem/xóa học sinh; Student nhận mã và có thể rời lớp. Mã mời dùng tối đa 30 lượt/7 ngày theo lựa chọn mặc định UI, lưu sha256 trong database. Các thao tác đặc quyền qua RPC đã xác minh UID/role/ownership.
Đợt 3D — Ngân hàng và kiểm tra
Trang /platform/exams/: giáo viên tạo bank, thêm câu A–D, tạo đề nháp, gán câu hỏi và công bố. Student chỉ đọc đề đã công bố trong lớp ghi danh qua platform_start_exam, không đọc được khóa đáp án trong bảng; nộp và chấm platform_submit_exam ở database. Tài khoản có một lượt/đề trong v1. Phần câu hỏi tự luận, CLO và AI chưa được triển khai trên Supabase 2.
Đợt 4 — Gói dịch vụ (chưa có thu phí thực tế)
Đã tạo platform_service_plans (free công khai, teacher_pro ẩn chưa chốt giá), platform_workspace_subscriptions và platform_usage_events (chỉ backend). Khi workspace hình thành, trigger tự cấp quyền free. Chưa tích hợp thanh toán, chưa kích hoạt Teacher Pro, chưa enforce hạn mức trả phí.
Kiểm thử đã chạy (rollback transaction)
- Auth metadata giả
role=platform_adminkhông nâng quyền. - Học sinh/giáo viên chưa duyệt không thể duyệt hồ sơ.
- Giáo viên A/B không đọc chéo workspace, danh sách học sinh, câu hỏi hoặc đáp án.
- Admin duyệt tạo workspace; teacher tạo lớp/mã mời; student tham gia.
- Đề sau xuất bản khóa đáp án; student chỉ nhận câu hỏi/phương án; chấm điểm ở backend.
- Hết thời gian thì trạng thái
expiredđược ghi đúng. - Workspace mới nhận gói
free. - Các bản ghi thử đều
ROLLBACK, không tạo học sinh thật.
Theo dõi bảo mật
Advisors: bảng class_invites, teacher_application_events và platform_usage_events chủ ý deny-all/no Data API access (RLS enabled, no policy). Không xóa chính sách bảo vệ chỉ để làm mất thông báo INFO. Bật leaked password protection nếu plan cho phép; có thể dùng CAPTCHA và mật khẩu mạnh khi tính năng này không khả dụng.
Lưu ý phát hành: Build/SQL test không thay thế kiểm thử email redirect, quản trị và quyền riêng tư trên trình duyệt thực tế. Không tự merge PR #4 hoặc mở signup đại trà trước khi kiểm thử này đạt.