-- Forum Phase 5: Achievement system + topic subscriptions CREATE TABLE `achievements` ( `key` VARCHAR(50) NOT NULL, `name` VARCHAR(50) NOT NULL, `description` VARCHAR(200) NOT NULL, `icon` VARCHAR(20) NOT NULL, `tier` VARCHAR(20) NOT NULL DEFAULT 'bronze', `points` INT NOT NULL DEFAULT 0, `category` VARCHAR(30) NOT NULL DEFAULT 'general', `sort_order` INT NOT NULL DEFAULT 0, `is_active` BOOLEAN NOT NULL DEFAULT TRUE, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`key`), INDEX `achievements_category_is_active_sort_order_idx`(`category`, `is_active`, `sort_order`) ); CREATE TABLE `user_achievements` ( `id` INT NOT NULL AUTO_INCREMENT, `user_id` INT NOT NULL, `achievement_key` VARCHAR(50) NOT NULL, `progress` INT NOT NULL DEFAULT 0, `unlocked_at` DATETIME(3) NULL, `notified_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), UNIQUE INDEX `user_achievements_user_id_achievement_key_key`(`user_id`, `achievement_key`), INDEX `user_achievements_user_id_unlocked_at_idx`(`user_id`, `unlocked_at`), INDEX `user_achievements_achievement_key_idx`(`achievement_key`) ); CREATE TABLE `forum_topic_subscriptions` ( `id` INT NOT NULL AUTO_INCREMENT, `topic_id` INT NOT NULL, `user_id` INT NOT NULL, `notify_reply` BOOLEAN NOT NULL DEFAULT TRUE, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), UNIQUE INDEX `forum_topic_subscriptions_topic_id_user_id_key`(`topic_id`, `user_id`), INDEX `forum_topic_subscriptions_user_id_created_at_idx`(`user_id`, `created_at`) );