rebreak-monorepo/backend/server/api/profile/me/onboarding-step.patch.ts
chahinebrini 38a8517259 feat(onboarding): interactive welcome + nickname spotlight tour
Stage 1+2 des post-signup Onboarding-Flows:
- Welcome-Screen: dark-slate Full-Screen mit Pulse-Hero, 3 Mission-Bullets,
  DSGVO-Box, CTA "Los geht's"
- Nickname-Spotlight via react-native-copilot ums TextInput in /profile/edit,
  auto-start wenn step='nickname', nach Save → step='block' + back to /(app)
- Backend: Profile.onboardingStep enum (welcome/nickname/block/done),
  Migration mit Backfill (existing → done), PATCH /api/profile/me/onboarding-step,
  /api/auth/me erweitert
- Frontend: CopilotProvider in root, Routing-Gate in (app)/_layout, useMe um
  onboardingStep ergänzt
- i18n (de/en/fr) für onboarding.welcome.* + onboarding.nickname_spotlight.*

Stage 3 (Block-Aktivierung-Spotlight) folgt in nächster Session — der bestehende
ProtectionOnboardingSheet auf Android wird daran angebunden.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 21:00:20 +02:00

28 lines
942 B
TypeScript

import { setOnboardingStep, isOnboardingStep } from "../../../db/profile";
/**
* PATCH /api/profile/me/onboarding-step
*
* Setzt den Onboarding-Stand des eingeloggten Users.
* Werte: "welcome" | "nickname" | "block" | "done"
*
* Body: { step: "nickname" | "block" | "done" }
*
* Das Frontend ruft das nach jedem abgeschlossenen Schritt auf:
* Welcome-Screen "Los geht's" → step="nickname"
* Nickname-Save → step="block"
* Block-Aktivierung done → step="done"
*/
export default defineEventHandler(async (event) => {
const user = await requireUser(event);
const body = await readBody(event);
const { step } = body as { step?: unknown };
if (!isOnboardingStep(step)) {
throw createError({ statusCode: 400, statusMessage: "invalid_step" });
}
const updated = await setOnboardingStep(user.id, step);
return { success: true, data: { onboardingStep: updated.onboardingStep } };
});