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:
Torsten Schulz (local)
2026-02-04 15:05:19 +01:00
parent bbc3354f16
commit 400d44289c
3 changed files with 41 additions and 22 deletions

View File

@@ -10,12 +10,14 @@ PromotionalGiftCharacterTrait.init(
giftId: { giftId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
field: 'gift_id', field: 'gift_id',
allowNull: false allowNull: false,
primaryKey: true
}, },
traitId: { traitId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
field: 'trait_id', field: 'trait_id',
allowNull: false allowNull: false,
primaryKey: true
}, },
suitability: { suitability: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,

View File

@@ -10,12 +10,14 @@ PromotionalGiftMood.init(
giftId: { giftId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
field: 'gift_id', field: 'gift_id',
allowNull: false allowNull: false,
primaryKey: true
}, },
moodId: { moodId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
field: 'mood_id', field: 'mood_id',
allowNull: false allowNull: false,
primaryKey: true
}, },
suitability: { suitability: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,

View File

@@ -33,6 +33,7 @@ import PromotionalGiftCharacterTrait from '../models/falukant/predefine/promotio
import PromotionalGiftMood from '../models/falukant/predefine/promotional_gift_mood.js'; import PromotionalGiftMood from '../models/falukant/predefine/promotional_gift_mood.js';
import PromotionalGiftLog from '../models/falukant/log/promotional_gift.js'; import PromotionalGiftLog from '../models/falukant/log/promotional_gift.js';
import CharacterTrait from '../models/falukant/type/character_trait.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 Mood from '../models/falukant/type/mood.js';
import UserHouse from '../models/falukant/data/user_house.js'; import UserHouse from '../models/falukant/data/user_house.js';
import HouseType from '../models/falukant/type/house.js'; import HouseType from '../models/falukant/type/house.js';
@@ -349,26 +350,40 @@ class FalukantService extends BaseService {
include: [ include: [
{ model: FalukantPredefineFirstname, as: 'definedFirstName', attributes: ['name'] }, { model: FalukantPredefineFirstname, as: 'definedFirstName', attributes: ['name'] },
{ model: FalukantPredefineLastname, as: 'definedLastName', attributes: ['name'] }, { model: FalukantPredefineLastname, as: 'definedLastName', attributes: ['name'] },
{ model: TitleOfNobility, as: 'nobleTitle', attributes: ['labelTr', 'id'] }, { model: TitleOfNobility, as: 'nobleTitle', attributes: ['labelTr', 'id'] }
{ model: CharacterTrait, as: 'traits', attributes: ['id', 'tr'] }
], ],
attributes: ['id', 'birthdate', 'gender', 'moodId', 'health'] 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'); 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; return user;
} }
@@ -2939,15 +2954,15 @@ class FalukantService extends BaseService {
{ {
model: PromotionalGiftMood, model: PromotionalGiftMood,
as: 'promotionalgiftmoods', as: 'promotionalgiftmoods',
attributes: ['mood_id', 'suitability'], attributes: ['moodId', 'suitability'],
where: { mood_id: relatedMoodId }, where: { moodId: relatedMoodId },
required: false // Gifts ohne Mood-Match bleiben erhalten, haben dann leeres Array required: false // Gifts ohne Mood-Match bleiben erhalten, haben dann leeres Array
}, },
{ {
model: PromotionalGiftCharacterTrait, model: PromotionalGiftCharacterTrait,
as: 'characterTraits', as: 'characterTraits',
attributes: ['trait_id', 'suitability'], attributes: ['traitId', 'suitability'],
where: { trait_id: relatedTraitIds }, where: { traitId: relatedTraitIds },
required: false // Gifts ohne Trait-Match bleiben erhalten required: false // Gifts ohne Trait-Match bleiben erhalten
} }
] ]