Files
buzz/migrations/0002_git_repo_names.sql

30 lines
1.6 KiB
SQL

-- ── Git repo name registry (NIP-34 kind:30617) ───────────────────────────────
-- The relay holds no persistent per-repo filesystem state: git reads/writes
-- hydrate an ephemeral bare repo from object storage per request, and writer
-- serialization is the object-store pointer CAS (docs/git-on-object-storage.md,
-- Inv_NoFork). This table is the one remaining shared-state need — repo-name
-- uniqueness — moved off local disk so the relay is stateless and can run
-- multiple replicas without a ReadWriteMany volume.
--
-- Additive migration (not folded into 0001): brownfield databases that already
-- applied the pre-PR 0001 must not see its checksum change, or sqlx aborts
-- startup with a VersionMismatch. New table + index only; no edits to existing
-- objects.
--
-- Per-community, not global: a repo name is unique within a community, matching
-- the multi-tenant invariant (community_id leads the PK). The PK enforces
-- uniqueness atomically (INSERT … ON CONFLICT), replacing the old atomic
-- `create_dir`. `owner_pubkey` distinguishes idempotent re-announce (same owner)
-- from collision (different owner), and backs the per-pubkey quota via COUNT.
CREATE TABLE git_repo_names (
community_id UUID NOT NULL REFERENCES communities(id),
repo_id TEXT NOT NULL,
owner_pubkey TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (community_id, repo_id)
);
-- Backs the per-pubkey repo quota: COUNT(*) WHERE community_id = $1 AND owner_pubkey = $2.
CREATE INDEX idx_git_repo_names_owner ON git_repo_names (community_id, owner_pubkey);