-- 0004_cms_feature_tables.sql -- Idempotent CREATE TABLE for the CMS-owned (website-tier) feature tables -- the AtomCMS-Next conversion needs but the live emulator DB lacks: -- radio_*, game_*/challenges, staff_activities, alert_logs, email_templates, -- social_accounts, website_article_comments/reactions. Generated from -- `prisma migrate diff` (CREATE statements only; all ALTER/DROP excluded so -- emulator-owned tables are never touched). Each statement is IF NOT EXISTS. CREATE TABLE IF NOT EXISTS `website_article_reactions` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` INTEGER UNSIGNED NOT NULL, `article_id` BIGINT UNSIGNED NOT NULL, `reaction` VARCHAR(50) NOT NULL, `active` BOOLEAN NOT NULL DEFAULT true, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `website_article_comments` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `article_id` BIGINT UNSIGNED NOT NULL, `user_id` INTEGER NOT NULL, `comment` VARCHAR(255) NOT NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `alert_logs` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `type` VARCHAR(255) NOT NULL, `severity` VARCHAR(255) NOT NULL, `message` TEXT NOT NULL, `context` JSON NULL, `sent_via_email` BOOLEAN NOT NULL DEFAULT false, `sent_via_discord` BOOLEAN NOT NULL DEFAULT false, `is_read` BOOLEAN NOT NULL DEFAULT false, `read_at` TIMESTAMP(0) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_ranks` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `description` VARCHAR(255) NULL, `badge_code` VARCHAR(255) NULL, `is_active` BOOLEAN NOT NULL DEFAULT true, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_shouts` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `message` TEXT NOT NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_applications` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `real_name` VARCHAR(255) NOT NULL, `age` INTEGER NOT NULL, `availability` TEXT NOT NULL, `experience` TEXT NULL, `motivation` TEXT NOT NULL, `music_style` TEXT NULL, `discord_username` VARCHAR(255) NULL, `rank_id` BIGINT UNSIGNED NULL, `status` VARCHAR(255) NOT NULL DEFAULT 'pending', `approved_by` BIGINT UNSIGNED NULL, `approved_at` TIMESTAMP(0) NULL, `rejected_by` BIGINT UNSIGNED NULL, `rejected_at` TIMESTAMP(0) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_schedules` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `day` VARCHAR(255) NOT NULL, `start_time` TIME NOT NULL, `end_time` TIME NOT NULL, `show_name` VARCHAR(255) NULL, `description` TEXT NULL, `is_active` BOOLEAN NOT NULL DEFAULT true, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_banners` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `image_path` VARCHAR(255) NOT NULL, `title` VARCHAR(255) NULL, `description` TEXT NULL, `sort_order` INTEGER NOT NULL DEFAULT 0, `is_active` BOOLEAN NOT NULL DEFAULT true, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_history` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `show_name` VARCHAR(255) NULL, `started_at` TIMESTAMP(0) NOT NULL, `ended_at` TIMESTAMP(0) NULL, `listeners_count` INTEGER NOT NULL DEFAULT 0, `notes` TEXT NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_contests` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_giveaways` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_listener_points` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_song_requests` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_song_votes` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_scores` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` INTEGER UNSIGNED NOT NULL, `game` VARCHAR(50) NOT NULL, `score` INTEGER NOT NULL DEFAULT 0, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_rooms` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `game` VARCHAR(50) NOT NULL, `player1_id` INTEGER UNSIGNED NOT NULL, `player2_id` INTEGER UNSIGNED NULL, `state` JSON NULL, `turn` INTEGER UNSIGNED NOT NULL DEFAULT 1, `winner_id` INTEGER UNSIGNED NULL, `status` VARCHAR(191) NOT NULL DEFAULT 'waiting', `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_reward_claims` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `game` VARCHAR(50) NOT NULL, `wins_required` INTEGER NOT NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `game_reward_claims_user_id_game_wins_required_key`(`user_id`, `game`, `wins_required`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_chat_messages` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `room_id` BIGINT UNSIGNED NOT NULL, `user_id` BIGINT UNSIGNED NOT NULL, `message` TEXT NOT NULL, `type` VARCHAR(191) NOT NULL DEFAULT 'chat', `reactions` JSON NULL, `created_at` TIMESTAMP(0) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_replays` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `game` VARCHAR(191) NOT NULL, `player1_id` BIGINT UNSIGNED NOT NULL, `player2_id` BIGINT UNSIGNED NULL, `game_data` JSON NOT NULL, `moves` JSON NOT NULL, `winner` VARCHAR(191) NULL, `player1_score` INTEGER NOT NULL DEFAULT 0, `player2_score` INTEGER NOT NULL DEFAULT 0, `started_at` TIMESTAMP(0) NOT NULL, `ended_at` TIMESTAMP(0) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_ranks` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(191) NOT NULL, `slug` VARCHAR(191) NOT NULL, `icon` VARCHAR(191) NOT NULL DEFAULT '⭐', `color` VARCHAR(191) NOT NULL DEFAULT '#ffffff', `min_points` INTEGER NOT NULL DEFAULT 0, `max_points` INTEGER NULL, `tier` INTEGER NOT NULL DEFAULT 1, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `game_ranks_slug_key`(`slug`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `user_game_ranks` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `game` VARCHAR(191) NOT NULL, `rank_id` BIGINT UNSIGNED NOT NULL, `points` INTEGER NOT NULL DEFAULT 0, `wins` INTEGER NOT NULL DEFAULT 0, `games_played` INTEGER NOT NULL DEFAULT 0, `win_streak` INTEGER NOT NULL DEFAULT 0, `best_streak` INTEGER NOT NULL DEFAULT 0, `last_played_at` TIMESTAMP(0) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `user_game_ranks_user_id_game_key`(`user_id`, `game`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_invitations` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `from_user_id` BIGINT UNSIGNED NOT NULL, `to_user_id` BIGINT UNSIGNED NOT NULL, `game` VARCHAR(255) NOT NULL, `status` VARCHAR(255) NOT NULL DEFAULT 'pending', `bet_amount` INTEGER NOT NULL DEFAULT 0, `bet_currency` VARCHAR(255) NOT NULL DEFAULT 'credits', `room_id` BIGINT UNSIGNED NULL, `expires_at` TIMESTAMP(0) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `user_game_xp` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `game` VARCHAR(255) NOT NULL, `xp` INTEGER NOT NULL DEFAULT 0, `level` INTEGER NOT NULL DEFAULT 1, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `user_game_xp_user_id_game_key`(`user_id`, `game`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `game_level_rewards` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `game` VARCHAR(255) NOT NULL, `level` INTEGER NOT NULL, `reward_type` VARCHAR(255) NOT NULL, `reward_currency` VARCHAR(255) NULL, `reward_amount` INTEGER NOT NULL DEFAULT 0, `claimed` BOOLEAN NOT NULL DEFAULT false, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `daily_challenges` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `description` VARCHAR(255) NOT NULL, `game` VARCHAR(255) NULL, `type` VARCHAR(255) NOT NULL, `target` INTEGER NOT NULL, `reward_currency` VARCHAR(255) NOT NULL DEFAULT 'credits', `reward_amount` INTEGER NOT NULL, `date` DATE NOT NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `user_challenge_progress` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `challenge_id` BIGINT UNSIGNED NOT NULL, `progress` INTEGER NOT NULL DEFAULT 0, `completed` BOOLEAN NOT NULL DEFAULT false, `claimed` BOOLEAN NOT NULL DEFAULT false, `completed_at` TIMESTAMP(0) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `user_challenge_progress_user_id_challenge_id_key`(`user_id`, `challenge_id`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `staff_activities` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `action` VARCHAR(50) NOT NULL, `target_type` VARCHAR(100) NULL, `target_id` BIGINT UNSIGNED NULL, `description` TEXT NOT NULL, `ip_address` VARCHAR(45) NULL, `metadata` JSON NULL, `created_at` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `email_templates` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `subject` VARCHAR(255) NOT NULL, `body` TEXT NOT NULL, `variables` TEXT NULL, `is_active` BOOLEAN NOT NULL DEFAULT true, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `email_templates_name_key`(`name`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `social_accounts` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` BIGINT UNSIGNED NOT NULL, `provider` VARCHAR(255) NOT NULL, `provider_id` VARCHAR(255) NOT NULL, `avatar` VARCHAR(255) NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `social_accounts_provider_provider_id_key`(`provider`, `provider_id`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_api_keys` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `key` VARCHAR(64) NOT NULL, `allowed_ips` VARCHAR(255) NULL, `permissions` JSON NULL, `rate_limit` INTEGER NOT NULL DEFAULT 300, `last_used_at` TIMESTAMP(0) NULL, `expires_at` TIMESTAMP(0) NULL, `is_active` BOOLEAN NOT NULL DEFAULT true, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, UNIQUE INDEX `radio_api_keys_key_key`(`key`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_song_plays` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `artist` VARCHAR(255) NULL, `album` VARCHAR(255) NULL, `artwork_url` VARCHAR(255) NULL, `duration` INTEGER UNSIGNED NULL, `played_at` TIMESTAMP(0) NOT NULL, `dj_id` BIGINT UNSIGNED NULL, `metadata` JSON NULL, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `radio_auto_dj_playlist` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `artist` VARCHAR(255) NULL, `album` VARCHAR(255) NULL, `artwork_url` VARCHAR(255) NULL, `duration` INTEGER UNSIGNED NULL, `play_count` INTEGER UNSIGNED NOT NULL DEFAULT 0, `last_played_at` TIMESTAMP(0) NULL, `is_active` BOOLEAN NOT NULL DEFAULT true, `sort_order` INTEGER UNSIGNED NOT NULL DEFAULT 0, `created_at` TIMESTAMP(0) NULL, `updated_at` TIMESTAMP(0) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;