Add an append-only ledger of entitlement set rule changes with per-pool effect rows, a preview-and-commit rule change flow, and an automatic drain that settles deferred recomputations. Rules gain a tier reduction policy, resource keys declare over-limit behavior, and the materializer now lowers limits when a rule stops applying. Add entitlement set rule change ledger and preview flow Add an append-only ledger of entitlement set rule changes with a preview-and-commit operator flow. Rule writes now go through an enclosed `core.commit_rule_change` function that files an act row and one obligation per carrying pool, with a drain workflow settling deferred recomputations. The preview dry-runs the materializer with a rule overlay and renders per-pool buckets, reduction-policy disclosures, and provider over-limit consequences. Materializing transactions take a shared advisory rendezvous that rule changes hold exclusively, enforced by a possession assertion. Add History and Entitlement changes surfaces, a rule-less warning on five product-selection surfaces, and a `tier_reduction_policy` column that gates FedWiki parking.
145 lines
6.2 KiB
PL/PgSQL
145 lines
6.2 KiB
PL/PgSQL
-- SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial
|
|
-- SPDX-FileCopyrightText: 2025-2026 Christian Galo
|
|
|
|
-- mockshot-nuke.sql — exact reversal of mockshot-seed.sql, FK order.
|
|
--
|
|
-- The seed owns three predicates and nothing else: organizations whose `key`
|
|
-- starts with `mockshot_`, users whose OIDC subject starts with `mockshot:`,
|
|
-- and the catalog rows keyed `mockshot_hosting` (entitlement set) and
|
|
-- `mockshot_*` (products, and the prices hanging off them). Every other row
|
|
-- the seed created is reached from one of those three: through its
|
|
-- organization (pools, workspaces, assignments, accounts, subscriptions,
|
|
-- items, invoices, payments, grants, provisions) or through its catalog
|
|
-- parent. There is no marker column, no owner email predicate, and no name
|
|
-- match anywhere in this file.
|
|
--
|
|
-- psql -h localhost -p $POSTGRES_PORT -U member_console -d member_console \
|
|
-- -v ON_ERROR_STOP=1 -f test/mockshot-nuke.sql
|
|
|
|
BEGIN;
|
|
|
|
-- Provisions first: they reference pools, grants, subscriptions, products,
|
|
-- and the entitlement set, so every later delete depends on them being gone.
|
|
DELETE FROM core.pool_provisions
|
|
WHERE pool_id IN (
|
|
SELECT rp.pool_id FROM core.resource_pools rp
|
|
JOIN core.organizations o ON o.org_id = rp.org_id
|
|
WHERE o.key LIKE 'mockshot\_%'
|
|
);
|
|
|
|
-- The rule-change ledger of the seed's set, before the pools and the
|
|
-- organizations its effect rows reference. The seed adds its rule before any
|
|
-- pool carries the set, so in practice only the act row exists.
|
|
DELETE FROM core.entitlement_set_change_effects
|
|
WHERE change_id IN (
|
|
SELECT c.change_id FROM core.entitlement_set_changes c
|
|
JOIN core.entitlement_sets es ON es.set_id = c.set_id
|
|
WHERE es.key = 'mockshot_hosting'
|
|
);
|
|
|
|
DELETE FROM core.entitlement_set_change_obligations
|
|
WHERE change_id IN (
|
|
SELECT c.change_id FROM core.entitlement_set_changes c
|
|
JOIN core.entitlement_sets es ON es.set_id = c.set_id
|
|
WHERE es.key = 'mockshot_hosting'
|
|
);
|
|
|
|
DELETE FROM core.entitlement_set_changes
|
|
WHERE set_id IN (SELECT set_id FROM core.entitlement_sets WHERE key = 'mockshot_hosting');
|
|
|
|
DELETE FROM core.grants
|
|
WHERE granted_to_org_id IN (SELECT org_id FROM core.organizations WHERE key LIKE 'mockshot\_%');
|
|
|
|
DELETE FROM core.payments
|
|
WHERE billing_account_id IN (
|
|
SELECT a.billing_account_id FROM core.accounts a
|
|
JOIN core.organizations o ON o.org_id = a.org_id
|
|
WHERE o.key LIKE 'mockshot\_%'
|
|
);
|
|
|
|
DELETE FROM core.invoices
|
|
WHERE billing_account_id IN (
|
|
SELECT a.billing_account_id FROM core.accounts a
|
|
JOIN core.organizations o ON o.org_id = a.org_id
|
|
WHERE o.key LIKE 'mockshot\_%'
|
|
);
|
|
|
|
-- Items reference prices, so they go before the catalog below.
|
|
DELETE FROM core.subscription_items
|
|
WHERE subscription_id IN (
|
|
SELECT s.subscription_id FROM core.subscriptions s
|
|
JOIN core.accounts a ON a.billing_account_id = s.billing_account_id
|
|
JOIN core.organizations o ON o.org_id = a.org_id
|
|
WHERE o.key LIKE 'mockshot\_%'
|
|
);
|
|
|
|
DELETE FROM core.subscriptions
|
|
WHERE billing_account_id IN (
|
|
SELECT a.billing_account_id FROM core.accounts a
|
|
JOIN core.organizations o ON o.org_id = a.org_id
|
|
WHERE o.key LIKE 'mockshot\_%'
|
|
);
|
|
|
|
DELETE FROM core.accounts
|
|
WHERE org_id IN (SELECT org_id FROM core.organizations WHERE key LIKE 'mockshot\_%');
|
|
|
|
-- Workspaces and pools: the assignment joins them, so it goes first.
|
|
DELETE FROM core.pool_assignments
|
|
WHERE pool_id IN (
|
|
SELECT rp.pool_id FROM core.resource_pools rp
|
|
JOIN core.organizations o ON o.org_id = rp.org_id
|
|
WHERE o.key LIKE 'mockshot\_%'
|
|
);
|
|
|
|
DELETE FROM core.workspaces
|
|
WHERE org_id IN (SELECT org_id FROM core.organizations WHERE key LIKE 'mockshot\_%');
|
|
|
|
DELETE FROM core.resource_pools
|
|
WHERE org_id IN (SELECT org_id FROM core.organizations WHERE key LIKE 'mockshot\_%');
|
|
|
|
-- After the grants, accounts, and pools that referenced the organizations.
|
|
DELETE FROM core.organizations WHERE key LIKE 'mockshot\_%';
|
|
|
|
-- The catalog, after the subscription items and provisions that referenced
|
|
-- it: prices before their products, the rules before their set.
|
|
DELETE FROM core.prices
|
|
WHERE product_id IN (SELECT product_id FROM core.products WHERE key LIKE 'mockshot\_%');
|
|
|
|
DELETE FROM core.products WHERE key LIKE 'mockshot\_%';
|
|
|
|
-- core_writer holds no DML on core.entitlement_set_rules (migration 00018):
|
|
-- core.commit_rule_change writes a rule and nothing deletes one, so a teardown
|
|
-- deletes as the owner role. This file is a test-stack tool, run by a login
|
|
-- role that is a member of core_owner.
|
|
SET ROLE core_owner;
|
|
DELETE FROM core.entitlement_set_rules
|
|
WHERE set_id IN (SELECT set_id FROM core.entitlement_sets WHERE key = 'mockshot_hosting');
|
|
RESET ROLE;
|
|
|
|
DELETE FROM core.entitlement_sets WHERE key = 'mockshot_hosting';
|
|
|
|
-- The team org type is vocabulary keyed on the type itself, so it is removed
|
|
-- only once nothing is left using it — a dependency check, not a marker.
|
|
DELETE FROM core.org_types t
|
|
WHERE t.org_type = 'team'
|
|
AND NOT EXISTS (SELECT 1 FROM core.organizations o WHERE o.org_type = t.org_type);
|
|
|
|
-- Cascades the mock persons (fk_persons_user_id ON DELETE CASCADE).
|
|
DELETE FROM core.users WHERE oidc_subject LIKE 'mockshot:%';
|
|
|
|
COMMIT;
|
|
|
|
-- Should all be zero
|
|
SELECT (SELECT count(*) FROM core.users WHERE oidc_subject LIKE 'mockshot:%') AS users_left,
|
|
(SELECT count(*) FROM core.organizations
|
|
WHERE key LIKE 'mockshot\_%' AND key NOT LIKE 'mockshot\_t%') AS personal_orgs_left,
|
|
(SELECT count(*) FROM core.organizations WHERE key LIKE 'mockshot\_t%') AS team_orgs_left,
|
|
(SELECT count(*) FROM core.grants g JOIN core.organizations o
|
|
ON o.org_id = g.granted_to_org_id WHERE o.key LIKE 'mockshot\_%') AS grants_left,
|
|
(SELECT count(*) FROM core.accounts a JOIN core.organizations o
|
|
ON o.org_id = a.org_id WHERE o.key LIKE 'mockshot\_%') AS accounts_left,
|
|
(SELECT count(*) FROM core.products WHERE key LIKE 'mockshot\_%') AS products_left,
|
|
(SELECT count(*) FROM core.prices p JOIN core.products pd
|
|
ON pd.product_id = p.product_id WHERE pd.key LIKE 'mockshot\_%') AS prices_left,
|
|
(SELECT count(*) FROM core.entitlement_sets WHERE key = 'mockshot_hosting') AS entitlement_sets_left;
|