feat: spec stage 1
This commit is contained in:
@@ -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:
|
||||
|
||||
121
backend/database/migrations/20251217223000_media_contents.sql
Normal file
121
backend/database/migrations/20251217223000_media_contents.sql
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user