feat(db): add Prisma migrations for wallet-service and planting-service

- Add initial migration for wallet-service (wallet_accounts, ledger_entries, deposit/settlement/withdrawal orders)
- Add initial migration for planting-service (planting_orders, fund_allocations, positions, batches, events)
- Both services now have migrations that will be automatically applied on container startup via `prisma migrate deploy`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-09 20:30:23 -08:00
parent bb048bb104
commit b98844abe4
2 changed files with 376 additions and 0 deletions

View File

@ -0,0 +1,186 @@
-- CreateTable
CREATE TABLE "planting_orders" (
"order_id" BIGSERIAL NOT NULL,
"order_no" VARCHAR(50) NOT NULL,
"user_id" BIGINT NOT NULL,
"tree_count" INTEGER NOT NULL,
"total_amount" DECIMAL(20,8) NOT NULL,
"selected_province" VARCHAR(10),
"selected_city" VARCHAR(10),
"province_city_selected_at" TIMESTAMP(3),
"province_city_confirmed_at" TIMESTAMP(3),
"status" VARCHAR(30) NOT NULL DEFAULT 'CREATED',
"pool_injection_batch_id" BIGINT,
"pool_injection_scheduled_time" TIMESTAMP(3),
"pool_injection_actual_time" TIMESTAMP(3),
"pool_injection_tx_hash" VARCHAR(100),
"mining_enabled_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"paid_at" TIMESTAMP(3),
"fund_allocated_at" TIMESTAMP(3),
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "planting_orders_pkey" PRIMARY KEY ("order_id")
);
-- CreateTable
CREATE TABLE "fund_allocations" (
"allocation_id" BIGSERIAL NOT NULL,
"order_id" BIGINT NOT NULL,
"target_type" VARCHAR(50) NOT NULL,
"amount" DECIMAL(20,8) NOT NULL,
"target_account_id" VARCHAR(100),
"metadata" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "fund_allocations_pkey" PRIMARY KEY ("allocation_id")
);
-- CreateTable
CREATE TABLE "planting_positions" (
"position_id" BIGSERIAL NOT NULL,
"user_id" BIGINT NOT NULL,
"total_tree_count" INTEGER NOT NULL DEFAULT 0,
"effective_tree_count" INTEGER NOT NULL DEFAULT 0,
"pending_tree_count" INTEGER NOT NULL DEFAULT 0,
"first_mining_start_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "planting_positions_pkey" PRIMARY KEY ("position_id")
);
-- CreateTable
CREATE TABLE "position_province_city_distribution" (
"distribution_id" BIGSERIAL NOT NULL,
"user_id" BIGINT NOT NULL,
"province_code" VARCHAR(10),
"city_code" VARCHAR(10),
"tree_count" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "position_province_city_distribution_pkey" PRIMARY KEY ("distribution_id")
);
-- CreateTable
CREATE TABLE "pool_injection_batches" (
"batch_id" BIGSERIAL NOT NULL,
"batch_no" VARCHAR(50) NOT NULL,
"start_date" DATE NOT NULL,
"end_date" DATE NOT NULL,
"order_count" INTEGER NOT NULL DEFAULT 0,
"total_amount" DECIMAL(20,8) NOT NULL DEFAULT 0,
"status" VARCHAR(20) NOT NULL DEFAULT 'PENDING',
"scheduled_injection_time" TIMESTAMP(3),
"actual_injection_time" TIMESTAMP(3),
"injection_tx_hash" VARCHAR(100),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "pool_injection_batches_pkey" PRIMARY KEY ("batch_id")
);
-- CreateTable
CREATE TABLE "planting_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(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"version" INTEGER NOT NULL DEFAULT 1,
CONSTRAINT "planting_events_pkey" PRIMARY KEY ("event_id")
);
-- CreateIndex
CREATE UNIQUE INDEX "planting_orders_order_no_key" ON "planting_orders"("order_no");
-- CreateIndex
CREATE INDEX "planting_orders_user_id_idx" ON "planting_orders"("user_id");
-- CreateIndex
CREATE INDEX "planting_orders_order_no_idx" ON "planting_orders"("order_no");
-- CreateIndex
CREATE INDEX "planting_orders_status_idx" ON "planting_orders"("status");
-- CreateIndex
CREATE INDEX "planting_orders_pool_injection_batch_id_idx" ON "planting_orders"("pool_injection_batch_id");
-- CreateIndex
CREATE INDEX "planting_orders_selected_province_selected_city_idx" ON "planting_orders"("selected_province", "selected_city");
-- CreateIndex
CREATE INDEX "planting_orders_created_at_idx" ON "planting_orders"("created_at");
-- CreateIndex
CREATE INDEX "planting_orders_paid_at_idx" ON "planting_orders"("paid_at");
-- CreateIndex
CREATE INDEX "fund_allocations_order_id_idx" ON "fund_allocations"("order_id");
-- CreateIndex
CREATE INDEX "fund_allocations_target_type_target_account_id_idx" ON "fund_allocations"("target_type", "target_account_id");
-- CreateIndex
CREATE INDEX "fund_allocations_created_at_idx" ON "fund_allocations"("created_at");
-- CreateIndex
CREATE UNIQUE INDEX "planting_positions_user_id_key" ON "planting_positions"("user_id");
-- CreateIndex
CREATE INDEX "planting_positions_user_id_idx" ON "planting_positions"("user_id");
-- CreateIndex
CREATE INDEX "planting_positions_total_tree_count_idx" ON "planting_positions"("total_tree_count");
-- CreateIndex
CREATE UNIQUE INDEX "position_province_city_distribution_user_id_province_code_c_key" ON "position_province_city_distribution"("user_id", "province_code", "city_code");
-- CreateIndex
CREATE INDEX "position_province_city_distribution_user_id_idx" ON "position_province_city_distribution"("user_id");
-- CreateIndex
CREATE INDEX "position_province_city_distribution_province_code_idx" ON "position_province_city_distribution"("province_code");
-- CreateIndex
CREATE INDEX "position_province_city_distribution_city_code_idx" ON "position_province_city_distribution"("city_code");
-- CreateIndex
CREATE UNIQUE INDEX "pool_injection_batches_batch_no_key" ON "pool_injection_batches"("batch_no");
-- CreateIndex
CREATE INDEX "pool_injection_batches_batch_no_idx" ON "pool_injection_batches"("batch_no");
-- CreateIndex
CREATE INDEX "pool_injection_batches_start_date_end_date_idx" ON "pool_injection_batches"("start_date", "end_date");
-- CreateIndex
CREATE INDEX "pool_injection_batches_status_idx" ON "pool_injection_batches"("status");
-- CreateIndex
CREATE INDEX "pool_injection_batches_scheduled_injection_time_idx" ON "pool_injection_batches"("scheduled_injection_time");
-- CreateIndex
CREATE INDEX "planting_events_aggregate_type_aggregate_id_idx" ON "planting_events"("aggregate_type", "aggregate_id");
-- CreateIndex
CREATE INDEX "planting_events_event_type_idx" ON "planting_events"("event_type");
-- CreateIndex
CREATE INDEX "planting_events_user_id_idx" ON "planting_events"("user_id");
-- CreateIndex
CREATE INDEX "planting_events_occurred_at_idx" ON "planting_events"("occurred_at");
-- AddForeignKey
ALTER TABLE "fund_allocations" ADD CONSTRAINT "fund_allocations_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "planting_orders"("order_id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "position_province_city_distribution" ADD CONSTRAINT "position_province_city_distribution_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "planting_positions"("user_id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "planting_orders" ADD CONSTRAINT "planting_orders_pool_injection_batch_id_fkey" FOREIGN KEY ("pool_injection_batch_id") REFERENCES "pool_injection_batches"("batch_id") ON DELETE SET NULL ON UPDATE CASCADE;

