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.
This commit is contained in:
Torsten Schulz (local)
2026-01-12 13:48:37 +01:00
parent 7d59dbcf84
commit 9273066f61
2 changed files with 21 additions and 5 deletions

View File

@@ -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 || ''

View File

@@ -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;