From 400d44289cdc247a714ebb3b3dbf21ca7afc6a2b Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 4 Feb 2026 15:05:19 +0100 Subject: [PATCH] Update primary key constraints in promotional gift models: Set giftId and traitId as primary keys in PromotionalGiftCharacterTrait and PromotionalGiftMood models to ensure data integrity. Enhance FalukantService to load character traits and user house data with separate queries, improving performance and preventing EagerLoadingError. --- .../promotional_gift_character_trait.js | 6 ++- .../predefine/promotional_gift_mood.js | 6 ++- backend/services/falukantService.js | 51 ++++++++++++------- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/backend/models/falukant/predefine/promotional_gift_character_trait.js b/backend/models/falukant/predefine/promotional_gift_character_trait.js index 04e996a..683580b 100644 --- a/backend/models/falukant/predefine/promotional_gift_character_trait.js +++ b/backend/models/falukant/predefine/promotional_gift_character_trait.js @@ -10,12 +10,14 @@ PromotionalGiftCharacterTrait.init( giftId: { type: DataTypes.INTEGER, field: 'gift_id', - allowNull: false + allowNull: false, + primaryKey: true }, traitId: { type: DataTypes.INTEGER, field: 'trait_id', - allowNull: false + allowNull: false, + primaryKey: true }, suitability: { type: DataTypes.INTEGER, diff --git a/backend/models/falukant/predefine/promotional_gift_mood.js b/backend/models/falukant/predefine/promotional_gift_mood.js index f7f291d..dc98720 100644 --- a/backend/models/falukant/predefine/promotional_gift_mood.js +++ b/backend/models/falukant/predefine/promotional_gift_mood.js @@ -10,12 +10,14 @@ PromotionalGiftMood.init( giftId: { type: DataTypes.INTEGER, field: 'gift_id', - allowNull: false + allowNull: false, + primaryKey: true }, moodId: { type: DataTypes.INTEGER, field: 'mood_id', - allowNull: false + allowNull: false, + primaryKey: true }, suitability: { type: DataTypes.INTEGER, diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 8b018c3..2908fc0 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -33,6 +33,7 @@ import PromotionalGiftCharacterTrait from '../models/falukant/predefine/promotio import PromotionalGiftMood from '../models/falukant/predefine/promotional_gift_mood.js'; import PromotionalGiftLog from '../models/falukant/log/promotional_gift.js'; import CharacterTrait from '../models/falukant/type/character_trait.js'; +import FalukantCharacterTrait from '../models/falukant/data/falukant_character_trait.js'; import Mood from '../models/falukant/type/mood.js'; import UserHouse from '../models/falukant/data/user_house.js'; import HouseType from '../models/falukant/type/house.js'; @@ -349,26 +350,40 @@ class FalukantService extends BaseService { include: [ { model: FalukantPredefineFirstname, as: 'definedFirstName', attributes: ['name'] }, { model: FalukantPredefineLastname, as: 'definedLastName', attributes: ['name'] }, - { model: TitleOfNobility, as: 'nobleTitle', attributes: ['labelTr', 'id'] }, - { model: CharacterTrait, as: 'traits', attributes: ['id', 'tr'] } + { model: TitleOfNobility, as: 'nobleTitle', attributes: ['labelTr', 'id'] } ], attributes: ['id', 'birthdate', 'gender', 'moodId', 'health'] }, - { - model: UserHouse, - as: 'userHouse', - attributes: ['roofCondition', 'wallCondition', 'floorCondition', 'windowCondition'], - include: [ - { - model: HouseType, - as: 'houseType', - attributes: ['labelTr', 'position'] - } - ] - }, ] }); if (!user) throw new Error('User not found'); + // Load character traits in a separate query to avoid EagerLoadingError + if (user.character?.id) { + const ctRows = await FalukantCharacterTrait.findAll({ + where: { characterId: user.character.id }, + attributes: ['traitId'] + }); + const traitIds = [...new Set(ctRows.map(r => r.traitId))]; + const traits = traitIds.length + ? await CharacterTrait.findAll({ where: { id: traitIds }, attributes: ['id', 'tr'] }) + : []; + user.character.setDataValue('traits', traits); + } + // Load UserHouse (and HouseType) in separate queries to avoid EagerLoadingError + if (user.id != null) { + const userHouse = await UserHouse.findOne({ + where: { userId: user.id }, + attributes: ['roofCondition', 'wallCondition', 'floorCondition', 'windowCondition', 'houseTypeId'] + }); + if (userHouse?.houseTypeId) { + const houseType = await HouseType.findOne({ + where: { id: userHouse.houseTypeId }, + attributes: ['labelTr', 'position'] + }); + if (houseType) userHouse.setDataValue('houseType', houseType); + } + if (userHouse) user.setDataValue('userHouse', userHouse); + } return user; } @@ -2939,15 +2954,15 @@ class FalukantService extends BaseService { { model: PromotionalGiftMood, as: 'promotionalgiftmoods', - attributes: ['mood_id', 'suitability'], - where: { mood_id: relatedMoodId }, + attributes: ['moodId', 'suitability'], + where: { moodId: relatedMoodId }, required: false // Gifts ohne Mood-Match bleiben erhalten, haben dann leeres Array }, { model: PromotionalGiftCharacterTrait, as: 'characterTraits', - attributes: ['trait_id', 'suitability'], - where: { trait_id: relatedTraitIds }, + attributes: ['traitId', 'suitability'], + where: { traitId: relatedTraitIds }, required: false // Gifts ohne Trait-Match bleiben erhalten } ]