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 } ]