api-platform/internal/migrations/1_setup.sql

156 lines
5.9 KiB
MySQL
Raw Normal View History

2024-11-21 11:25:32 +00:00
-- +goose Up
2024-11-22 17:53:33 +00:00
CREATE TABLE apis
2024-11-22 14:51:29 +00:00
(
2024-11-22 17:53:33 +00:00
id BIGSERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
-- 后端地址
backend_url VARCHAR(255) NOT NULL,
auth_token VARCHAR(255) NOT NULL,
-- 是否已经验证(验证时间)
ownership_verified_at TIMESTAMP DEFAULT Null,
-- 所有权验证 token
ownership_verification_token VARCHAR(255) NOT NULL,
-- user id string
user_id VARCHAR(255) NOT NULL,
-- 状态
status VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
deleted_at TIMESTAMP DEFAULT Null
2024-11-22 14:51:29 +00:00
);
2024-11-21 11:25:32 +00:00
2024-11-22 17:53:33 +00:00
-- index
CREATE INDEX idx_api_name ON apis (name);
CREATE INDEX idx_api_user_id ON apis (user_id);
CREATE INDEX idx_api_status ON apis (status);
CREATE INDEX idx_api_deleted_at ON apis (deleted_at);
CREATE INDEX idx_api_ownership_verified_at ON apis (ownership_verified_at);
CREATE TABLE api_documents
(
id BIGSERIAL PRIMARY KEY,
api_id BIGINT NOT NULL,
openapi_url VARCHAR(255) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
CONSTRAINT fk_api_id
FOREIGN KEY (api_id) REFERENCES apis (id)
);
CREATE INDEX idx_api_documents_api_id ON api_documents (api_id);
CREATE INDEX idx_api_documents_openapi_url ON api_documents (openapi_url);
CREATE TABLE packages
(
id BIGSERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
api_id BIGINT NOT NULL,
price DECIMAL(10, 2),
-- hidden
is_hidden BOOLEAN DEFAULT false,
is_published BOOLEAN DEFAULT false,
call_limit BIGINT DEFAULT 10000,
-- 有效期(天)
duration INTEGER DEFAULT 30,
-- 是否为试用套餐
is_trial BOOLEAN DEFAULT false,
-- 每个用户的购买限制
purchase_limit INTEGER DEFAULT 1,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
CONSTRAINT fk_api_id FOREIGN KEY (api_id) REFERENCES apis (id),
deleted_at TIMESTAMP DEFAULT Null
);
CREATE INDEX idx_package_name ON packages (name);
CREATE INDEX idx_package_api_id ON packages (api_id);
CREATE INDEX idx_package_price ON packages (price);
CREATE INDEX idx_package_is_published ON packages (is_published);
CREATE INDEX idx_package_is_hidden ON packages (is_hidden);
CREATE INDEX idx_package_is_trial ON packages (is_trial);
CREATE INDEX idx_package_call_limit ON packages (call_limit);
CREATE INDEX idx_package_duration ON packages (duration);
CREATE INDEX idx_package_purchase_limit ON packages (purchase_limit);
CREATE INDEX idx_package_deleted_at ON packages (deleted_at);
CREATE TABLE user_packages
(
id BIGSERIAL PRIMARY KEY,
user_id VARCHAR(255) NOT NULL,
package_id BIGINT NOT NULL,
calls_left INTEGER DEFAULT 0,
is_active BOOLEAN DEFAULT false,
expiration_at TIMESTAMP DEFAULT NULL,
purchase_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
CONSTRAINT fk_package_id FOREIGN KEY (package_id) REFERENCES packages (id)
);
CREATE INDEX idx_user_package_user_id ON user_packages (user_id);
CREATE INDEX idx_user_package_package_id ON user_packages (package_id);
CREATE INDEX idx_user_package_is_active ON user_packages (is_active);
CREATE INDEX idx_user_package_expiration_at ON user_packages (expiration_at);
CREATE INDEX idx_user_package_purchase_at ON user_packages (purchase_at);
CREATE INDEX idx_user_package_calls_left ON user_packages (calls_left);
2024-11-21 11:25:32 +00:00
2024-11-22 17:53:33 +00:00
CREATE TABLE promo_codes
(
id BIGSERIAL PRIMARY KEY,
code VARCHAR(255) NOT NULL,
discount_type VARCHAR(255) NOT NULL,
discount_value DECIMAL(10, 2) NOT NULL,
expiration_date TIMESTAMP,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
deleted_at TIMESTAMP DEFAULT Null
);
CREATE INDEX idx_promo_code_code ON promo_codes (code);
CREATE INDEX idx_promo_code_discount_type ON promo_codes (discount_type);
CREATE INDEX idx_promo_code_discount_value ON promo_codes (discount_value);
CREATE INDEX idx_promo_code_expiration_date ON promo_codes (expiration_date);
CREATE INDEX idx_promo_code_is_active ON promo_codes (is_active);
CREATE INDEX idx_promo_code_deleted_at ON promo_codes (deleted_at);
CREATE TABLE orders
(
id BIGSERIAL PRIMARY KEY,
user_id VARCHAR(255) NOT NULL,
promo_code_id BIGINT DEFAULT NULL,
price DECIMAL(10, 2) NOT NULL,
order_date TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
CONSTRAINT fk_promo_code_id FOREIGN KEY (promo_code_id) REFERENCES promo_codes (id) ON DELETE SET NULL
);
CREATE INDEX idx_order_user_id ON orders (user_id);
CREATE INDEX idx_order_promo_code_id ON orders (promo_code_id);
CREATE INDEX idx_order_price ON orders (price);
CREATE INDEX idx_order_order_date ON orders (order_date);
CREATE TABLE order_items
(
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL,
package_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now(),
CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES orders (id)
);
CREATE INDEX idx_order_item_order_id ON order_items (order_id);
CREATE INDEX idx_order_item_package_id ON order_items (package_id);
-- +goose Down
DROP TABLE IF EXISTS order_items;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS promo_codes;
DROP TABLE IF EXISTS user_packages;
DROP TABLE IF EXISTS packages;
DROP TABLE IF EXISTS api_documents;
DROP TABLE IF EXISTS apis;