Files
story/migrations/000019_ops_config_versions.up.sql
T

54 lines
3.4 KiB
PL/PgSQL
Raw Normal View History

2026-08-26 06:41:07 +08:00
BEGIN;
ALTER TABLE user_account
ADD COLUMN platform_role varchar(24) NOT NULL DEFAULT 'customer'
CHECK (platform_role IN ('customer','ops_viewer','ops_operator','ops_approver','ops_admin'));
CREATE TABLE runtime_config_version (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
public_id uuid NOT NULL UNIQUE DEFAULT gen_random_uuid(),
tenant_id uuid NOT NULL REFERENCES tenant(id),
config_key varchar(100) NOT NULL CHECK (config_key ~ '^[a-z][a-z0-9_.-]{2,99}$'),
display_name varchar(200) NOT NULL CHECK (length(trim(display_name))>0),
config_kind varchar(24) NOT NULL CHECK (config_kind IN ('PERSONA','VOICE','MODEL','ROUTING','AGENT_BUNDLE')),
version_no integer NOT NULL CHECK (version_no>0),
status varchar(24) NOT NULL DEFAULT 'DRAFT'
CHECK (status IN ('DRAFT','PENDING_APPROVAL','PUBLISHED','RETIRED')),
payload jsonb NOT NULL CHECK (jsonb_typeof(payload)='object'),
secret_refs jsonb NOT NULL DEFAULT '{}'::jsonb CHECK (jsonb_typeof(secret_refs)='object'),
change_summary varchar(500) NOT NULL CHECK (length(trim(change_summary))>0),
validation_result jsonb NOT NULL DEFAULT '{}'::jsonb CHECK (jsonb_typeof(validation_result)='object'),
created_by uuid NOT NULL,
submitted_by uuid,
submitted_at timestamptz,
approved_by uuid,
approved_at timestamptz,
published_by uuid,
published_at timestamptz,
retired_at timestamptz,
supersedes_id uuid REFERENCES runtime_config_version(id),
rollback_of_id uuid REFERENCES runtime_config_version(id),
row_version bigint NOT NULL DEFAULT 1 CHECK (row_version>0),
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT runtime_config_creator_tenant_fk FOREIGN KEY (created_by,tenant_id) REFERENCES user_account(id,tenant_id),
CONSTRAINT runtime_config_submitter_tenant_fk FOREIGN KEY (submitted_by,tenant_id) REFERENCES user_account(id,tenant_id),
CONSTRAINT runtime_config_approver_tenant_fk FOREIGN KEY (approved_by,tenant_id) REFERENCES user_account(id,tenant_id),
CONSTRAINT runtime_config_publisher_tenant_fk FOREIGN KEY (published_by,tenant_id) REFERENCES user_account(id,tenant_id),
CONSTRAINT runtime_config_version_key UNIQUE (tenant_id,config_key,version_no),
CONSTRAINT runtime_config_submission_check CHECK (
(status='DRAFT' AND submitted_at IS NULL AND approved_at IS NULL AND published_at IS NULL) OR
(status='PENDING_APPROVAL' AND submitted_by IS NOT NULL AND submitted_at IS NOT NULL AND approved_at IS NULL AND published_at IS NULL) OR
(status='PUBLISHED' AND submitted_by IS NOT NULL AND submitted_at IS NOT NULL AND approved_by IS NOT NULL AND approved_at IS NOT NULL AND published_by IS NOT NULL AND published_at IS NOT NULL) OR
(status='RETIRED' AND retired_at IS NOT NULL)
)
);
CREATE UNIQUE INDEX runtime_config_one_published_key
ON runtime_config_version(tenant_id,config_key) WHERE status='PUBLISHED';
CREATE INDEX runtime_config_list_idx
ON runtime_config_version(tenant_id,config_key,version_no DESC);
CREATE INDEX runtime_config_status_idx
ON runtime_config_version(tenant_id,status,updated_at DESC);
COMMIT;