From 8c0f07cc51983aa30ae8fbf9e6c64b67c2ca99ad Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 22 Jan 2026 10:15:45 +0100 Subject: [PATCH] Optimize falukantService and DirectorInfo component for improved performance and user experience - Refactored proposal handling in falukantService to load existing proposals before cleaning expired ones, reducing unnecessary database queries. - Enhanced fetchProposals method with explicit joins for better performance and added a limit to avoid excessive data retrieval. - Updated DirectorInfo component to reload data after hiring a director, ensuring the UI reflects the latest information. --- backend/services/falukantService.js | 41 ++++++++++++++++--- .../src/components/falukant/DirectorInfo.vue | 7 +++- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index b07fae1..08d0466 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -2412,11 +2412,20 @@ class FalukantService extends BaseService { throw new Error('Branch not found or does not belong to the user'); } const { falukantUserId, regionId } = branch; - await this.deleteExpiredProposals(); + + // OPTIMIERUNG: Erst Proposals laden, dann nur bei Bedarf bereinigen + // Dies vermeidet unnötige DELETE-Queries bei jedem Aufruf const existingProposals = await this.fetchProposals(falukantUserId, regionId); if (existingProposals.length > 0) { + // Nur bereinigen, wenn wir Proposals haben (im Hintergrund, nicht blockierend) + this.deleteExpiredProposals().catch(err => + console.error('[getDirectorProposals] Error cleaning expired proposals:', err) + ); return this.formatProposals(existingProposals); } + + // Wenn keine Proposals vorhanden sind, bereinigen wir vor der Generierung + await this.deleteExpiredProposals(); await this.generateProposals(falukantUserId, regionId); const newProposals = await this.fetchProposals(falukantUserId, regionId); return this.formatProposals(newProposals); @@ -2434,6 +2443,8 @@ class FalukantService extends BaseService { } async fetchProposals(falukantUserId, regionId) { + // OPTIMIERUNG: Query mit expliziten Joins und required: true für bessere Performance + // required: true sorgt für INNER JOIN statt LEFT JOIN, was schneller ist return DirectorProposal.findAll({ where: { employerUserId: falukantUserId }, include: [ @@ -2442,20 +2453,40 @@ class FalukantService extends BaseService { as: 'character', attributes: ['firstName', 'lastName', 'birthdate', 'titleOfNobility', 'gender'], where: { regionId }, + required: true, // INNER JOIN für bessere Performance include: [ - { model: FalukantPredefineFirstname, as: 'definedFirstName' }, - { model: FalukantPredefineLastname, as: 'definedLastName' }, - { model: TitleOfNobility, as: 'nobleTitle' }, + { + model: FalukantPredefineFirstname, + as: 'definedFirstName', + required: false // LEFT JOIN, da optional + }, + { + model: FalukantPredefineLastname, + as: 'definedLastName', + required: false // LEFT JOIN, da optional + }, + { + model: TitleOfNobility, + as: 'nobleTitle', + required: false // LEFT JOIN, da optional + }, { model: Knowledge, as: 'knowledges', + required: false, // LEFT JOIN, da optional include: [ - { model: ProductType, as: 'productType' }, + { + model: ProductType, + as: 'productType', + required: false // LEFT JOIN, da optional + }, ] }, ], }, ], + // OPTIMIERUNG: Limit setzen, um unnötige Daten zu vermeiden + limit: 10, }); } diff --git a/frontend/src/components/falukant/DirectorInfo.vue b/frontend/src/components/falukant/DirectorInfo.vue index 6144579..68c0d39 100644 --- a/frontend/src/components/falukant/DirectorInfo.vue +++ b/frontend/src/components/falukant/DirectorInfo.vue @@ -181,7 +181,7 @@ - +