From b98844abe423961938a261dbb0b9e9ad61259f92 Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 9 Dec 2025 20:30:23 -0800 Subject: [PATCH] feat(db): add Prisma migrations for wallet-service and planting-service MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .../20241204000000_init/migration.sql | 186 +++++++++++++++++ .../20241204000000_init/migration.sql | 190 ++++++++++++++++++ 2 files changed, 376 insertions(+) create mode 100644 backend/services/planting-service/prisma/migrations/20241204000000_init/migration.sql create mode 100644 backend/services/wallet-service/prisma/migrations/20241204000000_init/migration.sql diff --git a/backend/services/planting-service/prisma/migrations/20241204000000_init/migration.sql b/backend/services/planting-service/prisma/migrations/20241204000000_init/migration.sql new file mode 100644 index 00000000..a20ffa35 --- /dev/null +++ b/backend/services/planting-service/prisma/migrations/20241204000000_init/migration.sql @@ -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; diff --git a/backend/services/wallet-service/prisma/migrations/20241204000000_init/migration.sql b/backend/services/wallet-service/prisma/migrations/20241204000000_init/migration.sql new file mode 100644 index 00000000..5183d318 --- /dev/null +++ b/backend/services/wallet-service/prisma/migrations/20241204000000_init/migration.sql @@ -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");