diff --git a/apps/api/src/lib/memoryImpact.ts b/apps/api/src/lib/memoryImpact.ts index bf441b3..d06a0f1 100644 --- a/apps/api/src/lib/memoryImpact.ts +++ b/apps/api/src/lib/memoryImpact.ts @@ -132,15 +132,30 @@ export async function computeMemoryImpact(options: MemoryImpactOptions): Promise .where(eq(schema.householdMembers.householdId, householdId)) : []; const memberIds = members.length ? members.map((m) => m.userId) : [userId]; - const allPrefs = await db + + // Läs bara den anropande användarens fulla preferensrad; personliga data från + // andra hushållsmedlemmar läcker aldrig in i impact-beräkningen. + const myPrefs = await db .select() .from(schema.userPreferences) + .where(eq(schema.userPreferences.userId, userId)) + .limit(1) + .then((rows) => rows[0]); + + // För säkerhetsfiltrering behöver vi endast de begränsande fälten från alla + // medlemmar — inte deras personliga preferenser. + const householdRestrictionRows = await db + .select({ + allergens: schema.userPreferences.allergens, + avoidIngredientIds: schema.userPreferences.avoidIngredientIds, + spiceLevelMax: schema.userPreferences.spiceLevelMax, + }) + .from(schema.userPreferences) .where(inArray(schema.userPreferences.userId, memberIds)); - const combinedAllergens = [...new Set(allPrefs.flatMap((p) => p.allergens))]; - const combinedAvoid = [...new Set(allPrefs.flatMap((p) => p.avoidIngredientIds))]; - const strictestSpice = Math.min(...allPrefs.map((p) => p.spiceLevelMax), 5); - const myPrefs = allPrefs.find((p) => p.userId === userId); + const combinedAllergens = [...new Set(householdRestrictionRows.flatMap((p) => p.allergens))]; + const combinedAvoid = [...new Set(householdRestrictionRows.flatMap((p) => p.avoidIngredientIds))]; + const strictestSpice = Math.min(...householdRestrictionRows.map((p) => p.spiceLevelMax), 5); // --- 3. Kandidater --- const candidates = await db