feat: spec stage 1

This commit is contained in:
2025-12-17 22:28:47 +08:00
parent e28830cfaf
commit 971c02fa07
5 changed files with 1939 additions and 0 deletions

View File

@@ -19,6 +19,19 @@ field_type:
tenant_users:
role: types.Array[consts.TenantUserRole]
status: consts.UserStatus
media_assets:
type: consts.MediaAssetType
status: consts.MediaAssetStatus
contents:
status: consts.ContentStatus
visibility: consts.ContentVisibility
content_assets:
role: consts.ContentAssetRole
content_prices:
currency: consts.Currency
discount_type: consts.DiscountType
content_access:
status: consts.ContentAccessStatus
field_relate:
users:
OwnedTenant:

View File

@@ -0,0 +1,121 @@
-- +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