Files
quyun-v2/backend/database/migrations/20251217223000_media_contents.sql
2025-12-17 22:28:47 +08:00

122 lines
4.6 KiB
SQL

-- +goose Up
-- +goose StatementBegin
CREATE TABLE IF NOT EXISTS media_assets(
id bigserial PRIMARY KEY,
tenant_id bigint NOT NULL,
user_id bigint NOT NULL,
type varchar(32) NOT NULL DEFAULT 'video',
status varchar(32) NOT NULL DEFAULT 'uploaded',
provider varchar(64) NOT NULL DEFAULT '',
bucket varchar(128) NOT NULL DEFAULT '',
object_key varchar(512) NOT NULL DEFAULT '',
meta jsonb NOT NULL DEFAULT '{}'::jsonb,
deleted_at timestamptz,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS ix_media_assets_tenant_id ON media_assets(tenant_id);
CREATE INDEX IF NOT EXISTS ix_media_assets_tenant_user_id ON media_assets(tenant_id, user_id);
CREATE INDEX IF NOT EXISTS ix_media_assets_tenant_status ON media_assets(tenant_id, status);
CREATE TABLE IF NOT EXISTS contents(
id bigserial PRIMARY KEY,
tenant_id bigint NOT NULL,
user_id bigint NOT NULL,
title varchar(255) NOT NULL DEFAULT '',
description text NOT NULL DEFAULT '',
status varchar(32) NOT NULL DEFAULT 'draft',
visibility varchar(32) NOT NULL DEFAULT 'tenant_only',
preview_seconds int NOT NULL DEFAULT 60,
preview_downloadable boolean NOT NULL DEFAULT false,
published_at timestamptz,
deleted_at timestamptz,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS ix_contents_tenant_id ON contents(tenant_id);
CREATE INDEX IF NOT EXISTS ix_contents_tenant_user_id ON contents(tenant_id, user_id);
CREATE INDEX IF NOT EXISTS ix_contents_tenant_status ON contents(tenant_id, status);
CREATE INDEX IF NOT EXISTS ix_contents_tenant_visibility ON contents(tenant_id, visibility);
CREATE TABLE IF NOT EXISTS content_assets(
id bigserial PRIMARY KEY,
tenant_id bigint NOT NULL,
user_id bigint NOT NULL,
content_id bigint NOT NULL,
asset_id bigint NOT NULL,
role varchar(32) NOT NULL DEFAULT 'main',
sort int NOT NULL DEFAULT 0,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW(),
UNIQUE (tenant_id, content_id, asset_id)
);
CREATE INDEX IF NOT EXISTS ix_content_assets_tenant_content ON content_assets(tenant_id, content_id);
CREATE INDEX IF NOT EXISTS ix_content_assets_tenant_asset ON content_assets(tenant_id, asset_id);
CREATE INDEX IF NOT EXISTS ix_content_assets_tenant_role ON content_assets(tenant_id, content_id, role);
CREATE TABLE IF NOT EXISTS content_prices(
id bigserial PRIMARY KEY,
tenant_id bigint NOT NULL,
user_id bigint NOT NULL,
content_id bigint NOT NULL,
currency varchar(16) NOT NULL DEFAULT 'CNY',
price_amount bigint NOT NULL DEFAULT 0,
discount_type varchar(16) NOT NULL DEFAULT 'none',
discount_value bigint NOT NULL DEFAULT 0,
discount_start_at timestamptz,
discount_end_at timestamptz,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW(),
UNIQUE (tenant_id, content_id)
);
CREATE INDEX IF NOT EXISTS ix_content_prices_tenant_id ON content_prices(tenant_id);
CREATE TABLE IF NOT EXISTS content_access(
id bigserial PRIMARY KEY,
tenant_id bigint NOT NULL,
user_id bigint NOT NULL,
content_id bigint NOT NULL,
order_id bigint,
status varchar(16) NOT NULL DEFAULT 'active',
revoked_at timestamptz,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW(),
UNIQUE (tenant_id, user_id, content_id)
);
CREATE INDEX IF NOT EXISTS ix_content_access_tenant_user ON content_access(tenant_id, user_id);
CREATE INDEX IF NOT EXISTS ix_content_access_tenant_content ON content_access(tenant_id, content_id);
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DROP INDEX IF EXISTS ix_content_access_tenant_content;
DROP INDEX IF EXISTS ix_content_access_tenant_user;
DROP TABLE IF EXISTS content_access;
DROP INDEX IF EXISTS ix_content_prices_tenant_id;
DROP TABLE IF EXISTS content_prices;
DROP INDEX IF EXISTS ix_content_assets_tenant_role;
DROP INDEX IF EXISTS ix_content_assets_tenant_asset;
DROP INDEX IF EXISTS ix_content_assets_tenant_content;
DROP TABLE IF EXISTS content_assets;
DROP INDEX IF EXISTS ix_contents_tenant_visibility;
DROP INDEX IF EXISTS ix_contents_tenant_status;
DROP INDEX IF EXISTS ix_contents_tenant_user_id;
DROP INDEX IF EXISTS ix_contents_tenant_id;
DROP TABLE IF EXISTS contents;
DROP INDEX IF EXISTS ix_media_assets_tenant_status;
DROP INDEX IF EXISTS ix_media_assets_tenant_user_id;
DROP INDEX IF EXISTS ix_media_assets_tenant_id;
DROP TABLE IF EXISTS media_assets;
-- +goose StatementEnd