Battle.net-Style Handle Username#XXXX als Basis fuer kommende Community-Features (Stufe 2 der Roadmap). Diese Stufe: Schema, Migration, Generator und API. Die UI im Profil-Tab folgt in einem eigenen Commit. Schema (packages/db/src/schema/auth.ts): - Neue Spalten an der user-Tabelle: username, discriminator, bio (alle nullable), profileVisible (notNull, default false = Privacy-by-Default). - uniqueIndex auf (username, discriminator); NULLs distinct, greift also nur bei vollstaendigen Handles. Index user_username_idx auf username fuer die Handle-Erstvergabe-Query. - Migration 0019_community_profile, per drizzle-kit generate erzeugt, driftfrei (zweiter generate: keine Aenderung), drizzle-kit check ok. Noch nicht gegen die DB angewendet. Generator (packages/api/src/lib/handle.ts): - Discriminator aus verwechslungsarmem Alphabet, Kollisions-Retry. - formatHandle, validateUsername. 17 node:test-Unit-Tests. API (packages/api/src/trpc/routers/users.ts): - myProfile um die Felder + abgeleitetes handle erweitert (Feld-Whitelist). - setMyHandle: Discriminator stabil bei Erst-Vergabe, Kollisionspruefung inkl. DB-unique-violation-Fallback (PG 23505). - updateMyCommunityProfile: bio + Sichtbarkeit, strikt userId-gescoped. Verifiziert: Typecheck gruen (db/api/admin), 62 API-Tests gruen, drizzle-kit check ok. Datenmodell-Architekt abgenommen (Index-Auflage erfuellt). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6 lines
No EOL
517 B
SQL
6 lines
No EOL
517 B
SQL
ALTER TABLE "user" ADD COLUMN "username" text;--> statement-breakpoint
|
|
ALTER TABLE "user" ADD COLUMN "discriminator" text;--> statement-breakpoint
|
|
ALTER TABLE "user" ADD COLUMN "bio" text;--> statement-breakpoint
|
|
ALTER TABLE "user" ADD COLUMN "profileVisible" boolean DEFAULT false NOT NULL;--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "user_username_discriminator_unique" ON "user" USING btree ("username","discriminator");--> statement-breakpoint
|
|
CREATE INDEX "user_username_idx" ON "user" USING btree ("username"); |