Files
member-console/internal/entitlements/queries/numeric_entitlement_usage.sql
T
cgalo5758 12f1d3fc00 Fix the four Slice 3 walk findings and page every operator list
Archives openspec change slice3-walk-fixes and syncs its five delta
specs (fedwiki-sites, entitlements, operator-panel-navigation,
operator-list-scale, ui-quality-gate).

- FedWiki site usage is read from active site rows in both quota
  readers; the reservation counter converges on the rows: raise-only
  after farm sync and inside the create quota check, exact at boot.
  The understated production counters repair on the first boot.
- The People tile caption excludes the reserved system person through
  the same query parameter the directory uses.
- The operator Domains live-claims list is a governed list: pages of
  50, true total, search over root name and organization, a
  pending/active facet.
- New lint rule table-without-list-controls refuses an unpaged
  page-body table unless it carries a list-scale exempt marker with a
  reason; six curated or detail tables carry one. Its first run caught
  the operator FedWiki sites list, which is now governed the same way.
- Entitlement-set rule copy: "Per unit", "Multiplied by the quantity
  purchased or granted."
2026-09-12 01:16:17 -05:00

71 lines
2.8 KiB
SQL

-- name: CreateNumericEntitlementUsage :one
INSERT INTO core.numeric_entitlement_usage (entitlement_id, pool_id, resource_key)
VALUES ($1, $2, $3)
RETURNING *;
-- name: GetUsageByPoolAndResource :one
SELECT * FROM core.numeric_entitlement_usage
WHERE pool_id = $1 AND resource_key = $2;
-- name: AtomicIncrementUsage :execresult
UPDATE core.numeric_entitlement_usage neu
SET current_usage = neu.current_usage + 1
WHERE neu.pool_id IN (
SELECT pa.pool_id FROM core.pool_assignments pa
WHERE pa.workspace_id = $1 AND pa.is_primary = TRUE AND pa.status = 'active'
)
AND neu.resource_key = $2
AND neu.current_usage < (
SELECT ne.resource_limit FROM core.numeric_entitlements ne
WHERE ne.entitlement_id = neu.entitlement_id
);
-- name: AtomicDecrementUsage :execresult
UPDATE core.numeric_entitlement_usage neu
SET current_usage = GREATEST(neu.current_usage - 1, 0)
WHERE neu.pool_id IN (
SELECT pa.pool_id FROM core.pool_assignments pa
WHERE pa.workspace_id = $1 AND pa.is_primary = TRUE AND pa.status = 'active'
)
AND neu.resource_key = $2;
-- name: ListNumericEntitlementUsageByPoolID :many
SELECT * FROM core.numeric_entitlement_usage
WHERE pool_id = $1
ORDER BY resource_key ASC;
-- name: ListPoolUsageWithLimitsByPoolID :many
-- Per-resource usage counters for a pool joined to their materialized
-- limit (used vs limit per resource key), for the org-detail pools panel
-- (ux-honest-surfaces: "pool status and usage are visible on the
-- organization view"). A counter row exists only under a materialized
-- numeric entitlement (invariant 9, resource-pools card), so the JOIN
-- never orphans.
SELECT
neu.resource_key,
neu.current_usage,
ne.resource_limit
FROM core.numeric_entitlement_usage neu
JOIN core.numeric_entitlements ne ON ne.entitlement_id = neu.entitlement_id
WHERE neu.pool_id = $1
ORDER BY neu.resource_key ASC;
-- name: RaiseNumericUsageTo :execresult
-- Raise-only reconcile against the count of rows the owning integration holds.
-- Never lowers: a create workflow holds a reservation between its gated
-- increment and its row insert, and lowering here would erase it. Lowering on
-- a real deletion stays with the decrement and drift paths.
-- Creates no usage row; a missing counter remains the materializer's to create.
UPDATE core.numeric_entitlement_usage
SET current_usage = GREATEST(current_usage, sqlc.arg(observed))
WHERE pool_id = sqlc.arg(pool_id) AND resource_key = sqlc.arg(resource_key);
-- name: SetNumericUsage :execresult
-- Exact set, for boot reconciliation only: at boot no create workflow holds an
-- unmaterialized reservation, so the owned rows are the whole truth and an
-- overstated counter (which refuses creates) can be brought down.
-- Creates no usage row.
UPDATE core.numeric_entitlement_usage
SET current_usage = sqlc.arg(observed)
WHERE pool_id = sqlc.arg(pool_id) AND resource_key = sqlc.arg(resource_key);