Preferences (PRD §5.1) - @ketopath/shared: zod schemas + EXCLUSION_GROUPS, CUISINE_TAGS, COOKING_TIMES, FASTING_PROTOCOL_VALUES - apps/api: GET/PATCH /me/preferences (exclusions, cuisinePreferences, cookingTime, fastingProtocol) - apps/web: PreferencesForm chip-based + PreferencesSection wired into /profile so existing users can edit - Plan generation now aggregates Ingredient.exclusionGroups → Recipe exclusionTags so matchMeals filters out excluded recipes Onboarding (PRD §3) - /onboarding multi-step (profile → preferences → done) with smart-jump: starts at the first incomplete step - ProfileForm gains optional onSaved/saveLabel for reuse outside /profile - Redirect chain updated: /welcome accept → /onboarding (was /profile); /plan, /tracking, /shopping redirect missing profiles to /onboarding - /profile remains the editing surface for returning users i18n - New Onboarding + Preferences namespaces (it) Smoke tested end-to-end: selected fish exclusion, regenerated the plan, verified Salmone/Branzino/Tonno are filtered out and unaffected recipes (Frittata, Pollo, Mandorle, Polpette) remain. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
21 lines
521 B
TypeScript
21 lines
521 B
TypeScript
'use server';
|
|
|
|
import { prisma } from '@ketopath/db';
|
|
import { revalidatePath } from 'next/cache';
|
|
import { redirect } from 'next/navigation';
|
|
|
|
import { getServerSession } from '@/lib/auth';
|
|
|
|
export async function acceptDisclaimer(): Promise<void> {
|
|
const session = await getServerSession();
|
|
if (!session?.user) redirect('/sign-in');
|
|
|
|
await prisma.user.update({
|
|
where: { id: session.user.id },
|
|
data: { disclaimerAcceptedAt: new Date() },
|
|
});
|
|
|
|
revalidatePath('/', 'layout');
|
|
redirect('/onboarding');
|
|
}
|