Enhance FalukantService error handling for debtors prison records: Implement try-catch logic to manage potential database errors when retrieving debtor records. Update nobility title requirements to include new house position values for various titles, ensuring consistency across the application. Adjust initialization script for title requirements to reflect these changes.

This commit is contained in:
Torsten Schulz (local)
2026-03-23 12:05:26 +01:00
parent 9b88a98a20
commit 42e894d4e4
3 changed files with 58 additions and 30 deletions

View File

@@ -5205,10 +5205,28 @@ class FalukantService extends BaseService {
return this.serializeDebtorsPrisonRecord(null); return this.serializeDebtorsPrisonRecord(null);
} }
const records = await DebtorsPrism.findAll({ let records = [];
where: { characterId: character.id }, try {
order: [['createdAt', 'DESC']] records = await DebtorsPrism.findAll({
}); where: { characterId: character.id },
order: [['createdAt', 'DESC']]
});
} catch (error) {
const message = String(error?.original?.message || error?.message || '');
const missingLegacyDebtColumn =
message.includes('column') &&
message.includes('status') &&
message.includes('debtors_prism');
if (!missingLegacyDebtColumn) {
throw error;
}
// Production can temporarily lag behind the expanded debtors_prism schema.
// In that case we degrade to "no active debtors prison state" instead of
// breaking unrelated Falukant endpoints such as family or gifts.
records = [];
}
const activeRecord = records.find((record) => record.status !== 'released' && !record.releasedAt) const activeRecord = records.find((record) => record.status !== 'released' && !record.releasedAt)
|| records[0] || records[0]

View File

