37 lines
1.6 KiB
SQL
37 lines
1.6 KiB
SQL
-- Subscription Plans table
|
|
CREATE TABLE subscription_plans (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
description TEXT,
|
|
duration_value INT NOT NULL,
|
|
duration_unit VARCHAR(10) NOT NULL CHECK (duration_unit IN ('DAY', 'WEEK', 'MONTH', 'YEAR')),
|
|
price DECIMAL(10, 2) NOT NULL,
|
|
currency VARCHAR(3) NOT NULL DEFAULT 'ETB',
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX idx_subscription_plans_active ON subscription_plans(is_active);
|
|
|
|
-- User Subscriptions table
|
|
CREATE TABLE user_subscriptions (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
plan_id BIGINT NOT NULL REFERENCES subscription_plans(id) ON DELETE RESTRICT,
|
|
starts_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
expires_at TIMESTAMPTZ NOT NULL,
|
|
status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' CHECK (status IN ('PENDING', 'ACTIVE', 'EXPIRED', 'CANCELLED')),
|
|
payment_reference VARCHAR(255),
|
|
payment_method VARCHAR(50),
|
|
auto_renew BOOLEAN NOT NULL DEFAULT FALSE,
|
|
cancelled_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX idx_user_subscriptions_user_id ON user_subscriptions(user_id);
|
|
CREATE INDEX idx_user_subscriptions_status ON user_subscriptions(status);
|
|
CREATE INDEX idx_user_subscriptions_expires_at ON user_subscriptions(expires_at);
|
|
CREATE INDEX idx_user_subscriptions_user_status ON user_subscriptions(user_id, status);
|