From 9273066f61d981476dfae7d4060151abf0a4def5 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 12 Jan 2026 13:48:37 +0100 Subject: [PATCH] Refactor trait handling in FalukantService and FamilyView for improved data consistency - Updated trait loading in FalukantService to include trait types, enhancing the mapping of traits to characters. - Adjusted FamilyView to utilize the new trait structure, ensuring accurate retrieval of traits associated with characters. - Improved null checks for relationships to prevent potential errors during data access. --- backend/services/falukantService.js | 18 +++++++++++++++--- frontend/src/views/falukant/FamilyView.vue | 8 ++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 669756e..4806853 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -2973,7 +2973,7 @@ class FalukantService extends BaseService { const allFirstNameIds = [...new Set([...relationshipFirstNameIds, ...childFirstNameIds])]; // Batch-Load alle benötigten Daten parallel - const [firstNames, lastNames, titles, traits, moods] = await Promise.all([ + const [firstNames, lastNames, titles, traitRelations, moods] = await Promise.all([ allFirstNameIds.length > 0 ? FalukantPredefineFirstname.findAll({ where: { id: { [Op.in]: allFirstNameIds } }, attributes: ['id', 'name'] @@ -2996,17 +2996,28 @@ class FalukantService extends BaseService { }) : [] ]); + // Sammle alle eindeutigen Trait-IDs und lade die Trait-Types + const allTraitIds = [...new Set(traitRelations.map(t => t.traitId))]; + const traitTypes = allTraitIds.length > 0 ? await CharacterTrait.findAll({ + where: { id: { [Op.in]: allTraitIds } }, + attributes: ['id', 'tr'] + }) : []; + // Erstelle Maps für schnellen Zugriff const firstNameMap = new Map(firstNames.map(fn => [fn.id, fn.name])); const lastNameMap = new Map(lastNames.map(ln => [ln.id, ln.name])); const titleMap = new Map(titles.map(t => [t.id, t.labelTr])); const moodMap = new Map(moods.map(m => [m.id, m.tr])); + const traitTypeMap = new Map(traitTypes.map(t => [t.id, { id: t.id, tr: t.tr }])); const traitsMap = new Map(); - traits.forEach(t => { + traitRelations.forEach(t => { if (!traitsMap.has(t.characterId)) { traitsMap.set(t.characterId, []); } - traitsMap.get(t.characterId).push(t.traitId); + const traitObj = traitTypeMap.get(t.traitId); + if (traitObj) { + traitsMap.get(t.characterId).push(traitObj); + } }); timings.step3_batch_loading = Date.now() - step3Start; @@ -3025,6 +3036,7 @@ class FalukantService extends BaseService { firstName: firstNameMap.get(char2.firstName) || 'Unknown', nobleTitle: titleMap.get(char2.titleOfNobility) || '', mood: moodMap.get(char2.moodId) || null, + moodId: char2.moodId, traits: traitsMap.get(char2.id) || [] } : null, relationshipType: r.relationshipType?.tr || '' diff --git a/frontend/src/views/falukant/FamilyView.vue b/frontend/src/views/falukant/FamilyView.vue index 8692286..2ba237d 100644 --- a/frontend/src/views/falukant/FamilyView.vue +++ b/frontend/src/views/falukant/FamilyView.vue @@ -274,12 +274,16 @@ export default { getEffect(gift) { const relationship = this.relationships[0]; + if (!relationship || !relationship.character2) { + return 0; + } const partner = relationship.character2; - const currentMoodId = partner.mood?.id ?? partner.mood_id; + const currentMoodId = partner.moodId; const moodEntry = gift.moodsAffects.find(ma => ma.mood_id === currentMoodId); const moodValue = moodEntry ? moodEntry.suitability : 0; let highestCharacterValue = 0; - for (const trait of partner.characterTrait) { + // traits ist ein Array von Trait-Objekten mit id und tr + for (const trait of partner.traits || []) { const charEntry = gift.charactersAffects.find(ca => ca.trait_id === trait.id); if (charEntry && charEntry.suitability > highestCharacterValue) { highestCharacterValue = charEntry.suitability;