@@ -29,77 +29,87 @@ JOIN (
VALUES VALUES
('civil', 'money', 5000::numeric), ('civil', 'money', 5000::numeric),
('civil', 'cost', 500::numeric), ('civil', 'cost', 500::numeric),
('civil', 'house_position', 2::numeric),
('sir', 'branches', 2::numeric), ('sir', 'branches', 2::numeric),
('sir', 'cost', 1000::numeric), ('sir', 'cost', 1000::numeric),
('sir', 'house_position', 3::numeric),
('townlord', 'cost', 3000::numeric), ('townlord', 'cost', 3000::numeric),
('townlord', 'money', 12000::numeric), ('townlord', 'money', 12000::numeric),
('townlord', 'reputation', 18::numeric), ('townlord', 'reputation', 18::numeric),
('townlord', 'house_position', 4::numeric),
('by', 'cost', 5000::numeric), ('by', 'cost', 5000::numeric),
('by', 'money', 18000::numeric), ('by', 'money', 18000::numeric),
('by', 'house_position', 1::numeric), ('by', 'house_position', 4::numeric),
('landlord', 'cost', 7500::numeric), ('landlord', 'cost', 7500::numeric),
('landlord', 'money', 26000::numeric), ('landlord', 'money', 26000::numeric),
('landlord', 'reputation', 24::numeric), ('landlord', 'reputation', 24::numeric),
('landlord', 'house_position', 4::numeric),
('landlord', 'house_condition', 60::numeric), ('landlord', 'house_condition', 60::numeric),
('knight', 'cost', 11000::numeric), ('knight', 'cost', 11000::numeric),
('knight', 'money', 38000::numeric), ('knight', 'money', 38000::numeric),
('knight', 'office_rank_any', 1::numeric), ('knight', 'office_rank_any', 1::numeric),
('knight', 'house_position', 5::numeric),
('baron', 'branches', 4::numeric), ('baron', 'branches', 4::numeric),
('baron', 'cost', 16000::numeric), ('baron', 'cost', 16000::numeric),
('baron', 'money', 55000::numeric), ('baron', 'money', 55000::numeric),
('baron', 'house_position', 2::numeric), ('baron', 'house_position', 5::numeric),
('count', 'cost', 23000::numeric), ('count', 'cost', 23000::numeric),
('count', 'money', 80000::numeric), ('count', 'money', 80000::numeric),
('count', 'reputation', 32::numeric), ('count', 'reputation', 32::numeric),
('count', 'house_position', 5::numeric),
('count', 'house_condition', 68::numeric), ('count', 'house_condition', 68::numeric),
('palsgrave', 'cost', 32000::numeric), ('palsgrave', 'cost', 32000::numeric),
('palsgrave', 'money', 115000::numeric), ('palsgrave', 'money', 115000::numeric),
('palsgrave', 'office_rank_any', 2::numeric), ('palsgrave', 'office_rank_any', 2::numeric),
('palsgrave', 'house_position', 3::numeric), ('palsgrave', 'house_position', 6::numeric),
('margrave', 'cost', 45000::numeric), ('margrave', 'cost', 45000::numeric),
('margrave', 'money', 165000::numeric), ('margrave', 'money', 165000::numeric),
('margrave', 'reputation', 40::numeric), ('margrave', 'reputation', 40::numeric),
('margrave', 'house_position', 6::numeric),
('margrave', 'house_condition', 72::numeric), ('margrave', 'house_condition', 72::numeric),
('margrave', 'lover_count_min', 1::numeric), ('margrave', 'lover_count_min', 1::numeric),
('landgrave', 'cost', 62000::numeric), ('landgrave', 'cost', 62000::numeric),
('landgrave', 'money', 230000::numeric), ('landgrave', 'money', 230000::numeric),
('landgrave', 'office_rank_any', 3::numeric), ('landgrave', 'office_rank_any', 3::numeric),
('landgrave', 'house_position', 4::numeric), ('landgrave', 'house_position', 6::numeric),
('ruler', 'cost', 85000::numeric), ('ruler', 'cost', 85000::numeric),
('ruler', 'money', 320000::numeric), ('ruler', 'money', 320000::numeric),
('ruler', 'reputation', 48::numeric), ('ruler', 'reputation', 48::numeric),
('ruler', 'house_position', 7::numeric),
('ruler', 'house_condition', 76::numeric), ('ruler', 'house_condition', 76::numeric),
('elector', 'cost', 115000::numeric), ('elector', 'cost', 115000::numeric),
('elector', 'money', 440000::numeric), ('elector', 'money', 440000::numeric),
('elector', 'office_rank_political', 4::numeric), ('elector', 'office_rank_political', 4::numeric),
('elector', 'house_position', 5::numeric), ('elector', 'house_position', 7::numeric),
('elector', 'lover_count_max', 3::numeric), ('elector', 'lover_count_max', 3::numeric),
('imperial-prince', 'cost', 155000::numeric), ('imperial-prince', 'cost', 155000::numeric),
('imperial-prince', 'money', 600000::numeric), ('imperial-prince', 'money', 600000::numeric),
('imperial-prince', 'reputation', 56::numeric), ('imperial-prince', 'reputation', 56::numeric),
('imperial-prince', 'house_position', 7::numeric),
('imperial-prince', 'house_condition', 80::numeric), ('imperial-prince', 'house_condition', 80::numeric),
('duke', 'cost', 205000::numeric), ('duke', 'cost', 205000::numeric),
('duke', 'money', 820000::numeric), ('duke', 'money', 820000::numeric),
('duke', 'office_rank_any', 5::numeric), ('duke', 'office_rank_any', 5::numeric),
('duke', 'house_position', 6::numeric), ('duke', 'house_position', 8::numeric),
('grand-duke', 'cost', 270000::numeric), ('grand-duke', 'cost', 270000::numeric),
('grand-duke', 'money', 1120000::numeric), ('grand-duke', 'money', 1120000::numeric),
('grand-duke', 'reputation', 64::numeric), ('grand-duke', 'reputation', 64::numeric),
('grand-duke', 'house_position', 8::numeric),
('grand-duke', 'house_condition', 84::numeric), ('grand-duke', 'house_condition', 84::numeric),
('grand-duke', 'lover_count_min', 1::numeric), ('grand-duke', 'lover_count_min', 1::numeric),
('grand-duke', 'lover_count_max', 3::numeric), ('grand-duke', 'lover_count_max', 3::numeric),
@@ -107,12 +117,12 @@ JOIN (
('prince-regent', 'cost', 360000::numeric), ('prince-regent', 'cost', 360000::numeric),
('prince-regent', 'money', 1520000::numeric), ('prince-regent', 'money', 1520000::numeric),
('prince-regent', 'office_rank_any', 6::numeric), ('prince-regent', 'office_rank_any', 6::numeric),
('prince-regent', 'house_position', 7::numeric), ('prince-regent', 'house_position', 9::numeric),
('king', 'cost', 500000::numeric), ('king', 'cost', 500000::numeric),
('king', 'money', 2100000::numeric), ('king', 'money', 2100000::numeric),
('king', 'reputation', 72::numeric), ('king', 'reputation', 72::numeric),
('king', 'house_position', 8::numeric), ('king', 'house_position', 9::numeric),
('king', 'house_condition', 88::numeric), ('king', 'house_condition', 88::numeric),
('king', 'lover_count_min', 1::numeric), ('king', 'lover_count_min', 1::numeric),
('king', 'lover_count_max', 4::numeric) ('king', 'lover_count_max', 4::numeric)

View File

@@ -297,24 +297,24 @@ async function initializeFalukantProducts() {
async function initializeFalukantTitleRequirements() { async function initializeFalukantTitleRequirements() {
const titleRequirements = [ const titleRequirements = [
{ labelTr: "civil", requirements: [{ type: "money", value: 5000 }, { type: "cost", value: 500 }] }, { labelTr: "civil", requirements: [{ type: "money", value: 5000 }, { type: "cost", value: 500 }, { type: "house_position", value: 2 }] },
{ labelTr: "sir", requirements: [{ type: "branches", value: 2 }, { type: "cost", value: 1000 }] }, { labelTr: "sir", requirements: [{ type: "branches", value: 2 }, { type: "cost", value: 1000 }, { type: "house_position", value: 3 }] },
{ labelTr: "townlord", requirements: [{ type: "cost", value: 3000 }, { type: "money", value: 12000 }, { type: "reputation", value: 18 }] }, { labelTr: "townlord", requirements: [{ type: "cost", value: 3000 }, { type: "money", value: 12000 }, { type: "reputation", value: 18 }, { type: "house_position", value: 4 }] },
{ labelTr: "by", requirements: [{ type: "cost", value: 5000 }, { type: "money", value: 18000 }, { type: "house_position", value: 1 }] }, { labelTr: "by", requirements: [{ type: "cost", value: 5000 }, { type: "money", value: 18000 }, { type: "house_position", value: 4 }] },
{ labelTr: "landlord", requirements: [{ type: "cost", value: 7500 }, { type: "money", value: 26000 }, { type: "reputation", value: 24 }, { type: "house_condition", value: 60 }] }, { labelTr: "landlord", requirements: [{ type: "cost", value: 7500 }, { type: "money", value: 26000 }, { type: "reputation", value: 24 }, { type: "house_position", value: 4 }, { type: "house_condition", value: 60 }] },
{ labelTr: "knight", requirements: [{ type: "cost", value: 11000 }, { type: "money", value: 38000 }, { type: "office_rank_any", value: 1 }] }, { labelTr: "knight", requirements: [{ type: "cost", value: 11000 }, { type: "money", value: 38000 }, { type: "office_rank_any", value: 1 }, { type: "house_position", value: 5 }] },
{ labelTr: "baron", requirements: [{ type: "branches", value: 4 }, { type: "cost", value: 16000 }, { type: "money", value: 55000 }, { type: "house_position", value: 2 }] }, { labelTr: "baron", requirements: [{ type: "branches", value: 4 }, { type: "cost", value: 16000 }, { type: "money", value: 55000 }, { type: "house_position", value: 5 }] },
{ labelTr: "count", requirements: [{ type: "cost", value: 23000 }, { type: "money", value: 80000 }, { type: "reputation", value: 32 }, { type: "house_condition", value: 68 }] }, { labelTr: "count", requirements: [{ type: "cost", value: 23000 }, { type: "money", value: 80000 }, { type: "reputation", value: 32 }, { type: "house_position", value: 5 }, { type: "house_condition", value: 68 }] },
{ labelTr: "palsgrave", requirements: [{ type: "cost", value: 32000 }, { type: "money", value: 115000 }, { type: "office_rank_any", value: 2 }, { type: "house_position", value: 3 }] }, { labelTr: "palsgrave", requirements: [{ type: "cost", value: 32000 }, { type: "money", value: 115000 }, { type: "office_rank_any", value: 2 }, { type: "house_position", value: 6 }] },
{ labelTr: "margrave", requirements: [{ type: "cost", value: 45000 }, { type: "money", value: 165000 }, { type: "reputation", value: 40 }, { type: "house_condition", value: 72 }, { type: "lover_count_min", value: 1 }] }, { labelTr: "margrave", requirements: [{ type: "cost", value: 45000 }, { type: "money", value: 165000 }, { type: "reputation", value: 40 }, { type: "house_position", value: 6 }, { type: "house_condition", value: 72 }, { type: "lover_count_min", value: 1 }] },
{ labelTr: "landgrave", requirements: [{ type: "cost", value: 62000 }, { type: "money", value: 230000 }, { type: "office_rank_any", value: 3 }, { type: "house_position", value: 4 }] }, { labelTr: "landgrave", requirements: [{ type: "cost", value: 62000 }, { type: "money", value: 230000 }, { type: "office_rank_any", value: 3 }, { type: "house_position", value: 6 }] },
{ labelTr: "ruler", requirements: [{ type: "cost", value: 85000 }, { type: "money", value: 320000 }, { type: "reputation", value: 48 }, { type: "house_condition", value: 76 }] }, { labelTr: "ruler", requirements: [{ type: "cost", value: 85000 }, { type: "money", value: 320000 }, { type: "reputation", value: 48 }, { type: "house_position", value: 7 }, { type: "house_condition", value: 76 }] },
{ labelTr: "elector", requirements: [{ type: "cost", value: 115000 }, { type: "money", value: 440000 }, { type: "office_rank_political", value: 4 }, { type: "house_position", value: 5 }, { type: "lover_count_max", value: 3 }] }, { labelTr: "elector", requirements: [{ type: "cost", value: 115000 }, { type: "money", value: 440000 }, { type: "office_rank_political", value: 4 }, { type: "house_position", value: 7 }, { type: "lover_count_max", value: 3 }] },
{ labelTr: "imperial-prince", requirements: [{ type: "cost", value: 155000 }, { type: "money", value: 600000 }, { type: "reputation", value: 56 }, { type: "house_condition", value: 80 }] }, { labelTr: "imperial-prince", requirements: [{ type: "cost", value: 155000 }, { type: "money", value: 600000 }, { type: "reputation", value: 56 }, { type: "house_position", value: 7 }, { type: "house_condition", value: 80 }] },
{ labelTr: "duke", requirements: [{ type: "cost", value: 205000 }, { type: "money", value: 820000 }, { type: "office_rank_any", value: 5 }, { type: "house_position", value: 6 }] }, { labelTr: "duke", requirements: [{ type: "cost", value: 205000 }, { type: "money", value: 820000 }, { type: "office_rank_any", value: 5 }, { type: "house_position", value: 8 }] },
{ labelTr: "grand-duke",requirements: [{ type: "cost", value: 270000 }, { type: "money", value: 1120000 }, { type: "reputation", value: 64 }, { type: "house_condition", value: 84 }, { type: "lover_count_min", value: 1 }, { type: "lover_count_max", value: 3 }] }, { labelTr: "grand-duke",requirements: [{ type: "cost", value: 270000 }, { type: "money", value: 1120000 }, { type: "reputation", value: 64 }, { type: "house_position", value: 8 }, { type: "house_condition", value: 84 }, { type: "lover_count_min", value: 1 }, { type: "lover_count_max", value: 3 }] },
{ labelTr: "prince-regent", requirements: [{ type: "cost", value: 360000 }, { type: "money", value: 1520000 }, { type: "office_rank_any", value: 6 }, { type: "house_position", value: 7 }] }, { labelTr: "prince-regent", requirements: [{ type: "cost", value: 360000 }, { type: "money", value: 1520000 }, { type: "office_rank_any", value: 6 }, { type: "house_position", value: 9 }] },
{ labelTr: "king", requirements: [{ type: "cost", value: 500000 }, { type: "money", value: 2100000 }, { type: "reputation", value: 72 }, { type: "house_position", value: 8 }, { type: "house_condition", value: 88 }, { type: "lover_count_min", value: 1 }, { type: "lover_count_max", value: 4 }] }, { labelTr: "king", requirements: [{ type: "cost", value: 500000 }, { type: "money", value: 2100000 }, { type: "reputation", value: 72 }, { type: "house_position", value: 9 }, { type: "house_condition", value: 88 }, { type: "lover_count_min", value: 1 }, { type: "lover_count_max", value: 4 }] },
]; ];
const titles = await TitleOfNobility.findAll(); const titles = await TitleOfNobility.findAll();