View File

@ -0,0 +1,190 @@
-- CreateTable
CREATE TABLE "wallet_accounts" (
"wallet_id" BIGSERIAL NOT NULL,
"account_sequence" BIGINT NOT NULL,
"user_id" BIGINT NOT NULL,
"usdt_available" DECIMAL(20,8) NOT NULL DEFAULT 0,
"usdt_frozen" DECIMAL(20,8) NOT NULL DEFAULT 0,
"dst_available" DECIMAL(20,8) NOT NULL DEFAULT 0,
"dst_frozen" DECIMAL(20,8) NOT NULL DEFAULT 0,
"bnb_available" DECIMAL(20,8) NOT NULL DEFAULT 0,
"bnb_frozen" DECIMAL(20,8) NOT NULL DEFAULT 0,
"og_available" DECIMAL(20,8) NOT NULL DEFAULT 0,
"og_frozen" DECIMAL(20,8) NOT NULL DEFAULT 0,
"rwad_available" DECIMAL(20,8) NOT NULL DEFAULT 0,
"rwad_frozen" DECIMAL(20,8) NOT NULL DEFAULT 0,
"hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"pending_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"pending_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"pending_expire_at" TIMESTAMP(3),
"settleable_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"settleable_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"settled_total_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"settled_total_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"expired_total_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"expired_total_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"status" VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "wallet_accounts_pkey" PRIMARY KEY ("wallet_id")
);
-- CreateTable
CREATE TABLE "wallet_ledger_entries" (
"entry_id" BIGSERIAL NOT NULL,
"account_sequence" BIGINT NOT NULL,
"user_id" BIGINT NOT NULL,
"entry_type" VARCHAR(50) NOT NULL,
"amount" DECIMAL(20,8) NOT NULL,
"asset_type" VARCHAR(20) NOT NULL,
"balance_after" DECIMAL(20,8),
"ref_order_id" VARCHAR(100),
"ref_tx_hash" VARCHAR(100),
"memo" VARCHAR(500),
"payload_json" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wallet_ledger_entries_pkey" PRIMARY KEY ("entry_id")
);
-- CreateTable
CREATE TABLE "deposit_orders" (
"order_id" BIGSERIAL NOT NULL,
"account_sequence" BIGINT NOT NULL,
"user_id" BIGINT NOT NULL,
"chain_type" VARCHAR(20) NOT NULL,
"amount" DECIMAL(20,8) NOT NULL,
"tx_hash" VARCHAR(100) NOT NULL,
"status" VARCHAR(20) NOT NULL DEFAULT 'PENDING',
"confirmed_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "deposit_orders_pkey" PRIMARY KEY ("order_id")
);
-- CreateTable
CREATE TABLE "settlement_orders" (
"order_id" BIGSERIAL NOT NULL,
"user_id" BIGINT NOT NULL,
"usdt_amount" DECIMAL(20,8) NOT NULL,
"settle_currency" VARCHAR(10) NOT NULL,
"swap_tx_hash" VARCHAR(100),
"received_amount" DECIMAL(20,8),
"status" VARCHAR(20) NOT NULL DEFAULT 'PENDING',
"settled_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "settlement_orders_pkey" PRIMARY KEY ("order_id")
);
-- CreateTable
CREATE TABLE "withdrawal_orders" (
"order_id" BIGSERIAL NOT NULL,
"order_no" VARCHAR(50) NOT NULL,
"account_sequence" BIGINT NOT NULL,
"user_id" BIGINT NOT NULL,
"amount" DECIMAL(20,8) NOT NULL,
"fee" DECIMAL(20,8) NOT NULL,
"chain_type" VARCHAR(20) NOT NULL,
"to_address" VARCHAR(100) NOT NULL,
"tx_hash" VARCHAR(100),
"status" VARCHAR(20) NOT NULL DEFAULT 'PENDING',
"error_message" VARCHAR(500),
"frozen_at" TIMESTAMP(3),
"broadcasted_at" TIMESTAMP(3),
"confirmed_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "withdrawal_orders_pkey" PRIMARY KEY ("order_id")
);
-- CreateIndex
CREATE UNIQUE INDEX "wallet_accounts_account_sequence_key" ON "wallet_accounts"("account_sequence");
-- CreateIndex
CREATE UNIQUE INDEX "wallet_accounts_user_id_key" ON "wallet_accounts"("user_id");
-- CreateIndex
CREATE INDEX "wallet_accounts_user_id_idx" ON "wallet_accounts"("user_id");
-- CreateIndex
CREATE INDEX "wallet_accounts_usdt_available_idx" ON "wallet_accounts"("usdt_available" DESC);
-- CreateIndex
CREATE INDEX "wallet_accounts_hashpower_idx" ON "wallet_accounts"("hashpower" DESC);
-- CreateIndex
CREATE INDEX "wallet_accounts_status_idx" ON "wallet_accounts"("status");
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_account_sequence_created_at_idx" ON "wallet_ledger_entries"("account_sequence", "created_at" DESC);
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_user_id_created_at_idx" ON "wallet_ledger_entries"("user_id", "created_at" DESC);
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_entry_type_idx" ON "wallet_ledger_entries"("entry_type");
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_asset_type_idx" ON "wallet_ledger_entries"("asset_type");
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_ref_order_id_idx" ON "wallet_ledger_entries"("ref_order_id");
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_ref_tx_hash_idx" ON "wallet_ledger_entries"("ref_tx_hash");
-- CreateIndex
CREATE INDEX "wallet_ledger_entries_created_at_idx" ON "wallet_ledger_entries"("created_at");
-- CreateIndex
CREATE UNIQUE INDEX "deposit_orders_tx_hash_key" ON "deposit_orders"("tx_hash");
-- CreateIndex
CREATE INDEX "deposit_orders_account_sequence_idx" ON "deposit_orders"("account_sequence");
-- CreateIndex
CREATE INDEX "deposit_orders_user_id_idx" ON "deposit_orders"("user_id");
-- CreateIndex
CREATE INDEX "deposit_orders_tx_hash_idx" ON "deposit_orders"("tx_hash");
-- CreateIndex
CREATE INDEX "deposit_orders_status_idx" ON "deposit_orders"("status");
-- CreateIndex
CREATE INDEX "deposit_orders_chain_type_idx" ON "deposit_orders"("chain_type");
-- CreateIndex
CREATE INDEX "settlement_orders_user_id_idx" ON "settlement_orders"("user_id");
-- CreateIndex
CREATE INDEX "settlement_orders_status_idx" ON "settlement_orders"("status");
-- CreateIndex
CREATE INDEX "settlement_orders_settle_currency_idx" ON "settlement_orders"("settle_currency");
-- CreateIndex
CREATE INDEX "settlement_orders_created_at_idx" ON "settlement_orders"("created_at");
-- CreateIndex
CREATE UNIQUE INDEX "withdrawal_orders_order_no_key" ON "withdrawal_orders"("order_no");
-- CreateIndex
CREATE INDEX "withdrawal_orders_account_sequence_idx" ON "withdrawal_orders"("account_sequence");
-- CreateIndex
CREATE INDEX "withdrawal_orders_user_id_idx" ON "withdrawal_orders"("user_id");
-- CreateIndex
CREATE INDEX "withdrawal_orders_status_idx" ON "withdrawal_orders"("status");
-- CreateIndex
CREATE INDEX "withdrawal_orders_chain_type_idx" ON "withdrawal_orders"("chain_type");
-- CreateIndex
CREATE INDEX "withdrawal_orders_tx_hash_idx" ON "withdrawal_orders"("tx_hash");
-- CreateIndex
CREATE INDEX "withdrawal_orders_created_at_idx" ON "withdrawal_orders"("created_at");