M1/#292: core library schema + sqlc + admin bootstrap #5

Merged
bvandeusen merged 262 commits from dev into main 2026-04-18 22:36:26 -04:00
bvandeusen commented 2026-04-18 22:33:25 -04:00 (Migrated from git.fabledsword.com)

Summary

  • Migration 0002_core_library: artists/albums/tracks/users with uuid PKs, partial-unique mbid indexes (WHERE mbid IS NOT NULL), tracks.file_path UNIQUE, sort-name/title indexes, timestamptz timestamps, pgcrypto for gen_random_uuid().
  • sqlc v1.27.0 (sqlc.yaml v2 config, pgx/v5, emit_pointers_for_null_types): typed queries generated into internal/db/dbq/ — UpsertArtist/Album/Track (ON CONFLICT by mbid or file_path), Get by ID/name/path, List by album/artist, CreateUser, GetUserByUsername, GetUserByAPIToken, CountUsers. Generated code checked in so CI doesn't need sqlc.
  • Admin bootstrap (internal/auth.Bootstrap): fires on empty users table when auth.admin_bootstrap.username is set; bcrypt password hash, 32-byte URL-safe api_token; blank password triggers random 18-byte generation and one-shot stderr print; idempotent (no-op when users exist). New env overrides SMARTMUSIC_AUTH_ADMIN_USERNAME / SMARTMUSIC_AUTH_ADMIN_PASSWORD.
  • Makefile wraps sqlc generate (docker), go test [-short] -race, lint, build.
  • Deps: golang.org/x/crypto v0.35.0 promoted to direct; go toolchain stays 1.23.0.

Verification (local)

  • go build ./..., go vet ./..., gofmt -l → clean
  • go test -short -race ./... → pass
  • Real Postgres (docker postgres:16-alpine on :55432): TestBootstrap_Integration passes — admin created + idempotent re-run, token lookup round-trips, bcrypt compare succeeds
  • CI-runner parity: docker run ... runner-base:go-ci — golangci-lint + short tests green
  • E2E smoke: SMARTMUSIC_DATABASE_URL=... SMARTMUSIC_AUTH_ADMIN_USERNAME=admin go run ./cmd/minstrel → migrations applied v2, admin bootstrapped with generated password+token printed once, /healthz returns {"status":"ok"}

Test plan

  • CI test.yml green on dev
  • Merge → release.yml publishes new :main image
  • Fable 292 verification log + status=done

🤖 Generated with Claude Code

## Summary - **Migration `0002_core_library`**: artists/albums/tracks/users with uuid PKs, partial-unique mbid indexes (`WHERE mbid IS NOT NULL`), `tracks.file_path UNIQUE`, sort-name/title indexes, timestamptz timestamps, pgcrypto for `gen_random_uuid()`. - **sqlc v1.27.0** (`sqlc.yaml` v2 config, pgx/v5, `emit_pointers_for_null_types`): typed queries generated into `internal/db/dbq/` — UpsertArtist/Album/Track (ON CONFLICT by mbid or file_path), Get by ID/name/path, List by album/artist, CreateUser, GetUserByUsername, GetUserByAPIToken, CountUsers. Generated code checked in so CI doesn't need sqlc. - **Admin bootstrap** (`internal/auth.Bootstrap`): fires on empty users table when `auth.admin_bootstrap.username` is set; bcrypt password hash, 32-byte URL-safe api_token; blank password triggers random 18-byte generation and one-shot stderr print; idempotent (no-op when users exist). New env overrides `SMARTMUSIC_AUTH_ADMIN_USERNAME` / `SMARTMUSIC_AUTH_ADMIN_PASSWORD`. - **Makefile** wraps `sqlc generate` (docker), `go test [-short] -race`, lint, build. - **Deps**: `golang.org/x/crypto v0.35.0` promoted to direct; go toolchain stays 1.23.0. ## Verification (local) - `go build ./...`, `go vet ./...`, `gofmt -l` → clean - `go test -short -race ./...` → pass - Real Postgres (docker `postgres:16-alpine` on :55432): `TestBootstrap_Integration` passes — admin created + idempotent re-run, token lookup round-trips, bcrypt compare succeeds - CI-runner parity: `docker run ... runner-base:go-ci` — golangci-lint + short tests green - E2E smoke: `SMARTMUSIC_DATABASE_URL=... SMARTMUSIC_AUTH_ADMIN_USERNAME=admin go run ./cmd/minstrel` → migrations applied v2, admin bootstrapped with generated password+token printed once, `/healthz` returns `{"status":"ok"}` ## Test plan - [ ] CI `test.yml` green on dev - [ ] Merge → `release.yml` publishes new `:main` image - [ ] Fable 292 verification log + status=done 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/minstrel#5