From afc36161edd01e781e0f9b74c3c5d9cd92a75d32 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 28 Jan 2026 16:45:40 +0100 Subject: [PATCH] Add region relationship to ChurchOffice model: Establish associations between ChurchOffice and RegionData, allowing for better organization of church offices by region. Enhance logging in getChurchOverview method for improved debugging and error handling. --- backend/models/associations.js | 10 +++ backend/services/falukantService.js | 105 ++++++++++++++++------------ 2 files changed, 70 insertions(+), 45 deletions(-) diff --git a/backend/models/associations.js b/backend/models/associations.js index 4a240cf..d445af5 100644 --- a/backend/models/associations.js +++ b/backend/models/associations.js @@ -913,6 +913,16 @@ export default function setupAssociations() { as: 'supervisor' }); + // Region relationship + ChurchOffice.belongsTo(RegionData, { + foreignKey: 'regionId', + as: 'region' + }); + RegionData.hasMany(ChurchOffice, { + foreignKey: 'regionId', + as: 'churchOffices' + }); + // Applications for church office ChurchApplication.belongsTo(ChurchOfficeType, { foreignKey: 'officeTypeId', diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 5bb53e5..989fd09 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -4825,20 +4825,23 @@ class FalukantService extends BaseService { } async getChurchOverview(hashedUserId) { - const user = await getFalukantUserOrFail(hashedUserId); - const character = await FalukantCharacter.findOne({ - where: { userId: user.id }, - attributes: ['id', 'regionId'] - }); - if (!character) { - return []; - } + try { + const user = await getFalukantUserOrFail(hashedUserId); + const character = await FalukantCharacter.findOne({ + where: { userId: user.id }, + attributes: ['id', 'regionId'] + }); + if (!character) { + console.log('[getChurchOverview] No character found for user', user.id); + return []; + } - // Alle relevanten Regionen (Region + Eltern) laden - const relevantRegionIds = await this.getRegionAndParentIds(character.regionId); + // Alle relevanten Regionen (Region + Eltern) laden + const relevantRegionIds = await this.getRegionAndParentIds(character.regionId); + console.log('[getChurchOverview] Relevant region IDs:', relevantRegionIds); - // Aktuell besetzte Kirchenämter in diesen Regionen laden - const offices = await ChurchOffice.findAll({ + // Aktuell besetzte Kirchenämter in diesen Regionen laden + const offices = await ChurchOffice.findAll({ where: { regionId: { [Op.in]: relevantRegionIds @@ -4859,21 +4862,25 @@ class FalukantService extends BaseService { model: FalukantCharacter, as: 'holder', attributes: ['id', 'gender'], + required: false, include: [ { model: FalukantPredefineFirstname, as: 'definedFirstName', - attributes: ['name'] + attributes: ['name'], + required: false }, { model: FalukantPredefineLastname, as: 'definedLastName', - attributes: ['name'] + attributes: ['name'], + required: false }, { model: TitleOfNobility, as: 'nobleTitle', - attributes: ['labelTr'] + attributes: ['labelTr'], + required: false } ] }, @@ -4881,19 +4888,21 @@ class FalukantService extends BaseService { model: FalukantCharacter, as: 'supervisor', attributes: ['id', 'gender'], + required: false, include: [ { model: FalukantPredefineFirstname, as: 'definedFirstName', - attributes: ['name'] + attributes: ['name'], + required: false }, { model: FalukantPredefineLastname, as: 'definedLastName', - attributes: ['name'] + attributes: ['name'], + required: false } - ], - required: false + ] } ], order: [ @@ -4902,32 +4911,38 @@ class FalukantService extends BaseService { ] }); - return offices.map(office => { - const o = office.get({ plain: true }); - return { - id: o.id, - officeType: { - name: o.type?.name - }, - region: { - name: o.region?.name - }, - character: o.holder - ? { - id: o.holder.id, - name: `${o.holder.definedFirstName?.name || ''} ${o.holder.definedLastName?.name || ''}`.trim(), - gender: o.holder.gender, - title: o.holder.nobleTitle?.labelTr - } - : null, - supervisor: o.supervisor - ? { - id: o.supervisor.id, - name: `${o.supervisor.definedFirstName?.name || ''} ${o.supervisor.definedLastName?.name || ''}`.trim() - } - : null - }; - }); + console.log('[getChurchOverview] Found', offices.length, 'offices'); + return offices.map(office => { + const o = office.get({ plain: true }); + return { + id: o.id, + officeType: { + name: o.type?.name + }, + region: { + name: o.region?.name + }, + character: o.holder + ? { + id: o.holder.id, + name: `${o.holder.definedFirstName?.name || ''} ${o.holder.definedLastName?.name || ''}`.trim(), + gender: o.holder.gender, + title: o.holder.nobleTitle?.labelTr + } + : null, + supervisor: o.supervisor + ? { + id: o.supervisor.id, + name: `${o.supervisor.definedFirstName?.name || ''} ${o.supervisor.definedLastName?.name || ''}`.trim() + } + : null + }; + }); + } catch (error) { + console.error('[getChurchOverview] Error:', error); + console.error('[getChurchOverview] Stack:', error.stack); + throw error; + } } async getAvailableChurchPositions(hashedUserId) {