Add Tiers and Game Prize
This commit is contained in:
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS customer_points;
|
||||
@@ -0,0 +1,22 @@
|
||||
CREATE TABLE customer_points (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
customer_id UUID NOT NULL,
|
||||
balance BIGINT DEFAULT 0 NOT NULL,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT fk_customer_points_customer
|
||||
FOREIGN KEY (customer_id)
|
||||
REFERENCES customers(id)
|
||||
ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT chk_customer_points_balance_non_negative
|
||||
CHECK (balance >= 0)
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX idx_customer_points_customer_id ON customer_points(customer_id);
|
||||
CREATE INDEX idx_customer_points_updated_at ON customer_points(updated_at);
|
||||
|
||||
-- Create unique constraint to ensure one point record per customer
|
||||
CREATE UNIQUE INDEX idx_customer_points_unique_customer ON customer_points(customer_id);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS customer_tokens;
|
||||
@@ -0,0 +1,25 @@
|
||||
CREATE TABLE customer_tokens (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
customer_id UUID NOT NULL,
|
||||
token_type VARCHAR(50) NOT NULL,
|
||||
balance BIGINT DEFAULT 0 NOT NULL,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT fk_customer_tokens_customer
|
||||
FOREIGN KEY (customer_id)
|
||||
REFERENCES customers(id)
|
||||
ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT chk_customer_tokens_balance_non_negative
|
||||
CHECK (balance >= 0),
|
||||
|
||||
CONSTRAINT chk_customer_tokens_type_valid
|
||||
CHECK (token_type IN ('SPIN', 'RAFFLE', 'MINIGAME'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_customer_tokens_customer_id ON customer_tokens(customer_id);
|
||||
CREATE INDEX idx_customer_tokens_token_type ON customer_tokens(token_type);
|
||||
CREATE INDEX idx_customer_tokens_updated_at ON customer_tokens(updated_at);
|
||||
|
||||
CREATE UNIQUE INDEX idx_customer_tokens_unique_customer_type ON customer_tokens(customer_id, token_type);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS tiers;
|
||||
@@ -0,0 +1,14 @@
|
||||
CREATE TABLE tiers (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name VARCHAR(100) NOT NULL UNIQUE,
|
||||
min_points BIGINT NOT NULL,
|
||||
benefits JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT chk_tiers_min_points_non_negative
|
||||
CHECK (min_points >= 0)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_tiers_min_points ON tiers(min_points);
|
||||
CREATE INDEX idx_tiers_created_at ON tiers(created_at);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS games;
|
||||
@@ -0,0 +1,17 @@
|
||||
CREATE TABLE games (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name VARCHAR(255) NOT NULL,
|
||||
type VARCHAR(50) NOT NULL,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT chk_games_type_valid
|
||||
CHECK (type IN ('SPIN', 'RAFFLE', 'MINIGAME'))
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX idx_games_type ON games(type);
|
||||
CREATE INDEX idx_games_is_active ON games(is_active);
|
||||
CREATE INDEX idx_games_created_at ON games(created_at);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS game_prizes;
|
||||
@@ -0,0 +1,45 @@
|
||||
CREATE TABLE game_prizes (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
game_id UUID NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
weight INTEGER NOT NULL,
|
||||
stock INTEGER DEFAULT 0,
|
||||
max_stock INTEGER,
|
||||
threshold BIGINT,
|
||||
fallback_prize_id UUID,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT fk_game_prizes_game
|
||||
FOREIGN KEY (game_id)
|
||||
REFERENCES games(id)
|
||||
ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT fk_game_prizes_fallback
|
||||
FOREIGN KEY (fallback_prize_id)
|
||||
REFERENCES game_prizes(id)
|
||||
ON DELETE SET NULL,
|
||||
|
||||
CONSTRAINT chk_game_prizes_weight_positive
|
||||
CHECK (weight > 0),
|
||||
|
||||
CONSTRAINT chk_game_prizes_stock_non_negative
|
||||
CHECK (stock >= 0),
|
||||
|
||||
CONSTRAINT chk_game_prizes_max_stock_positive
|
||||
CHECK (max_stock IS NULL OR max_stock > 0),
|
||||
|
||||
CONSTRAINT chk_game_prizes_threshold_non_negative
|
||||
CHECK (threshold IS NULL OR threshold >= 0),
|
||||
|
||||
CONSTRAINT chk_game_prizes_stock_not_exceed_max
|
||||
CHECK (max_stock IS NULL OR stock <= max_stock)
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX idx_game_prizes_game_id ON game_prizes(game_id);
|
||||
CREATE INDEX idx_game_prizes_weight ON game_prizes(weight);
|
||||
CREATE INDEX idx_game_prizes_stock ON game_prizes(stock);
|
||||
CREATE INDEX idx_game_prizes_fallback_prize_id ON game_prizes(fallback_prize_id);
|
||||
CREATE INDEX idx_game_prizes_created_at ON game_prizes(created_at);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS game_plays;
|
||||
@@ -0,0 +1,34 @@
|
||||
CREATE TABLE game_plays (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
game_id UUID NOT NULL,
|
||||
customer_id UUID NOT NULL,
|
||||
prize_id UUID,
|
||||
token_used INTEGER DEFAULT 0,
|
||||
random_seed VARCHAR(255),
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT fk_game_plays_game
|
||||
FOREIGN KEY (game_id)
|
||||
REFERENCES games(id)
|
||||
ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT fk_game_plays_customer
|
||||
FOREIGN KEY (customer_id)
|
||||
REFERENCES customers(id)
|
||||
ON DELETE CASCADE,
|
||||
|
||||
CONSTRAINT fk_game_plays_prize
|
||||
FOREIGN KEY (prize_id)
|
||||
REFERENCES game_prizes(id)
|
||||
ON DELETE SET NULL,
|
||||
|
||||
CONSTRAINT chk_game_plays_token_used_non_negative
|
||||
CHECK (token_used >= 0)
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX idx_game_plays_game_id ON game_plays(game_id);
|
||||
CREATE INDEX idx_game_plays_customer_id ON game_plays(customer_id);
|
||||
CREATE INDEX idx_game_plays_prize_id ON game_plays(prize_id);
|
||||
CREATE INDEX idx_game_plays_created_at ON game_plays(created_at);
|
||||
CREATE INDEX idx_game_plays_game_customer ON game_plays(game_id, customer_id);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS omset_tracker;
|
||||
@@ -0,0 +1,32 @@
|
||||
CREATE TABLE omset_tracker (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
period_type VARCHAR(20) NOT NULL,
|
||||
period_start DATE NOT NULL,
|
||||
period_end DATE NOT NULL,
|
||||
total BIGINT DEFAULT 0 NOT NULL,
|
||||
game_id UUID,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT fk_omset_tracker_game
|
||||
FOREIGN KEY (game_id)
|
||||
REFERENCES games(id)
|
||||
ON DELETE SET NULL,
|
||||
|
||||
CONSTRAINT chk_omset_tracker_period_type_valid
|
||||
CHECK (period_type IN ('DAILY', 'WEEKLY', 'MONTHLY', 'TOTAL')),
|
||||
|
||||
CONSTRAINT chk_omset_tracker_total_non_negative
|
||||
CHECK (total >= 0),
|
||||
|
||||
CONSTRAINT chk_omset_tracker_period_valid
|
||||
CHECK (period_end >= period_start)
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX idx_omset_tracker_period_type ON omset_tracker(period_type);
|
||||
CREATE INDEX idx_omset_tracker_period_start ON omset_tracker(period_start);
|
||||
CREATE INDEX idx_omset_tracker_game_id ON omset_tracker(game_id);
|
||||
CREATE INDEX idx_omset_tracker_created_at ON omset_tracker(created_at);
|
||||
CREATE INDEX idx_omset_tracker_period_type_start ON omset_tracker(period_type, period_start);
|
||||
CREATE INDEX idx_omset_tracker_game_period ON omset_tracker(game_id, period_type, period_start);
|
||||
Reference in New Issue
Block a user