Files
member-console/internal/domains/placements.sql.go
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

354 lines
9.8 KiB
Go

// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.29.0
// source: placements.sql
package domains
import (
"context"
"time"
"github.com/lib/pq"
)
const countPlacementsByClaim = `-- name: CountPlacementsByClaim :one
SELECT COUNT(*) FROM domains.placements
WHERE claim_id = $1
`
// 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).
func (q *Queries) CountPlacementsByClaim(ctx context.Context, claimID string) (int64, error) {
row := q.db.QueryRowContext(ctx, countPlacementsByClaim, claimID)
var count int64
err := row.Scan(&count)
return count, err
}
const createPlacement = `-- name: CreatePlacement :one
INSERT INTO domains.placements (claim_id, fqdn, reversed_labels, provider, resource_ref, servable)
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at
`
type CreatePlacementParams struct {
ClaimID string `json:"claim_id"`
Fqdn string `json:"fqdn"`
ReversedLabels string `json:"reversed_labels"`
Provider string `json:"provider"`
ResourceRef string `json:"resource_ref"`
Servable bool `json:"servable"`
}
func (q *Queries) CreatePlacement(ctx context.Context, arg CreatePlacementParams) (Placement, error) {
row := q.db.QueryRowContext(ctx, createPlacement,
arg.ClaimID,
arg.Fqdn,
arg.ReversedLabels,
arg.Provider,
arg.ResourceRef,
arg.Servable,
)
var i Placement
err := row.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
const deletePlacement = `-- name: DeletePlacement :execrows
DELETE FROM domains.placements
WHERE placement_id = $1
`
func (q *Queries) DeletePlacement(ctx context.Context, placementID string) (int64, error) {
result, err := q.db.ExecContext(ctx, deletePlacement, placementID)
if err != nil {
return 0, err
}
return result.RowsAffected()
}
const getPlacementByFQDN = `-- name: GetPlacementByFQDN :one
SELECT placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at FROM domains.placements
WHERE fqdn = $1
`
// 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).
func (q *Queries) GetPlacementByFQDN(ctx context.Context, fqdn string) (Placement, error) {
row := q.db.QueryRowContext(ctx, getPlacementByFQDN, fqdn)
var i Placement
err := row.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
const getPlacementByID = `-- name: GetPlacementByID :one
SELECT placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at FROM domains.placements
WHERE placement_id = $1
`
// The release path reads the placement before deleting it: the claim_id it
// carries is what the auto-release re-count needs.
func (q *Queries) GetPlacementByID(ctx context.Context, placementID string) (Placement, error) {
row := q.db.QueryRowContext(ctx, getPlacementByID, placementID)
var i Placement
err := row.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
const getPlacementByResource = `-- name: GetPlacementByResource :one
SELECT placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at FROM domains.placements
WHERE provider = $1 AND resource_ref = $2
`
type GetPlacementByResourceParams struct {
Provider string `json:"provider"`
ResourceRef string `json:"resource_ref"`
}
func (q *Queries) GetPlacementByResource(ctx context.Context, arg GetPlacementByResourceParams) (Placement, error) {
row := q.db.QueryRowContext(ctx, getPlacementByResource, arg.Provider, arg.ResourceRef)
var i Placement
err := row.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
const listAllPlacementsForOperator = `-- name: ListAllPlacementsForOperator :many
SELECT placement_id, claim_id, fqdn, provider, resource_ref, servable, created_at
FROM domains.placements
ORDER BY fqdn
`
type ListAllPlacementsForOperatorRow struct {
PlacementID string `json:"placement_id"`
ClaimID string `json:"claim_id"`
Fqdn string `json:"fqdn"`
Provider string `json:"provider"`
ResourceRef string `json:"resource_ref"`
Servable bool `json:"servable"`
CreatedAt time.Time `json:"created_at"`
}
// 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.
func (q *Queries) ListAllPlacementsForOperator(ctx context.Context) ([]ListAllPlacementsForOperatorRow, error) {
rows, err := q.db.QueryContext(ctx, listAllPlacementsForOperator)
if err != nil {
return nil, err
}
defer rows.Close()
items := []ListAllPlacementsForOperatorRow{}
for rows.Next() {
var i ListAllPlacementsForOperatorRow
if err := rows.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listPlacementsByClaim = `-- name: ListPlacementsByClaim :many
SELECT placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at FROM domains.placements
WHERE claim_id = $1
ORDER BY fqdn
`
func (q *Queries) ListPlacementsByClaim(ctx context.Context, claimID string) ([]Placement, error) {
rows, err := q.db.QueryContext(ctx, listPlacementsByClaim, claimID)
if err != nil {
return nil, err
}
defer rows.Close()
items := []Placement{}
for rows.Next() {
var i Placement
if err := rows.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listPlacementsByFQDNs = `-- name: ListPlacementsByFQDNs :many
SELECT placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at FROM domains.placements
WHERE fqdn = ANY($1::text[])
ORDER BY length(fqdn) DESC
`
// Ancestor walk on placements: an operator placement above a candidate root
// blocks carving it. Exact equality keeps this on the fqdn unique index.
func (q *Queries) ListPlacementsByFQDNs(ctx context.Context, fqdns []string) ([]Placement, error) {
rows, err := q.db.QueryContext(ctx, listPlacementsByFQDNs, pq.Array(fqdns))
if err != nil {
return nil, err
}
defer rows.Close()
items := []Placement{}
for rows.Next() {
var i Placement
if err := rows.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listPlacementsInSubtree = `-- name: ListPlacementsInSubtree :many
SELECT placement_id, claim_id, fqdn, reversed_labels, provider, resource_ref, servable, created_at, updated_at FROM domains.placements
WHERE reversed_labels LIKE $1::text || '.%'
ORDER BY reversed_labels
`
// Descendant scan via the reversed-label prefix; excludes the subtree root
// itself (an exact hit is the unique index's business).
func (q *Queries) ListPlacementsInSubtree(ctx context.Context, reversedRoot string) ([]Placement, error) {
rows, err := q.db.QueryContext(ctx, listPlacementsInSubtree, reversedRoot)
if err != nil {
return nil, err
}
defer rows.Close()
items := []Placement{}
for rows.Next() {
var i Placement
if err := rows.Scan(
&i.PlacementID,
&i.ClaimID,
&i.Fqdn,
&i.ReversedLabels,
&i.Provider,
&i.ResourceRef,
&i.Servable,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const setPlacementServableByResource = `-- name: SetPlacementServableByResource :execrows
UPDATE domains.placements
SET servable = $3, updated_at = NOW()
WHERE provider = $1 AND resource_ref = $2
`
type SetPlacementServableByResourceParams struct {
Provider string `json:"provider"`
ResourceRef string `json:"resource_ref"`
Servable bool `json:"servable"`
}
// Provider lifecycle transitions address placements by their own resource
// identity, not by name (fedwiki: archive => FALSE, restore => TRUE).
func (q *Queries) SetPlacementServableByResource(ctx context.Context, arg SetPlacementServableByResourceParams) (int64, error) {
result, err := q.db.ExecContext(ctx, setPlacementServableByResource, arg.Provider, arg.ResourceRef, arg.Servable)
if err != nil {
return 0, err
}
return result.RowsAffected()
}