From 4bd25d4e3cffbc0c3356b341beb1dea9b6d30927 Mon Sep 17 00:00:00 2001 From: Developer Date: Tue, 2 Dec 2025 07:23:43 -0800 Subject: [PATCH] =?UTF-8?q?feat(leaderboard-service):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20Prisma=20=E5=88=9D=E5=A7=8B=20migration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 leaderboard_rankings 表 - 创建 leaderboard_configs 表 - 创建 virtual_accounts 表 - 创建 virtual_ranking_entries 表 - 创建 leaderboard_snapshots 表 - 创建 virtual_account_transactions 表 - 创建 leaderboard_events 表 - 插入默认配置数据 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../20241202000000_init/migration.sql | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 backend/services/leaderboard-service/prisma/migrations/20241202000000_init/migration.sql diff --git a/backend/services/leaderboard-service/prisma/migrations/20241202000000_init/migration.sql b/backend/services/leaderboard-service/prisma/migrations/20241202000000_init/migration.sql new file mode 100644 index 00000000..ab349a18 --- /dev/null +++ b/backend/services/leaderboard-service/prisma/migrations/20241202000000_init/migration.sql @@ -0,0 +1,192 @@ +-- CreateTable +CREATE TABLE "leaderboard_rankings" ( + "ranking_id" BIGSERIAL NOT NULL, + "leaderboard_type" VARCHAR(30) NOT NULL, + "period_key" VARCHAR(20) NOT NULL, + "user_id" BIGINT NOT NULL, + "is_virtual" BOOLEAN NOT NULL DEFAULT false, + "rank_position" INTEGER NOT NULL, + "display_position" INTEGER NOT NULL, + "previous_rank" INTEGER, + "total_team_planting" INTEGER NOT NULL DEFAULT 0, + "max_direct_team_planting" INTEGER NOT NULL DEFAULT 0, + "effective_score" INTEGER NOT NULL DEFAULT 0, + "user_snapshot" JSONB NOT NULL, + "period_start_at" TIMESTAMP(3) NOT NULL, + "period_end_at" TIMESTAMP(3) NOT NULL, + "calculated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "leaderboard_rankings_pkey" PRIMARY KEY ("ranking_id") +); + +-- CreateTable +CREATE TABLE "leaderboard_configs" ( + "config_id" BIGSERIAL NOT NULL, + "config_key" VARCHAR(50) NOT NULL, + "daily_enabled" BOOLEAN NOT NULL DEFAULT true, + "weekly_enabled" BOOLEAN NOT NULL DEFAULT true, + "monthly_enabled" BOOLEAN NOT NULL DEFAULT true, + "virtual_ranking_enabled" BOOLEAN NOT NULL DEFAULT false, + "virtual_account_count" INTEGER NOT NULL DEFAULT 0, + "display_limit" INTEGER NOT NULL DEFAULT 30, + "refresh_interval_minutes" INTEGER NOT NULL DEFAULT 5, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "leaderboard_configs_pkey" PRIMARY KEY ("config_id") +); + +-- CreateTable +CREATE TABLE "virtual_accounts" ( + "virtual_account_id" BIGSERIAL NOT NULL, + "account_type" VARCHAR(30) NOT NULL, + "display_name" VARCHAR(100) NOT NULL, + "avatar" VARCHAR(255), + "province_code" VARCHAR(10), + "city_code" VARCHAR(10), + "min_score" INTEGER, + "max_score" INTEGER, + "current_score" INTEGER NOT NULL DEFAULT 0, + "usdt_balance" DECIMAL(20,8) NOT NULL DEFAULT 0, + "hashpower_balance" DECIMAL(20,8) NOT NULL DEFAULT 0, + "is_active" BOOLEAN NOT NULL DEFAULT true, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "virtual_accounts_pkey" PRIMARY KEY ("virtual_account_id") +); + +-- CreateTable +CREATE TABLE "virtual_ranking_entries" ( + "entry_id" BIGSERIAL NOT NULL, + "virtual_account_id" BIGINT NOT NULL, + "leaderboard_type" VARCHAR(30) NOT NULL, + "period_key" VARCHAR(20) NOT NULL, + "display_position" INTEGER NOT NULL, + "generated_score" INTEGER NOT NULL, + "display_name" VARCHAR(100) NOT NULL, + "avatar" VARCHAR(255), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "virtual_ranking_entries_pkey" PRIMARY KEY ("entry_id") +); + +-- CreateTable +CREATE TABLE "leaderboard_snapshots" ( + "snapshot_id" BIGSERIAL NOT NULL, + "leaderboard_type" VARCHAR(30) NOT NULL, + "period_key" VARCHAR(20) NOT NULL, + "rankings_data" JSONB NOT NULL, + "total_participants" INTEGER NOT NULL, + "top_score" INTEGER NOT NULL, + "average_score" INTEGER NOT NULL, + "period_start_at" TIMESTAMP(3) NOT NULL, + "period_end_at" TIMESTAMP(3) NOT NULL, + "snapshot_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "leaderboard_snapshots_pkey" PRIMARY KEY ("snapshot_id") +); + +-- CreateTable +CREATE TABLE "virtual_account_transactions" ( + "transaction_id" BIGSERIAL NOT NULL, + "virtual_account_id" BIGINT NOT NULL, + "transaction_type" VARCHAR(30) NOT NULL, + "amount" DECIMAL(20,8) NOT NULL, + "currency" VARCHAR(10) NOT NULL, + "source_type" VARCHAR(50), + "source_id" VARCHAR(100), + "source_user_id" BIGINT, + "memo" VARCHAR(500), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "virtual_account_transactions_pkey" PRIMARY KEY ("transaction_id") +); + +-- CreateTable +CREATE TABLE "leaderboard_events" ( + "event_id" BIGSERIAL NOT NULL, + "event_type" VARCHAR(50) NOT NULL, + "aggregate_id" VARCHAR(100) NOT NULL, + "aggregate_type" VARCHAR(50) NOT NULL, + "event_data" JSONB NOT NULL, + "user_id" BIGINT, + "occurred_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "version" INTEGER NOT NULL DEFAULT 1, + + CONSTRAINT "leaderboard_events_pkey" PRIMARY KEY ("event_id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "uk_type_period_user" ON "leaderboard_rankings"("leaderboard_type", "period_key", "user_id"); + +-- CreateIndex +CREATE INDEX "idx_display_rank" ON "leaderboard_rankings"("leaderboard_type", "period_key", "display_position"); + +-- CreateIndex +CREATE INDEX "idx_score" ON "leaderboard_rankings"("leaderboard_type", "period_key", "effective_score" DESC); + +-- CreateIndex +CREATE INDEX "idx_ranking_user" ON "leaderboard_rankings"("user_id"); + +-- CreateIndex +CREATE INDEX "idx_period" ON "leaderboard_rankings"("period_key"); + +-- CreateIndex +CREATE INDEX "idx_virtual" ON "leaderboard_rankings"("is_virtual"); + +-- CreateIndex +CREATE UNIQUE INDEX "leaderboard_configs_config_key_key" ON "leaderboard_configs"("config_key"); + +-- CreateIndex +CREATE INDEX "idx_va_type" ON "virtual_accounts"("account_type"); + +-- CreateIndex +CREATE INDEX "idx_va_province" ON "virtual_accounts"("province_code"); + +-- CreateIndex +CREATE INDEX "idx_va_city" ON "virtual_accounts"("city_code"); + +-- CreateIndex +CREATE INDEX "idx_va_active" ON "virtual_accounts"("is_active"); + +-- CreateIndex +CREATE UNIQUE INDEX "uk_vr_type_period_pos" ON "virtual_ranking_entries"("leaderboard_type", "period_key", "display_position"); + +-- CreateIndex +CREATE INDEX "idx_vr_va" ON "virtual_ranking_entries"("virtual_account_id"); + +-- CreateIndex +CREATE INDEX "idx_vr_type_period" ON "virtual_ranking_entries"("leaderboard_type", "period_key"); + +-- CreateIndex +CREATE UNIQUE INDEX "uk_snapshot_type_period" ON "leaderboard_snapshots"("leaderboard_type", "period_key"); + +-- CreateIndex +CREATE INDEX "idx_snapshot_type" ON "leaderboard_snapshots"("leaderboard_type"); + +-- CreateIndex +CREATE INDEX "idx_snapshot_period" ON "leaderboard_snapshots"("period_key"); + +-- CreateIndex +CREATE INDEX "idx_vat_account" ON "virtual_account_transactions"("virtual_account_id"); + +-- CreateIndex +CREATE INDEX "idx_vat_type" ON "virtual_account_transactions"("transaction_type"); + +-- CreateIndex +CREATE INDEX "idx_vat_created" ON "virtual_account_transactions"("created_at" DESC); + +-- CreateIndex +CREATE INDEX "idx_lb_event_aggregate" ON "leaderboard_events"("aggregate_type", "aggregate_id"); + +-- CreateIndex +CREATE INDEX "idx_lb_event_type" ON "leaderboard_events"("event_type"); + +-- CreateIndex +CREATE INDEX "idx_lb_event_occurred" ON "leaderboard_events"("occurred_at"); + +-- Insert default config +INSERT INTO "leaderboard_configs" ("config_key", "daily_enabled", "weekly_enabled", "monthly_enabled", "virtual_ranking_enabled", "virtual_account_count", "display_limit", "refresh_interval_minutes", "updated_at") +VALUES ('GLOBAL', true, true, true, false, 0, 30, 5, CURRENT_TIMESTAMP);