From 61a5fab0d98f3fd730d7eae138adaef30b058dc4 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 28 Jun 2026 18:19:13 +0200 Subject: [PATCH] Create the CMS-owned feature tables in the live DB (amx_test) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The live DB lacked 32 tables the conversion's own CMS features need (radio_*, game_*/challenges, staff_activities, alert_logs, email_templates, social_accounts, website_article_comments/reactions). Generated idempotent CREATE TABLE DDL from `prisma migrate diff` (CREATE statements ONLY — every ALTER/DROP excluded so no emulator-owned table is ever touched), as migration 0004. Applied to amx_test via the existing idempotent runner. 0005: radio_listener_points shipped as a stub (id+timestamps); the /radio/leaderboard raw query needs user_id + points, so add them (model + ALTER migration). Verified against amx_test: drift check now reports 0 missing modeled tables (live tables 255 -> 287), and a full route sweep logs ZERO prisma errors (radio/leaderboard + all radio pages 200). tsc 0, vitest 49/49, next build 0. --- prisma/migrations/0004_cms_feature_tables.sql | 440 ++++++++++++++++++ .../0005_radio_listener_points_columns.sql | 8 + prisma/schema.prisma | 2 + 3 files changed, 450 insertions(+) create mode 100644 prisma/migrations/0004_cms_feature_tables.sql create mode 100644 prisma/migrations/0005_radio_listener_points_columns.sql diff --git a/prisma/migrations/0004_cms_feature_tables.sql b/prisma/migrations/0004_cms_feature_tables.sql new file mode 100644 index 00000000..3f63d706 --- /dev/null +++ b/prisma/migrations/0004_cms_feature_tables.sql @@ -0,0 +1,440 @@ +-- 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; + diff --git a/prisma/migrations/0005_radio_listener_points_columns.sql b/prisma/migrations/0005_radio_listener_points_columns.sql new file mode 100644 index 00000000..44621b34 --- /dev/null +++ b/prisma/migrations/0005_radio_listener_points_columns.sql @@ -0,0 +1,8 @@ +-- radio_listener_points was created as a stub (id + timestamps only) but the +-- /radio/leaderboard query joins users on user_id and orders by points. Add the +-- real columns. Idempotent (MariaDB ADD COLUMN / INDEX IF NOT EXISTS). +ALTER TABLE radio_listener_points + ADD COLUMN IF NOT EXISTS user_id INT NOT NULL DEFAULT 0, + ADD COLUMN IF NOT EXISTS points INT NOT NULL DEFAULT 0; + +CREATE INDEX IF NOT EXISTS radio_listener_points_points_idx ON radio_listener_points (points); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 54b7f098..c80989b8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -2106,6 +2106,8 @@ model RadioGiveaways { model RadioListenerPoints { id BigInt @id @default(autoincrement()) @db.UnsignedBigInt + userId Int @map("user_id") + points Int @default(0) createdAt DateTime? @map("created_at") @db.Timestamp(0) updatedAt DateTime? @map("updated_at") @db.Timestamp(0)