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.
This commit is contained in:
@@ -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
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user