36459-vm/db/migrations/001_create_initial_tables.sql
2025-11-29 17:28:26 +00:00

166 lines
6.7 KiB
SQL

-- Migration: 001_create_initial_tables.sql
-- Timestamp: 2025-11-29 12:00:00 UTC
-- Description: Create initial tables for coding challenges, submissions, badges, competitions, and certificates.
SET aUTocommit=0;
START TRANSACTION;
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_username` (`username`),
UNIQUE KEY `uq_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `challenges`
--
CREATE TABLE IF NOT EXISTS `challenges` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`description` TEXT NOT NULL,
`learning_style` ENUM('visual', 'auditory', 'read_write', 'kinesthetic') NOT NULL,
`challenge_type` ENUM('python', 'logic', 'data-analysis', 'html-css') NOT NULL,
`difficulty` ENUM('beginner', 'intermediate', 'advanced') NOT NULL,
`time_limit_minutes` INT UNSIGNED DEFAULT NULL,
`max_attempts` INT UNSIGNED DEFAULT NULL,
`sample_cases_json` JSON DEFAULT NULL,
`unit_tests_json` JSON DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `challenge_submissions`
--
CREATE TABLE IF NOT EXISTS `challenge_submissions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL,
`challenge_id` BIGINT UNSIGNED NOT NULL,
`language` VARCHAR(50) NOT NULL,
`submission_content` TEXT NOT NULL,
`score` INT DEFAULT NULL,
`status` ENUM('pending', 'auto_graded', 'manual_review', 'passed', 'failed') NOT NULL DEFAULT 'pending',
`auto_grade_result` JSON DEFAULT NULL,
`execution_time_ms` INT UNSIGNED DEFAULT NULL,
`memory_kb` INT UNSIGNED DEFAULT NULL,
`attempt_number` INT UNSIGNED NOT NULL DEFAULT 1,
`submitted_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_challenge_id` (`challenge_id`),
CONSTRAINT `fk_submission_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_submission_challenge` FOREIGN KEY (`challenge_id`) REFERENCES `challenges` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `badges`
--
CREATE TABLE IF NOT EXISTS `badges` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`description` TEXT,
`icon_url` VARCHAR(255) DEFAULT NULL,
`criteria_json` JSON DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_badge_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `user_badges`
--
CREATE TABLE IF NOT EXISTS `user_badges` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL,
`badge_id` BIGINT UNSIGNED NOT NULL,
`awarded_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_user_badge` (`user_id`, `badge_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_badge_id` (`badge_id`),
CONSTRAINT `fk_user_badge_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_user_badge_badge` FOREIGN KEY (`badge_id`) REFERENCES `badges` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `competitions`
--
CREATE TABLE IF NOT EXISTS `competitions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`description` TEXT,
`start_date` DATETIME NOT NULL,
`end_date` DATETIME NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `competition_participants`
--
CREATE TABLE IF NOT EXISTS `competition_participants` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL,
`competition_id` BIGINT UNSIGNED NOT NULL,
`status` ENUM('registered', 'withdrew', 'disqualified') NOT NULL DEFAULT 'registered',
`results_json` JSON DEFAULT NULL,
`joined_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_user_competition` (`user_id`, `competition_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_competition_id` (`competition_id`),
CONSTRAINT `fk_participant_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_participant_competition` FOREIGN KEY (`competition_id`) REFERENCES `competitions` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `certificates`
--
CREATE TABLE IF NOT EXISTS `certificates` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL,
`competition_id` BIGINT UNSIGNED NOT NULL,
`certificate_type` ENUM('participation', 'winner', 'improvement') NOT NULL,
`certificate_url` VARCHAR(255) NOT NULL,
`issued_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`issued_by_user_id` BIGINT UNSIGNED DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_competition_id` (`competition_id`),
CONSTRAINT `fk_certificate_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_certificate_competition` FOREIGN KEY (`competition_id`) REFERENCES `competitions` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `audit_log`
--
CREATE TABLE IF NOT EXISTS `audit_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED DEFAULT NULL,
`action` VARCHAR(255) NOT NULL,
`details` JSON DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_action` (`action`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
COMMIT;