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.

This commit is contained in:
Torsten Schulz (local)
2026-01-28 16:45:40 +01:00
parent a8b76bc21a
commit afc36161ed
2 changed files with 70 additions and 45 deletions

View File

@@ -913,6 +913,16 @@ export default function setupAssociations() {
as: 'supervisor' as: 'supervisor'
}); });
// Region relationship
ChurchOffice.belongsTo(RegionData, {
foreignKey: 'regionId',
as: 'region'
});
RegionData.hasMany(ChurchOffice, {
foreignKey: 'regionId',
as: 'churchOffices'
});
// Applications for church office // Applications for church office
ChurchApplication.belongsTo(ChurchOfficeType, { ChurchApplication.belongsTo(ChurchOfficeType, {
foreignKey: 'officeTypeId', foreignKey: 'officeTypeId',

View File

@@ -4825,20 +4825,23 @@ class FalukantService extends BaseService {
} }
async getChurchOverview(hashedUserId) { async getChurchOverview(hashedUserId) {
const user = await getFalukantUserOrFail(hashedUserId); try {
const character = await FalukantCharacter.findOne({ const user = await getFalukantUserOrFail(hashedUserId);
where: { userId: user.id }, const character = await FalukantCharacter.findOne({
attributes: ['id', 'regionId'] where: { userId: user.id },
}); attributes: ['id', 'regionId']
if (!character) { });
return []; if (!character) {
} console.log('[getChurchOverview] No character found for user', user.id);
return [];
}
// Alle relevanten Regionen (Region + Eltern) laden // Alle relevanten Regionen (Region + Eltern) laden
const relevantRegionIds = await this.getRegionAndParentIds(character.regionId); const relevantRegionIds = await this.getRegionAndParentIds(character.regionId);
console.log('[getChurchOverview] Relevant region IDs:', relevantRegionIds);
// Aktuell besetzte Kirchenämter in diesen Regionen laden // Aktuell besetzte Kirchenämter in diesen Regionen laden
const offices = await ChurchOffice.findAll({ const offices = await ChurchOffice.findAll({
where: { where: {
regionId: { regionId: {
[Op.in]: relevantRegionIds [Op.in]: relevantRegionIds
@@ -4859,21 +4862,25 @@ class FalukantService extends BaseService {
model: FalukantCharacter, model: FalukantCharacter,
as: 'holder', as: 'holder',
attributes: ['id', 'gender'], attributes: ['id', 'gender'],
required: false,
include: [ include: [
{ {
model: FalukantPredefineFirstname, model: FalukantPredefineFirstname,
as: 'definedFirstName', as: 'definedFirstName',
attributes: ['name'] attributes: ['name'],
required: false
}, },
{ {
model: FalukantPredefineLastname, model: FalukantPredefineLastname,
as: 'definedLastName', as: 'definedLastName',
attributes: ['name'] attributes: ['name'],
required: false
}, },
{ {
model: TitleOfNobility, model: TitleOfNobility,
as: 'nobleTitle', as: 'nobleTitle',
attributes: ['labelTr'] attributes: ['labelTr'],
required: false
} }
] ]
}, },
@@ -4881,19 +4888,21 @@ class FalukantService extends BaseService {
model: FalukantCharacter, model: FalukantCharacter,
as: 'supervisor', as: 'supervisor',
attributes: ['id', 'gender'], attributes: ['id', 'gender'],
required: false,
include: [ include: [
{ {
model: FalukantPredefineFirstname, model: FalukantPredefineFirstname,
as: 'definedFirstName', as: 'definedFirstName',
attributes: ['name'] attributes: ['name'],
required: false
}, },
{ {
model: FalukantPredefineLastname, model: FalukantPredefineLastname,
as: 'definedLastName', as: 'definedLastName',
attributes: ['name'] attributes: ['name'],
required: false
} }
], ]
required: false
} }
], ],
order: [ order: [
@@ -4902,32 +4911,38 @@ class FalukantService extends BaseService {
] ]
}); });
return offices.map(office => { console.log('[getChurchOverview] Found', offices.length, 'offices');
const o = office.get({ plain: true }); return offices.map(office => {
return { const o = office.get({ plain: true });
id: o.id, return {
officeType: { id: o.id,
name: o.type?.name officeType: {
}, name: o.type?.name
region: { },
name: o.region?.name region: {
}, name: o.region?.name
character: o.holder },
? { character: o.holder
id: o.holder.id, ? {
name: `${o.holder.definedFirstName?.name || ''} ${o.holder.definedLastName?.name || ''}`.trim(), id: o.holder.id,
gender: o.holder.gender, name: `${o.holder.definedFirstName?.name || ''} ${o.holder.definedLastName?.name || ''}`.trim(),
title: o.holder.nobleTitle?.labelTr gender: o.holder.gender,
} title: o.holder.nobleTitle?.labelTr
: null, }
supervisor: o.supervisor : null,
? { supervisor: o.supervisor
id: o.supervisor.id, ? {
name: `${o.supervisor.definedFirstName?.name || ''} ${o.supervisor.definedLastName?.name || ''}`.trim() id: o.supervisor.id,
} name: `${o.supervisor.definedFirstName?.name || ''} ${o.supervisor.definedLastName?.name || ''}`.trim()
: null }
}; : null
}); };
});
} catch (error) {
console.error('[getChurchOverview] Error:', error);
console.error('[getChurchOverview] Stack:', error.stack);
throw error;
}
} }
async getAvailableChurchPositions(hashedUserId) { async getAvailableChurchPositions(hashedUserId) {