Backend: - MagicPairingCode + MagicSession Prisma models - /api/magic/pair/create (6-digit code, 10min TTL, single-use) - /api/magic/pair/redeem (no auth, returns mgc_* token) - /api/magic/info (public DMG metadata) - requireUser() accepts mgc_* tokens Mac-App (RebreakMagic): - LoginView: 6-digit code input (OTP-style), real AppIcon, no signup - AuthService: signInWithPairingCode() replaces email/pw flow Native-App: - MagicSheet (TrueSheet) in Settings: download + code generator + linked Macs - AddMacSheet: subtle banner pointing to /settings - de/en locales
37 lines
1.4 KiB
SQL
37 lines
1.4 KiB
SQL
-- RebreakMagic Pairing-Code + Session-Tabellen
|
|
-- Native-App generiert 6-stelligen Code, Mac-App tauscht gegen mgc_*-Session-Token.
|
|
|
|
CREATE TABLE IF NOT EXISTS "rebreak"."magic_pairing_codes" (
|
|
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
"user_id" UUID NOT NULL,
|
|
"code" TEXT NOT NULL,
|
|
"expires_at" TIMESTAMP(3) NOT NULL,
|
|
"redeemed_at" TIMESTAMP(3),
|
|
"session_id" UUID,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "magic_pairing_codes_code_key"
|
|
ON "rebreak"."magic_pairing_codes" ("code");
|
|
CREATE INDEX IF NOT EXISTS "magic_pairing_codes_user_id_idx"
|
|
ON "rebreak"."magic_pairing_codes" ("user_id");
|
|
CREATE INDEX IF NOT EXISTS "magic_pairing_codes_expires_at_idx"
|
|
ON "rebreak"."magic_pairing_codes" ("expires_at");
|
|
|
|
CREATE TABLE IF NOT EXISTS "rebreak"."magic_sessions" (
|
|
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
"user_id" UUID NOT NULL,
|
|
"token" TEXT NOT NULL,
|
|
"label" TEXT,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"last_used_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"revoked_at" TIMESTAMP(3)
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "magic_sessions_token_key"
|
|
ON "rebreak"."magic_sessions" ("token");
|
|
CREATE INDEX IF NOT EXISTS "magic_sessions_user_id_idx"
|
|
ON "rebreak"."magic_sessions" ("user_id");
|
|
CREATE INDEX IF NOT EXISTS "magic_sessions_token_idx"
|
|
ON "rebreak"."magic_sessions" ("token");
|