fix(education): control content node visibility

This commit is contained in:
2026-07-30 23:50:50 +08:00
parent e0a695978c
commit f84aecf8f5
9 changed files with 36 additions and 20 deletions

View File

@@ -6,14 +6,18 @@ ALTER TABLE education_content_node
ADD COLUMN authoring_version INTEGER NOT NULL DEFAULT 0;
UPDATE education_content_node
SET publication_status = CASE WHEN is_active THEN 'ACTIVE' ELSE 'ARCHIVED' END;
SET publication_status = CASE WHEN is_active AND NOT is_hidden THEN 'ACTIVE' ELSE 'ARCHIVED' END,
is_active = is_active AND NOT is_hidden,
is_hidden = NOT (is_active AND NOT is_hidden);
ALTER TABLE education_content_node
ADD CONSTRAINT ck_education_content_node_publication_status
CHECK (publication_status IN ('DRAFT', 'ACTIVE', 'ARCHIVED')),
ADD CONSTRAINT ck_education_content_node_authoring_version CHECK (authoring_version >= 0),
ADD CONSTRAINT ck_education_content_node_lifecycle_consistent
CHECK (is_active = (publication_status = 'ACTIVE'));
ADD CONSTRAINT ck_education_content_node_lifecycle_consistent CHECK (
(publication_status = 'ACTIVE' AND is_active AND NOT is_hidden) OR
(publication_status IN ('DRAFT', 'ARCHIVED') AND NOT is_active AND is_hidden)
);
COMMENT ON COLUMN education_content_node.publication_status IS '内容节点发布状态DRAFT、ACTIVE、ARCHIVED';
COMMENT ON COLUMN education_content_node.authoring_version IS '内容节点创作和生命周期共用的乐观锁版本';
@@ -47,11 +51,13 @@ RETURNS TRIGGER LANGUAGE plpgsql SET search_path = pg_catalog, pg_temp AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
IF NEW.scope = 'PUBLIC' THEN
IF NEW.publication_status <> 'ACTIVE' OR NOT NEW.is_active OR NEW.authoring_version <> 0 THEN
IF NEW.publication_status <> 'ACTIVE' OR NOT NEW.is_active OR NEW.is_hidden
OR NEW.authoring_version <> 0 THEN
RAISE EXCEPTION 'PUBLIC content node writes are not managed by tenant authoring' USING ERRCODE = '23514';
END IF;
ELSIF NEW.scope = 'TENANT_OWNED' AND
(NEW.publication_status <> 'DRAFT' OR NEW.is_active OR NEW.authoring_version <> 0) THEN
(NEW.publication_status <> 'DRAFT' OR NEW.is_active OR NOT NEW.is_hidden
OR NEW.authoring_version <> 0) THEN
RAISE EXCEPTION 'tenant content nodes must start in DRAFT' USING ERRCODE = '23514';
END IF;
RETURN NEW;