Implement Enterprise Logic (Redis, Phone Auth, Full Schema)
This commit is contained in:
@@ -0,0 +1,271 @@
|
||||
-- ==============================================================================
|
||||
-- SAQEL PLATFORM (منصة صَقِل) - PRIMARY DATABASE SCHEMA (MySQL 8.4+)
|
||||
-- Complete Production Database Definition
|
||||
-- ==============================================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 1. Table: schools (المدارس والجهات الشريكة - B2B مثل الثقافة العسكرية)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `schools`;
|
||||
CREATE TABLE `schools` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`uuid` CHAR(36) NOT NULL,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`code` VARCHAR(50) NOT NULL UNIQUE,
|
||||
`type` ENUM('military_culture', 'private', 'public', 'center') NOT NULL DEFAULT 'private',
|
||||
`director_name` VARCHAR(255) DEFAULT NULL,
|
||||
`phone` VARCHAR(50) DEFAULT NULL,
|
||||
`city` VARCHAR(100) DEFAULT 'Amman',
|
||||
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_schools_uuid` (`uuid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 2. Table: users (المستخدمون الموحدون - طلاب، معلمون، أولياء أمور، إدارة)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `users`;
|
||||
CREATE TABLE `users` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`uuid` CHAR(36) NOT NULL,
|
||||
`full_name` TEXT NOT NULL,
|
||||
`phone_number` TEXT NOT NULL,
|
||||
`phone_hash` VARCHAR(64) NOT NULL,
|
||||
`password_hash` VARCHAR(255) NOT NULL,
|
||||
`role` ENUM('student', 'guardian', 'teacher', 'school_admin', 'super_admin') NOT NULL DEFAULT 'student',
|
||||
`school_id` BIGINT UNSIGNED DEFAULT NULL,
|
||||
`grade_level` VARCHAR(50) DEFAULT 'tawjihi_2007',
|
||||
`stream` ENUM('scientific', 'literary', 'vocational', 'general') DEFAULT 'scientific',
|
||||
`token_version` INT UNSIGNED NOT NULL DEFAULT 1,
|
||||
`status` ENUM('active', 'pending_otp', 'suspended') NOT NULL DEFAULT 'pending_otp',
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_users_uuid` (`uuid`),
|
||||
KEY `idx_users_phone_hash` (`phone_hash`),
|
||||
KEY `idx_users_school_id` (`school_id`),
|
||||
CONSTRAINT `fk_users_school` FOREIGN KEY (`school_id`) REFERENCES `schools` (`id`) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 3. Table: guardian_student (ربط أولياء الأمور بالأبناء - N:M)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `guardian_student`;
|
||||
CREATE TABLE `guardian_student` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`guardian_id` BIGINT UNSIGNED NOT NULL,
|
||||
`student_id` BIGINT UNSIGNED NOT NULL,
|
||||
`relationship_type` ENUM('father', 'mother', 'brother', 'guardian') NOT NULL DEFAULT 'father',
|
||||
`is_verified` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_guardian_student_unique` (`guardian_id`, `student_id`),
|
||||
KEY `idx_guardian_student_student` (`student_id`),
|
||||
CONSTRAINT `fk_gs_guardian` FOREIGN KEY (`guardian_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_gs_student` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 4. Table: teacher_profiles (ملفات المعلمين ونسب الأرباح)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `teacher_profiles`;
|
||||
CREATE TABLE `teacher_profiles` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` BIGINT UNSIGNED NOT NULL,
|
||||
`bio` TEXT DEFAULT NULL,
|
||||
`specialization` VARCHAR(150) NOT NULL,
|
||||
`revenue_share_pct` DECIMAL(5,2) NOT NULL DEFAULT 45.00,
|
||||
`contract_type` ENUM('exclusive', 'non_exclusive') NOT NULL DEFAULT 'exclusive',
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_teacher_user` (`user_id`),
|
||||
CONSTRAINT `fk_teacher_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 5. Table: subjects (المواد التعليمية)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `subjects`;
|
||||
CREATE TABLE `subjects` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(150) NOT NULL,
|
||||
`code` VARCHAR(50) NOT NULL UNIQUE,
|
||||
`stream` ENUM('scientific', 'literary', 'common') NOT NULL DEFAULT 'common',
|
||||
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 6. Table: courses (الدورات التدريبية)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `courses`;
|
||||
CREATE TABLE `courses` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`uuid` CHAR(36) NOT NULL,
|
||||
`subject_id` BIGINT UNSIGNED NOT NULL,
|
||||
`teacher_id` BIGINT UNSIGNED NOT NULL,
|
||||
`title` VARCHAR(255) NOT NULL,
|
||||
`description` TEXT DEFAULT NULL,
|
||||
`semester` ENUM('first', 'second', 'full_year', 'intensive') NOT NULL DEFAULT 'first',
|
||||
`price_jod` DECIMAL(8,2) NOT NULL DEFAULT 35.00,
|
||||
`thumbnail_url` VARCHAR(500) DEFAULT NULL,
|
||||
`is_published` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_courses_uuid` (`uuid`),
|
||||
KEY `idx_courses_subject` (`subject_id`),
|
||||
KEY `idx_courses_teacher` (`teacher_id`),
|
||||
CONSTRAINT `fk_courses_subject` FOREIGN KEY (`subject_id`) REFERENCES `subjects` (`id`) ON DELETE RESTRICT,
|
||||
CONSTRAINT `fk_courses_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 7. Table: lessons (الدروس والفيديوهات المربوطة بـ Bunny Stream)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `lessons`;
|
||||
CREATE TABLE `lessons` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`course_id` BIGINT UNSIGNED NOT NULL,
|
||||
`title` VARCHAR(255) NOT NULL,
|
||||
`sequence_order` INT UNSIGNED NOT NULL DEFAULT 1,
|
||||
`bunny_video_id` VARCHAR(100) NOT NULL,
|
||||
`duration_seconds` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`is_free_preview` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_lessons_course` (`course_id`),
|
||||
CONSTRAINT `fk_lessons_course` FOREIGN KEY (`course_id`) REFERENCES `courses` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 8. Table: quizzes (الكويزات داخل الفيديو - Socratic Checkpoints)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `quizzes`;
|
||||
CREATE TABLE `quizzes` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`lesson_id` BIGINT UNSIGNED NOT NULL,
|
||||
`title` VARCHAR(255) NOT NULL,
|
||||
`timestamp_seconds` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`is_mandatory` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`rewind_on_fail_seconds` INT UNSIGNED NOT NULL DEFAULT 45,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_quizzes_lesson` (`lesson_id`),
|
||||
CONSTRAINT `fk_quizzes_lesson` FOREIGN KEY (`lesson_id`) REFERENCES `lessons` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 9. Table: questions (الأسئلة)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `questions`;
|
||||
CREATE TABLE `questions` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`quiz_id` BIGINT UNSIGNED NOT NULL,
|
||||
`question_text` TEXT NOT NULL,
|
||||
`explanation_text` TEXT DEFAULT NULL,
|
||||
`points` INT UNSIGNED NOT NULL DEFAULT 1,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_questions_quiz` (`quiz_id`),
|
||||
CONSTRAINT `fk_questions_quiz` FOREIGN KEY (`quiz_id`) REFERENCES `quizzes` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 10. Table: question_options (خيارات الإجابة)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `question_options`;
|
||||
CREATE TABLE `question_options` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`question_id` BIGINT UNSIGNED NOT NULL,
|
||||
`option_text` TEXT NOT NULL,
|
||||
`is_correct` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_options_question` (`question_id`),
|
||||
CONSTRAINT `fk_options_question` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 11. Table: lesson_progress (سجل متابعة ونبض المشاهدة)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `lesson_progress`;
|
||||
CREATE TABLE `lesson_progress` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` BIGINT UNSIGNED NOT NULL,
|
||||
`lesson_id` BIGINT UNSIGNED NOT NULL,
|
||||
`last_watched_second` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`max_watched_second` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`completion_pct` DECIMAL(5,2) NOT NULL DEFAULT 0.00,
|
||||
`is_completed` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_user_lesson_progress` (`user_id`, `lesson_id`),
|
||||
KEY `idx_progress_lesson` (`lesson_id`),
|
||||
CONSTRAINT `fk_progress_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_progress_lesson` FOREIGN KEY (`lesson_id`) REFERENCES `lessons` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 12. Table: voice_notes (الملاحظات الصوتية والتفريغ الذكي)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `voice_notes`;
|
||||
CREATE TABLE `voice_notes` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`uuid` CHAR(36) NOT NULL,
|
||||
`user_id` BIGINT UNSIGNED NOT NULL,
|
||||
`lesson_id` BIGINT UNSIGNED NOT NULL,
|
||||
`timestamp_seconds` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`audio_url` VARCHAR(500) NOT NULL,
|
||||
`transcript_text` TEXT DEFAULT NULL,
|
||||
`ai_summary` TEXT DEFAULT NULL,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_voice_notes_uuid` (`uuid`),
|
||||
KEY `idx_voice_notes_user_lesson` (`user_id`, `lesson_id`),
|
||||
CONSTRAINT `fk_vn_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_vn_lesson` FOREIGN KEY (`lesson_id`) REFERENCES `lessons` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 13. Table: user_devices (بصمة الأجهزة المربوطة بالجلسات)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `user_devices`;
|
||||
CREATE TABLE `user_devices` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` BIGINT UNSIGNED NOT NULL,
|
||||
`device_fingerprint` VARCHAR(64) NOT NULL,
|
||||
`device_name` VARCHAR(150) DEFAULT NULL,
|
||||
`platform` ENUM('android', 'ios', 'windows', 'macos', 'web') NOT NULL,
|
||||
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`last_active_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_user_device_fingerprint` (`user_id`, `device_fingerprint`),
|
||||
CONSTRAINT `fk_ud_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ------------------------------------------------------------------------------
|
||||
-- 14. Table: otp_verifications (رموز التحقق عبر منصة صقل)
|
||||
-- ------------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `otp_verifications`;
|
||||
CREATE TABLE `otp_verifications` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`phone_hash` VARCHAR(64) NOT NULL,
|
||||
`otp_code_hash` VARCHAR(255) NOT NULL,
|
||||
`attempts` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`is_used` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`expires_at` TIMESTAMP NOT NULL,
|
||||
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_otp_phone_hash` (`phone_hash`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
Reference in New Issue
Block a user