5867a95d64
Ny 'swap'-vy i rekommendationsmotorn med lag tackningsvikt (30->6) sa betyg/smak/ratt maltidstyp styr i stallet for 'har hemma'. Byt rätt- skarmen anropar view=swap, kringgar vardags-tidsgransen och hojer limit till 20. Loser: bara ~5 val vid byte.
28 lines
1.5 KiB
TypeScript
28 lines
1.5 KiB
TypeScript
import { z } from "zod";
|
||
import { MEAL_TYPES, RECIPE_TAGS } from "@app/shared-types";
|
||
|
||
/**
|
||
* "Vad ska vi äta?" (spec §18) + "Jag är sugen på" (spec §19).
|
||
* Alla parametrar är valfria – motorn använder hushållets kontext som standard.
|
||
*/
|
||
export const whatToEatQuerySchema = z.object({
|
||
mealType: z.enum(MEAL_TYPES).default("dinner"),
|
||
/** Filtrera kandidater på en recept-tagg (t.ex. "baking" för Baka-fliken)
|
||
* i stället för måltidstyp. mealType används fortfarande för poängsättning. */
|
||
tag: z.enum(RECIPE_TAGS).optional(),
|
||
persons: z.coerce.number().int().min(1).max(20).optional(),
|
||
maxMinutes: z.coerce.number().int().min(5).max(600).optional(),
|
||
maxCostMinorPerPortion: z.coerce.number().int().min(0).max(100_000).optional(),
|
||
/** Fritext eller röst-transkription: "krämigt", "asiatiskt", "under 500 kcal" … */
|
||
craving: z.string().max(300).optional(),
|
||
/** Titel-/beskrivningssök: filtrerar kandidaterna på namn (t.ex. "pannkaka"). */
|
||
search: z.string().max(120).optional(),
|
||
/** Filtrera på en högtid/säsong (recept-holidayTag-slug, t.ex. "jul"). */
|
||
holiday: z.string().max(60).optional(),
|
||
includeLeftovers: z.coerce.boolean().default(true),
|
||
limit: z.coerce.number().int().min(1).max(20).default(5),
|
||
/** Personaliseringsvy: smak, hälsa eller lager. Kräver personalization-samtycke. */
|
||
view: z.enum(["default", "taste", "health", "pantry", "swap"]).default("default"),
|
||
});
|
||
export type WhatToEatQuery = z.infer<typeof whatToEatQuerySchema>;
|