refactor(AdminService, EditUserView): streamline character data deletion and enhance confirmation dialog
All checks were successful
Deploy to production / deploy (push) Successful in 1m46s
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:
@@ -1203,6 +1203,25 @@ class AdminService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
await sequelize.transaction(async (t) => {
|
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({
|
summary.knowledgeDeleted = await Knowledge.destroy({
|
||||||
where: { characterId: parsedCharacterId },
|
where: { characterId: parsedCharacterId },
|
||||||
transaction: t
|
transaction: t
|
||||||
@@ -1249,101 +1268,78 @@ class AdminService {
|
|||||||
transaction: t
|
transaction: t
|
||||||
});
|
});
|
||||||
|
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.occupied_political_office',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.occupied_political_office
|
DELETE FROM falukant_data.occupied_political_office
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.political_benefit_last_tick',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.political_benefit_last_tick
|
DELETE FROM falukant_data.political_benefit_last_tick
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.falukant_character_trait',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.falukant_character_trait
|
DELETE FROM falukant_data.falukant_character_trait
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.church_application',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.church_application
|
DELETE FROM falukant_data.church_application
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
OR supervisor_id = :characterId
|
OR supervisor_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.church_office',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.church_office
|
DELETE FROM falukant_data.church_office
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
OR supervisor_id = :characterId
|
OR supervisor_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.political_appointment',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.political_appointment
|
DELETE FROM falukant_data.political_appointment
|
||||||
WHERE appointer_character_id = :characterId
|
WHERE appointer_character_id = :characterId
|
||||||
OR target_character_id = :characterId
|
OR target_character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.marriage_proposals',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.marriage_proposals
|
DELETE FROM falukant_data.marriage_proposals
|
||||||
WHERE requester_character_id = :characterId
|
WHERE requester_character_id = :characterId
|
||||||
OR proposed_character_id = :characterId
|
OR proposed_character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.child_relation',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.child_relation
|
DELETE FROM falukant_data.child_relation
|
||||||
WHERE father_character_id = :characterId
|
WHERE father_character_id = :characterId
|
||||||
OR mother_character_id = :characterId
|
OR mother_character_id = :characterId
|
||||||
OR child_character_id = :characterId
|
OR child_character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.relationship_state',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.relationship_state
|
DELETE FROM falukant_data.relationship_state
|
||||||
WHERE relationship_id IN (
|
WHERE relationship_id IN (
|
||||||
@@ -1352,56 +1348,40 @@ class AdminService {
|
|||||||
OR character2_id = :characterId
|
OR character2_id = :characterId
|
||||||
)
|
)
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.relationship',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.relationship
|
DELETE FROM falukant_data.relationship
|
||||||
WHERE character1_id = :characterId
|
WHERE character1_id = :characterId
|
||||||
OR character2_id = :characterId
|
OR character2_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_data.region_tax_history',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_data.region_tax_history
|
DELETE FROM falukant_data.region_tax_history
|
||||||
WHERE setter_character_id = :characterId
|
WHERE setter_character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_log.health_activity',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_log.health_activity
|
DELETE FROM falukant_log.health_activity
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
await sequelize.query(
|
await deleteIfTableExists(
|
||||||
|
'falukant_log.political_office_history',
|
||||||
`
|
`
|
||||||
DELETE FROM falukant_log.political_office_history
|
DELETE FROM falukant_log.political_office_history
|
||||||
WHERE character_id = :characterId
|
WHERE character_id = :characterId
|
||||||
`,
|
`,
|
||||||
{
|
{ characterId: parsedCharacterId }
|
||||||
replacements: { characterId: parsedCharacterId },
|
|
||||||
type: QueryTypes.DELETE,
|
|
||||||
transaction: t
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const deletedCharacters = await FalukantCharacter.destroy({
|
const deletedCharacters = await FalukantCharacter.destroy({
|
||||||
|
|||||||
@@ -213,6 +213,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<ChooseDialog ref="chooseDialog" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -220,13 +221,15 @@
|
|||||||
import { mapState } from 'vuex';
|
import { mapState } from 'vuex';
|
||||||
import { mapActions } from 'vuex';
|
import { mapActions } from 'vuex';
|
||||||
import SimpleTabs from '@/components/SimpleTabs.vue';
|
import SimpleTabs from '@/components/SimpleTabs.vue';
|
||||||
|
import ChooseDialog from '@/dialogues/standard/ChooseDialog.vue';
|
||||||
import apiClient from '@/utils/axios.js';
|
import apiClient from '@/utils/axios.js';
|
||||||
import { showApiError, showError, showSuccess } from '@/utils/feedback.js';
|
import { showApiError, showError, showSuccess } from '@/utils/feedback.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AdminFalukantEditUserView',
|
name: 'AdminFalukantEditUserView',
|
||||||
components: {
|
components: {
|
||||||
SimpleTabs
|
SimpleTabs,
|
||||||
|
ChooseDialog
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -581,7 +584,11 @@ export default {
|
|||||||
if (!characterId) {
|
if (!characterId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!window.confirm(this.$t('admin.falukant.edituser.deathCleanup.confirm'))) {
|
const confirmed = await this.$refs.chooseDialog.open({
|
||||||
|
title: this.$t('common.confirm'),
|
||||||
|
message: this.$t('admin.falukant.edituser.deathCleanup.confirm')
|
||||||
|
});
|
||||||
|
if (!confirmed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user