diff --git a/db/periodic-table.sql b/db/periodic-table.sql index dc1a451..9b47774 100644 --- a/db/periodic-table.sql +++ b/db/periodic-table.sql @@ -389,4 +389,94 @@ $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_audit_requirements_groups BEFORE UPDATE OR DELETE ON requirements_groups FOR EACH ROW -EXECUTE FUNCTION archive_requirements_groups_change(); \ No newline at end of file +EXECUTE FUNCTION archive_requirements_groups_change(); + +-- ACCEPTANCE_CRITERIA: Individual conditions a requirement must meet +CREATE TABLE acceptance_criteria ( + id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + requirement_id INT NOT NULL, + criteria_text TEXT NOT NULL, + is_accepted BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW(), + + CONSTRAINT fk_ac_requirement FOREIGN KEY (requirement_id) REFERENCES requirements (id) ON DELETE CASCADE +); + +-- Index for performance when loading a requirement's page +CREATE INDEX idx_ac_requirement ON acceptance_criteria(requirement_id); + +CREATE OR REPLACE FUNCTION update_modified_column() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ language 'plpgsql'; + +CREATE TRIGGER update_ac_modtime +BEFORE UPDATE ON acceptance_criteria +FOR EACH ROW +EXECUTE FUNCTION update_modified_column(); + +-- Add editor tracking to the main table +ALTER TABLE acceptance_criteria +ADD COLUMN last_editor_id INT; + +ALTER TABLE acceptance_criteria +ADD CONSTRAINT fk_ac_editor FOREIGN KEY (last_editor_id) REFERENCES users (id); + +-- ACCEPTANCE_CRITERIA_HISTORY: Tracks changes to criteria and acceptance state +CREATE TABLE acceptance_criteria_history ( + history_id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + original_ac_id INT NOT NULL, + requirement_id INT, + criteria_text TEXT, + is_accepted BOOLEAN, + valid_from TIMESTAMPTZ, + valid_to TIMESTAMPTZ DEFAULT NOW(), + edited_by INT, + + CONSTRAINT fk_ach_user FOREIGN KEY (edited_by) REFERENCES users (id) +); + +-- Index for auditing specific requirements +CREATE INDEX idx_ach_req ON acceptance_criteria_history(requirement_id); + +-- Function to archive the state of an acceptance criterion +CREATE OR REPLACE FUNCTION archive_acceptance_criteria_change() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO acceptance_criteria_history ( + original_ac_id, + requirement_id, + criteria_text, + is_accepted, + valid_from, + valid_to, + edited_by + ) + VALUES ( + OLD.id, + OLD.requirement_id, + OLD.criteria_text, + OLD.is_accepted, + OLD.updated_at, -- When this version started + NOW(), -- When this version was replaced/deleted + OLD.last_editor_id + ); + + IF (TG_OP = 'DELETE') THEN + RETURN OLD; + ELSE + NEW.updated_at := NOW(); -- Update the timestamp on the current record + RETURN NEW; + END IF; +END; +$$ LANGUAGE plpgsql; + +-- Bind the trigger to the table +CREATE TRIGGER trigger_audit_acceptance_criteria +BEFORE UPDATE OR DELETE ON acceptance_criteria +FOR EACH ROW +EXECUTE FUNCTION archive_acceptance_criteria_change(); \ No newline at end of file