refactor(AdminService, EditUserView): streamline character data deletion and enhance confirmation dialog
All checks were successful
Deploy to production / deploy (push) Successful in 1m46s

- Introduced a reusable `deleteIfTableExists` function in AdminService to simplify the deletion of character-related data across multiple tables, improving code maintainability.
- Updated the deletion logic to check for table existence before executing delete queries, enhancing robustness.
- Enhanced the EditUserView by integrating a `ChooseDialog` for user confirmation before proceeding with character death cleanup, improving user experience and interaction clarity.
This commit is contained in:
Torsten Schulz (local)
2026-04-20 16:16:48 +02:00
parent 267711fca6
commit 7417736daf
2 changed files with 67 additions and 80 deletions

View File

@@ -1203,6 +1203,25 @@ class AdminService {
};
await sequelize.transaction(async (t) => {
const deleteIfTableExists = async (qualifiedTableName, deleteSql, replacements = {}) => {
const existsRow = await sequelize.query(
`SELECT to_regclass(:tableName) AS table_name`,
{
replacements: { tableName: qualifiedTableName },
type: QueryTypes.SELECT,
transaction: t
}
);
if (!existsRow?.[0]?.table_name) {
return 0;
}
return await sequelize.query(deleteSql, {
replacements,
type: QueryTypes.DELETE,
transaction: t
});
};
summary.knowledgeDeleted = await Knowledge.destroy({
where: { characterId: parsedCharacterId },
transaction: t
@@ -1249,101 +1268,78 @@ class AdminService {
transaction: t
});
await sequelize.query(
await deleteIfTableExists(
'falukant_data.occupied_political_office',
`
DELETE FROM falukant_data.occupied_political_office
WHERE character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.political_benefit_last_tick',
`
DELETE FROM falukant_data.political_benefit_last_tick
WHERE character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.falukant_character_trait',
`
DELETE FROM falukant_data.falukant_character_trait
WHERE character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.church_application',
`
DELETE FROM falukant_data.church_application
WHERE character_id = :characterId
OR supervisor_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.church_office',
`
DELETE FROM falukant_data.church_office
WHERE character_id = :characterId
OR supervisor_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.political_appointment',
`
DELETE FROM falukant_data.political_appointment
WHERE appointer_character_id = :characterId
OR target_character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.marriage_proposals',
`
DELETE FROM falukant_data.marriage_proposals
WHERE requester_character_id = :characterId
OR proposed_character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.child_relation',
`
DELETE FROM falukant_data.child_relation
WHERE father_character_id = :characterId
OR mother_character_id = :characterId
OR child_character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.relationship_state',
`
DELETE FROM falukant_data.relationship_state
WHERE relationship_id IN (
@@ -1352,56 +1348,40 @@ class AdminService {
OR character2_id = :characterId
)
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.relationship',
`
DELETE FROM falukant_data.relationship
WHERE character1_id = :characterId
OR character2_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_data.region_tax_history',
`
DELETE FROM falukant_data.region_tax_history
WHERE setter_character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_log.health_activity',
`
DELETE FROM falukant_log.health_activity
WHERE character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
await sequelize.query(
await deleteIfTableExists(
'falukant_log.political_office_history',
`
DELETE FROM falukant_log.political_office_history
WHERE character_id = :characterId
`,
{
replacements: { characterId: parsedCharacterId },
type: QueryTypes.DELETE,
transaction: t
}
{ characterId: parsedCharacterId }
);
const deletedCharacters = await FalukantCharacter.destroy({