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"}
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
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 forgen_random_uuid().sqlc.yamlv2 config, pgx/v5,emit_pointers_for_null_types): typed queries generated intointernal/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.internal/auth.Bootstrap): fires on empty users table whenauth.admin_bootstrap.usernameis 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 overridesSMARTMUSIC_AUTH_ADMIN_USERNAME/SMARTMUSIC_AUTH_ADMIN_PASSWORD.sqlc generate(docker),go test [-short] -race, lint, build.golang.org/x/crypto v0.35.0promoted to direct; go toolchain stays 1.23.0.Verification (local)
go build ./...,go vet ./...,gofmt -l→ cleango test -short -race ./...→ passpostgres:16-alpineon :55432):TestBootstrap_Integrationpasses — admin created + idempotent re-run, token lookup round-trips, bcrypt compare succeedsdocker run ... runner-base:go-ci— golangci-lint + short tests greenSMARTMUSIC_DATABASE_URL=... SMARTMUSIC_AUTH_ADMIN_USERNAME=admin go run ./cmd/minstrel→ migrations applied v2, admin bootstrapped with generated password+token printed once,/healthzreturns{"status":"ok"}Test plan
test.ymlgreen on devrelease.ymlpublishes new:mainimage🤖 Generated with Claude Code