54 lines
3.4 KiB
PL/PgSQL
54 lines
3.4 KiB
PL/PgSQL
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;
|