diff --git a/apps/api/src/routes/recommendations.ts b/apps/api/src/routes/recommendations.ts index 8393c41..dd7165d 100644 --- a/apps/api/src/routes/recommendations.ts +++ b/apps/api/src/routes/recommendations.ts @@ -399,15 +399,34 @@ export async function recommendationRoutes(app: FastifyInstance) { ? viewWeights(q.view) : depersonalize(viewWeights(q.view)); - // Om användaren sökte specifikt (t.ex. "kyckling") – visa matchande recept först. + // Högtids-sök: matchar sökningen ett event för marknaden (året runt) → expandera till dess foodTags + slug. + const holidayFoodTags: string[] = []; + const holidaySlugs: string[] = []; + if (q.craving) { + const qc = q.craving.toLowerCase(); + for (const e of events) { + if ( + qc.includes(e.slug) || + qc.includes(e.nameSv.toLowerCase()) || + (e.nameLocalized ? qc.includes(e.nameLocalized.toLowerCase()) : false) + ) { + holidayFoodTags.push(...e.foodTags); + holidaySlugs.push(e.slug); + } + } + } + + // Sökte användaren specifikt (råvara "kyckling" ELLER högtid "midsommar")? Visa matchande först. let pool = scoredCandidates; - if (craving && (craving.keywords.length > 0 || craving.cuisine)) { + if (craving && (craving.keywords.length > 0 || craving.cuisine || holidaySlugs.length > 0)) { const matches = scoredCandidates.filter((c) => { const title = c.titleSv.toLowerCase(); const tagSet = new Set(c.tags as unknown as string[]); return ( (!!craving.cuisine && c.cuisine === craving.cuisine) || - craving.keywords.some((k) => title.includes(k) || tagSet.has(k)) + craving.keywords.some((k) => title.includes(k) || tagSet.has(k)) || + holidaySlugs.some((s) => c.holidayTags.includes(s)) || + holidayFoodTags.some((ft) => title.includes(ft) || tagSet.has(ft)) ); }); if (matches.length > 0) pool = matches; // annars behåll alla (aldrig tomt)