Persist pool-scoped grants using OR semantics across active provisions, retaining lapsed rows for transition visibility. Add consumer queries, DB-backed coverage, and plans for the dependent Discourse integration.
32 lines
1.5 KiB
SQL
32 lines
1.5 KiB
SQL
-- +goose Up
|
|
-- Materialized boolean entitlements: one row per (pool, resource_key) that has
|
|
-- ever been carried by an active provision's boolean rule. `granted` reflects
|
|
-- whether at least one active provision currently carries the rule; rows are
|
|
-- retained with granted = FALSE on lapse so consumers can observe transitions.
|
|
-- Absence of a row means the key was never conferred on the pool.
|
|
CREATE TABLE core.boolean_entitlements (
|
|
pool_id UUID NOT NULL,
|
|
resource_key VARCHAR(100) NOT NULL,
|
|
granted BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT pk_boolean_entitlements PRIMARY KEY (pool_id, resource_key),
|
|
CONSTRAINT fk_boolean_entitlements_pool_id FOREIGN KEY (pool_id) REFERENCES core.resource_pools(pool_id),
|
|
CONSTRAINT fk_boolean_entitlements_resource_key FOREIGN KEY (resource_key) REFERENCES core.resource_keys(resource_key)
|
|
);
|
|
|
|
CREATE INDEX idx_boolean_entitlements_resource_key ON core.boolean_entitlements(resource_key);
|
|
|
|
CREATE TRIGGER trigger_boolean_entitlements_updated_at
|
|
BEFORE UPDATE ON core.boolean_entitlements
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION public.update_updated_at_column();
|
|
|
|
-- The init migration's GRANT ON ALL TABLES was point-in-time; new relations
|
|
-- need their own grants.
|
|
GRANT ALL ON core.boolean_entitlements TO core_owner, core_writer;
|
|
GRANT SELECT ON core.boolean_entitlements TO core_reader;
|
|
|
|
-- +goose Down
|
|
DROP TABLE core.boolean_entitlements;
|