Domain names become an allocatable resource with one authority. A new core module (schema `domains`, own migration stream between core and the integrations) owns claims — a DNS node plus its whole subtree, mutually disjoint: operator shared-domain roots, member claims carved from them, and bring-your-own names proven by TXT verification — and placements, which bind a name inside a claim to a provider slug and resource ref. Verification moves to the claim and decouples from creation. A member proves control of a domain once; afterwards every name inside it places instantly, wildcard-CNAME friendly, with no further DNS work. The claim workflow activates the claim and stops — it no longer creates a site — so the sites list offers a one-click create once a domain verifies. /domains/ask answers from placements and is registered by core rather than the FedWiki adapter; its HTTP contract is unchanged. A configured `domains-ask-fallback-url` forwards names the registry does not know to a legacy answerer, the strangler seam wiki.cafe's migration needs; a name the registry knows but has archived is refused locally. FedWiki's create saga reserves the name before the farm call, carrying a workflow-minted site id so retries are idempotent, and compensates on failure. Sync places only names it owns, never stealing a member's; lifecycle transitions and the retention purge maintain servability. An unconditional boot pass seeds operator roots, releases orphaned placements, and adopts pre-existing sites — grandfathering member-owned external domains shortest-name-first, and skipping name policy, so a live single-letter site cannot lose its certificate. Members manage domains at /domains: claims with verification status, DNS records including an optional wildcard row, check-now, cancel, release. Name policy (reserved, blocked, premium, plus a single-letter guard) is operator data; refusals collapse to a plain "unavailable" so the console never becomes an oracle for who holds what. BREAKING (pre-release): `fedwiki.custom_domain_verifications` and `sites.is_custom_domain` are dropped, the flag now derived from the placement's claim kind; resource key `fedwiki_custom_domains` migrates to the platform-owned `external_domain_claims`; running verify-custom-domain workflows must be terminated before deploy.
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.29.0
|
|
// source: name_rules.sql
|
|
|
|
package domains
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
const getNameRuleForLabel = `-- name: GetNameRuleForLabel :one
|
|
SELECT rule_id, root_claim_id, label, kind, note, created_at FROM domains.name_rules
|
|
WHERE label = $1
|
|
AND (root_claim_id = $2 OR root_claim_id IS NULL)
|
|
ORDER BY root_claim_id NULLS LAST
|
|
LIMIT 1
|
|
`
|
|
|
|
type GetNameRuleForLabelParams struct {
|
|
Label string `json:"label"`
|
|
RootClaimID uuid.NullUUID `json:"root_claim_id"`
|
|
}
|
|
|
|
// Exact-label policy lookup, root-scoped first then global (root_claim_id
|
|
// NULL). A NULL root_claim_id argument matches global rules only, since
|
|
// `root_claim_id = NULL` is never true.
|
|
func (q *Queries) GetNameRuleForLabel(ctx context.Context, arg GetNameRuleForLabelParams) (NameRule, error) {
|
|
row := q.db.QueryRowContext(ctx, getNameRuleForLabel, arg.Label, arg.RootClaimID)
|
|
var i NameRule
|
|
err := row.Scan(
|
|
&i.RuleID,
|
|
&i.RootClaimID,
|
|
&i.Label,
|
|
&i.Kind,
|
|
&i.Note,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|