From 42e894d4e4ec26e18faaf58452dcc8f9a0efaa07 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 23 Mar 2026 12:05:26 +0100 Subject: [PATCH] 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. --- backend/services/falukantService.js | 26 +++++++++++--- .../update_nobility_requirements_extended.sql | 26 +++++++++----- .../falukant/initializeFalukantPredefines.js | 36 +++++++++---------- 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 9a775d1..8b7535f 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -5205,10 +5205,28 @@ class FalukantService extends BaseService { return this.serializeDebtorsPrisonRecord(null); } - const records = await DebtorsPrism.findAll({ - where: { characterId: character.id }, - order: [['createdAt', 'DESC']] - }); + let records = []; + try { + 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) || records[0] diff --git a/backend/sql/update_nobility_requirements_extended.sql b/backend/sql/update_nobility_requirements_extended.sql index 0b29176..3b149ce 100644 --- a/backend/sql/update_nobility_requirements_extended.sql +++ b/backend/sql/update_nobility_requirements_extended.sql @@ -29,77 +29,87 @@ JOIN ( VALUES ('civil', 'money', 5000::numeric), ('civil', 'cost', 500::numeric), + ('civil', 'house_position', 2::numeric), ('sir', 'branches', 2::numeric), ('sir', 'cost', 1000::numeric), + ('sir', 'house_position', 3::numeric), ('townlord', 'cost', 3000::numeric), ('townlord', 'money', 12000::numeric), ('townlord', 'reputation', 18::numeric), + ('townlord', 'house_position', 4::numeric), ('by', 'cost', 5000::numeric), ('by', 'money', 18000::numeric), - ('by', 'house_position', 1::numeric), + ('by', 'house_position', 4::numeric), ('landlord', 'cost', 7500::numeric), ('landlord', 'money', 26000::numeric), ('landlord', 'reputation', 24::numeric), + ('landlord', 'house_position', 4::numeric), ('landlord', 'house_condition', 60::numeric), ('knight', 'cost', 11000::numeric), ('knight', 'money', 38000::numeric), ('knight', 'office_rank_any', 1::numeric), + ('knight', 'house_position', 5::numeric), ('baron', 'branches', 4::numeric), ('baron', 'cost', 16000::numeric), ('baron', 'money', 55000::numeric), - ('baron', 'house_position', 2::numeric), + ('baron', 'house_position', 5::numeric), ('count', 'cost', 23000::numeric), ('count', 'money', 80000::numeric), ('count', 'reputation', 32::numeric), + ('count', 'house_position', 5::numeric), ('count', 'house_condition', 68::numeric), ('palsgrave', 'cost', 32000::numeric), ('palsgrave', 'money', 115000::numeric), ('palsgrave', 'office_rank_any', 2::numeric), - ('palsgrave', 'house_position', 3::numeric), + ('palsgrave', 'house_position', 6::numeric), ('margrave', 'cost', 45000::numeric), ('margrave', 'money', 165000::numeric), ('margrave', 'reputation', 40::numeric), + ('margrave', 'house_position', 6::numeric), ('margrave', 'house_condition', 72::numeric), ('margrave', 'lover_count_min', 1::numeric), ('landgrave', 'cost', 62000::numeric), ('landgrave', 'money', 230000::numeric), ('landgrave', 'office_rank_any', 3::numeric), - ('landgrave', 'house_position', 4::numeric), + ('landgrave', 'house_position', 6::numeric), ('ruler', 'cost', 85000::numeric), ('ruler', 'money', 320000::numeric), ('ruler', 'reputation', 48::numeric), + ('ruler', 'house_position', 7::numeric), ('ruler', 'house_condition', 76::numeric), ('elector', 'cost', 115000::numeric), ('elector', 'money', 440000::numeric), ('elector', 'office_rank_political', 4::numeric), - ('elector', 'house_position', 5::numeric), + ('elector', 'house_position', 7::numeric), ('elector', 'lover_count_max', 3::numeric), ('imperial-prince', 'cost', 155000::numeric), ('imperial-prince', 'money', 600000::numeric), ('imperial-prince', 'reputation', 56::numeric), + ('imperial-prince', 'house_position', 7::numeric), ('imperial-prince', 'house_condition', 80::numeric), ('duke', 'cost', 205000::numeric), ('duke', 'money', 820000::numeric), ('duke', 'office_rank_any', 5::numeric), - ('duke', 'house_position', 6::numeric), + ('duke', 'house_position', 8::numeric), ('grand-duke', 'cost', 270000::numeric), ('grand-duke', 'money', 1120000::numeric), ('grand-duke', 'reputation', 64::numeric), + ('grand-duke', 'house_position', 8::numeric), ('grand-duke', 'house_condition', 84::numeric), ('grand-duke', 'lover_count_min', 1::numeric), ('grand-duke', 'lover_count_max', 3::numeric), @@ -107,12 +117,12 @@ JOIN ( ('prince-regent', 'cost', 360000::numeric), ('prince-regent', 'money', 1520000::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', 'money', 2100000::numeric), ('king', 'reputation', 72::numeric), - ('king', 'house_position', 8::numeric), + ('king', 'house_position', 9::numeric), ('king', 'house_condition', 88::numeric), ('king', 'lover_count_min', 1::numeric), ('king', 'lover_count_max', 4::numeric) diff --git a/backend/utils/falukant/initializeFalukantPredefines.js b/backend/utils/falukant/initializeFalukantPredefines.js index 690ba6f..2823200 100644 --- a/backend/utils/falukant/initializeFalukantPredefines.js +++ b/backend/utils/falukant/initializeFalukantPredefines.js @@ -297,24 +297,24 @@ async function initializeFalukantProducts() { async function initializeFalukantTitleRequirements() { const titleRequirements = [ - { labelTr: "civil", requirements: [{ type: "money", value: 5000 }, { type: "cost", value: 500 }] }, - { labelTr: "sir", requirements: [{ type: "branches", value: 2 }, { type: "cost", value: 1000 }] }, - { labelTr: "townlord", requirements: [{ type: "cost", value: 3000 }, { type: "money", value: 12000 }, { type: "reputation", value: 18 }] }, - { labelTr: "by", requirements: [{ type: "cost", value: 5000 }, { type: "money", value: 18000 }, { type: "house_position", value: 1 }] }, - { labelTr: "landlord", requirements: [{ type: "cost", value: 7500 }, { type: "money", value: 26000 }, { type: "reputation", value: 24 }, { type: "house_condition", value: 60 }] }, - { labelTr: "knight", requirements: [{ type: "cost", value: 11000 }, { type: "money", value: 38000 }, { type: "office_rank_any", value: 1 }] }, - { labelTr: "baron", requirements: [{ type: "branches", value: 4 }, { type: "cost", value: 16000 }, { type: "money", value: 55000 }, { type: "house_position", value: 2 }] }, - { labelTr: "count", requirements: [{ type: "cost", value: 23000 }, { type: "money", value: 80000 }, { type: "reputation", value: 32 }, { 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: "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: "landgrave", requirements: [{ type: "cost", value: 62000 }, { type: "money", value: 230000 }, { type: "office_rank_any", value: 3 }, { type: "house_position", value: 4 }] }, - { labelTr: "ruler", requirements: [{ type: "cost", value: 85000 }, { type: "money", value: 320000 }, { type: "reputation", value: 48 }, { 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: "imperial-prince", requirements: [{ type: "cost", value: 155000 }, { type: "money", value: 600000 }, { type: "reputation", value: 56 }, { 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: "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: "prince-regent", requirements: [{ type: "cost", value: 360000 }, { type: "money", value: 1520000 }, { type: "office_rank_any", value: 6 }, { type: "house_position", value: 7 }] }, - { 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: "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 }, { type: "house_position", value: 3 }] }, + { 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: 4 }] }, + { 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 }, { type: "house_position", value: 5 }] }, + { 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_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: 6 }] }, + { 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: 6 }] }, + { 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: 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_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: 8 }] }, + { 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: 9 }] }, + { 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();