-- Entitle webhook_endpoints (030) and slack_endpoints (032): both stores already -- call wrapQuotaErr on insert, expecting the quota_check triggers created here. ALTER TABLE entitlements ADD COLUMN webhooks_used INTEGER NOT NULL DEFAULT 0; ALTER TABLE entitlements ADD COLUMN webhooks_max INTEGER NOT NULL DEFAULT 0; ALTER TABLE entitlements ADD COLUMN slack_used INTEGER NOT NULL DEFAULT 0; ALTER TABLE entitlements ADD COLUMN slack_max INTEGER NOT NULL DEFAULT 0; -- New columns default max=0 (fail-closed). Backfill existing tenants to the -- ents.Defaults() values so they aren't retroactively blocked; _used starts at 0 -- because these resources are new (no rows predate this migration). UPDATE entitlements SET webhooks_max = 10, slack_max = 5; -- webhook_endpoints CREATE TRIGGER ents_webhooks_incr AFTER INSERT ON webhook_endpoints BEGIN UPDATE entitlements SET webhooks_used = webhooks_used + 1 WHERE tenant = NEW.tenant; END; CREATE TRIGGER ents_webhooks_decr AFTER DELETE ON webhook_endpoints BEGIN UPDATE entitlements SET webhooks_used = webhooks_used - 1 WHERE tenant = OLD.tenant; END; CREATE TRIGGER quota_check_webhooks BEFORE INSERT ON webhook_endpoints BEGIN SELECT RAISE(ABORT, 'quota exceeded: webhooks') WHERE NOT EXISTS ( SELECT 1 FROM entitlements WHERE tenant = NEW.tenant AND webhooks_used < webhooks_max ); END; -- slack_endpoints CREATE TRIGGER ents_slack_incr AFTER INSERT ON slack_endpoints BEGIN UPDATE entitlements SET slack_used = slack_used + 1 WHERE tenant = NEW.tenant; END; CREATE TRIGGER ents_slack_decr AFTER DELETE ON slack_endpoints BEGIN UPDATE entitlements SET slack_used = slack_used - 1 WHERE tenant = OLD.tenant; END; CREATE TRIGGER quota_check_slack BEFORE INSERT ON slack_endpoints BEGIN SELECT RAISE(ABORT, 'quota exceeded: slack') WHERE NOT EXISTS ( SELECT 1 FROM entitlements WHERE tenant = NEW.tenant AND slack_used < slack_max ); END;