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'
});
// 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',

View File

@@ -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) {