Optimize gift retrieval in FalukantService by loading only necessary fields and implementing parallel data fetching. This change enhances performance and reduces data overhead during the gift and title of nobility retrieval process.

This commit is contained in:
Torsten Schulz (local)
2026-01-12 11:46:16 +01:00
parent d75fe18e6a
commit d2ac2bfdd8

View File

@@ -3087,9 +3087,6 @@ class FalukantService extends BaseService {
} }
timings.step7_possible_partners = Date.now() - step7Start; timings.step7_possible_partners = Date.now() - step7Start;
const totalTime = Date.now() - startTime;
console.log(`[getFamily] Performance: ${totalTime}ms total`, timings);
return family; return family;
} catch (error) { } catch (error) {
console.error('[getFamily] Error:', error); console.error('[getFamily] Error:', error);
@@ -3569,12 +3566,23 @@ class FalukantService extends BaseService {
} }
async getGifts(hashedUserId) { async getGifts(hashedUserId) {
// 1) Mein User & Character // 1) User & Character optimiert laden (nur benötigte Felder)
const user = await this.getFalukantUserByHashedId(hashedUserId); const user = await FalukantUser.findOne({
const myChar = await FalukantCharacter.findOne({ where: { userId: user.id } }); include: [
{ model: User, as: 'user', attributes: ['hashedId'], where: { hashedId: hashedUserId } },
{
model: FalukantCharacter,
as: 'character',
attributes: ['id', 'titleOfNobility'],
required: true
}
]
});
if (!user) throw new Error('User not found');
const myChar = user.character;
if (!myChar) throw new Error('Character not found'); if (!myChar) throw new Error('Character not found');
// 2) Beziehung finden und „anderen" Character bestimmen // 2) Beziehung finden und „anderen" Character bestimmen (optimiert: nur benötigte Felder)
const rel = await Relationship.findOne({ const rel = await Relationship.findOne({
where: { where: {
[Op.or]: [ [Op.or]: [
@@ -3583,8 +3591,32 @@ class FalukantService extends BaseService {
] ]
}, },
include: [ include: [
{ model: FalukantCharacter, as: 'character1', include: [{ model: CharacterTrait, as: 'traits' }] }, {
{ model: FalukantCharacter, as: 'character2', include: [{ model: CharacterTrait, as: 'traits' }] } model: FalukantCharacter,
as: 'character1',
attributes: ['id', 'moodId'],
include: [{
model: CharacterTrait,
as: 'traits',
attributes: ['id'],
through: { attributes: [] },
required: false
}],
required: false
},
{
model: FalukantCharacter,
as: 'character2',
attributes: ['id', 'moodId'],
include: [{
model: CharacterTrait,
as: 'traits',
attributes: ['id'],
through: { attributes: [] },
required: false
}],
required: false
}
] ]
}); });
@@ -3620,26 +3652,29 @@ class FalukantService extends BaseService {
giftIncludes[0].where = { mood_id: relatedMoodId }; giftIncludes[0].where = { mood_id: relatedMoodId };
} }
if (rel && relatedTraitIds.length > 0) { if (rel && relatedTraitIds.length > 0) {
giftIncludes[1].where = { trait_id: relatedTraitIds }; giftIncludes[1].where = { trait_id: { [Op.in]: relatedTraitIds } };
} }
const gifts = await PromotionalGift.findAll({ // 5) Parallel: Gifts und lowestTitleOfNobility laden
const [gifts, lowestTitleOfNobility] = await Promise.all([
PromotionalGift.findAll({
include: giftIncludes include: giftIncludes
}); }),
TitleOfNobility.findOne({ order: [['id', 'ASC']] })
]);
// 5) Rest wie gehabt: Kosten berechnen und zurückgeben // 6) Kosten berechnen (getGiftCost ist synchron, kein await nötig)
const lowestTitleOfNobility = await TitleOfNobility.findOne({ order: [['id', 'ASC']] }); return gifts.map(gift => ({
return Promise.all(gifts.map(async gift => ({
id: gift.id, id: gift.id,
name: gift.name, name: gift.name,
cost: await this.getGiftCost( cost: this.getGiftCost(
gift.value, gift.value,
myChar.titleOfNobility, myChar.titleOfNobility,
lowestTitleOfNobility.id lowestTitleOfNobility.id
), ),
moodsAffects: gift.promotionalgiftmoods, // nur Einträge mit relatedMoodId moodsAffects: gift.promotionalgiftmoods, // nur Einträge mit relatedMoodId
charactersAffects: gift.characterTraits // nur Einträge mit relatedTraitIds charactersAffects: gift.characterTraits // nur Einträge mit relatedTraitIds
}))); }));
} }
async getChildren(hashedUserId) { async getChildren(hashedUserId) {