Files
gupi-osint-board/migrations/025_level_document_flags.sql
T

40 lines
2.1 KiB
SQL
Raw Normal View History

-- Level-local achievements and normalized document reveal requirements.
-- Requirements live on boards so they clone with immutable template versions;
-- earned/seen state lives on the mutable level instance.
ALTER TABLE osint.levels
ADD CONSTRAINT levels_id_board_unique UNIQUE (id,board_id);
CREATE TABLE osint.level_flags (
level_id UUID NOT NULL,
board_id UUID NOT NULL,
flag_key TEXT NOT NULL CHECK (flag_key ~ '^[a-z][a-z0-9_.-]{0,63}$'),
earned_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (level_id,flag_key),
FOREIGN KEY (level_id,board_id) REFERENCES osint.levels(id,board_id) ON DELETE CASCADE
);
CREATE INDEX level_flags_board_idx ON osint.level_flags (board_id,flag_key);
CREATE TABLE osint.document_flag_requirements (
board_id UUID NOT NULL REFERENCES osint.boards(id) ON DELETE CASCADE,
document_exhibit_id UUID NOT NULL REFERENCES osint.document_exhibits(exhibit_id) ON DELETE CASCADE,
flag_key TEXT NOT NULL CHECK (flag_key ~ '^[a-z][a-z0-9_.-]{0,63}$'),
PRIMARY KEY (document_exhibit_id,flag_key),
FOREIGN KEY (board_id,document_exhibit_id) REFERENCES osint.exhibits(board_id,id) ON DELETE CASCADE
);
CREATE INDEX document_flag_requirements_board_idx ON osint.document_flag_requirements (board_id,flag_key);
CREATE TABLE osint.level_seen_documents (
level_id UUID NOT NULL,
board_id UUID NOT NULL,
document_exhibit_id UUID NOT NULL REFERENCES osint.document_exhibits(exhibit_id) ON DELETE CASCADE,
seen_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (level_id,document_exhibit_id),
FOREIGN KEY (level_id,board_id) REFERENCES osint.levels(id,board_id) ON DELETE CASCADE,
FOREIGN KEY (board_id,document_exhibit_id) REFERENCES osint.exhibits(board_id,id) ON DELETE CASCADE
);
COMMENT ON TABLE osint.level_flags IS 'Boolean achievements earned within one mutable level instance.';
COMMENT ON TABLE osint.document_flag_requirements IS 'All listed flags must be earned before a document is included in the play-mode level payload.';
COMMENT ON TABLE osint.level_seen_documents IS 'Documents whose first-arrival animation has already been acknowledged for this level.';