40 lines
2.1 KiB
SQL
40 lines
2.1 KiB
SQL
-- 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.';
|