Files
member-console/internal/domains/queries/placements.sql
T
cgalo5758 9b96e9c9e9 Rework operator IA and unify UI vocabulary
- Restructure operator sidebar into a flat task list with indented
  children; fold plan topology into plan ladders
- Expand member catalog non-plan section to all published non-tier
  products; require recurring Stripe-mapped prices for purchase
- Add operator domains placements and terminal-claims ledger; redirect
  /domains to the FedWiki Sites Domains anchor
- Apply canonical vocabulary and chrome/form conventions; migrate seeded
  FedWiki Sites display name
2026-08-23 17:12:42 -05:00

71 lines
2.7 KiB
SQL

-- name: CreatePlacement :one
INSERT INTO domains.placements (claim_id, fqdn, reversed_labels, provider, resource_ref, servable)
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING *;
-- name: GetPlacementByFQDN :one
-- The serving path (/domains/ask). Deliberately unconditional: a row with
-- servable = false is a local refusal, distinct from a registry miss, and
-- the authorizer needs to tell those apart (design D5).
SELECT * FROM domains.placements
WHERE fqdn = $1;
-- name: GetPlacementByID :one
-- The release path reads the placement before deleting it: the claim_id it
-- carries is what the auto-release re-count needs.
SELECT * FROM domains.placements
WHERE placement_id = $1;
-- name: GetPlacementByResource :one
SELECT * FROM domains.placements
WHERE provider = $1 AND resource_ref = $2;
-- name: ListPlacementsByClaim :many
SELECT * FROM domains.placements
WHERE claim_id = $1
ORDER BY fqdn;
-- name: CountPlacementsByClaim :one
-- Re-read under the registry advisory lock before auto-releasing a claim,
-- so a release racing a placement cannot strand a live placement in a
-- released claim (design D3).
SELECT COUNT(*) FROM domains.placements
WHERE claim_id = $1;
-- name: ListPlacementsByFQDNs :many
-- Ancestor walk on placements: an operator placement above a candidate root
-- blocks carving it. Exact equality keeps this on the fqdn unique index.
SELECT * FROM domains.placements
WHERE fqdn = ANY(@fqdns::text[])
ORDER BY length(fqdn) DESC;
-- name: ListPlacementsInSubtree :many
-- Descendant scan via the reversed-label prefix; excludes the subtree root
-- itself (an exact hit is the unique index's business).
SELECT * FROM domains.placements
WHERE reversed_labels LIKE @reversed_root::text || '.%'
ORDER BY reversed_labels;
-- name: SetPlacementServableByResource :execrows
-- Provider lifecycle transitions address placements by their own resource
-- identity, not by name (fedwiki: archive => FALSE, restore => TRUE).
UPDATE domains.placements
SET servable = $3, updated_at = NOW()
WHERE provider = $1 AND resource_ref = $2;
-- name: DeletePlacement :execrows
DELETE FROM domains.placements
WHERE placement_id = $1;
-- name: ListAllPlacementsForOperator :many
-- The operator placements section (ux-ia-naming task 9.1): every exact name
-- actually being served, deployment-wide, each with the provider resource it
-- is wired to. Claims and placements are never conflated
-- (docs/models/domains-registry.md, "Claim vs placement") -- a claim can hold
-- a name that serves nothing, and this is the query that answers what
-- actually serves. Ordered by fqdn so the list reads in the same namespace
-- order as the claims table above it.
SELECT placement_id, claim_id, fqdn, provider, resource_ref, servable, created_at
FROM domains.placements
ORDER BY fqdn;