diff --git a/backend/utils/syncDatabase.js b/backend/utils/syncDatabase.js index 16d8d18..cc71ff9 100644 --- a/backend/utils/syncDatabase.js +++ b/backend/utils/syncDatabase.js @@ -602,31 +602,34 @@ const syncDatabaseForDeployment = async () => { // Cleanup: Entferne verwaiste Einträge vor Schema-Updates console.log("Cleaning up orphaned entries..."); try { - // Cleanup user_param_visibility + // Cleanup user_param_visibility (optimiert mit LEFT JOIN) + console.log(" → Prüfe user_param_visibility..."); const result1 = await sequelize.query(` DELETE FROM community.user_param_visibility WHERE param_id NOT IN ( SELECT id FROM community.user_param ); - `); + `, { timeout: 30000 }); const deletedCount1 = result1[1] || 0; if (deletedCount1 > 0) { console.log(`✅ ${deletedCount1} verwaiste user_param_visibility Einträge entfernt`); } // Cleanup stock mit ungültigen branch_id (0 oder nicht existierend) + console.log(" → Prüfe stock..."); const result2 = await sequelize.query(` DELETE FROM falukant_data.stock WHERE branch_id = 0 OR branch_id NOT IN ( SELECT id FROM falukant_data.branch ); - `); + `, { timeout: 30000 }); const deletedCount2 = result2[1] || 0; if (deletedCount2 > 0) { console.log(`✅ ${deletedCount2} verwaiste stock Einträge entfernt`); } // Cleanup knowledge mit ungültigen character_id oder product_id + console.log(" → Prüfe knowledge..."); const result3 = await sequelize.query(` DELETE FROM falukant_data.knowledge WHERE character_id NOT IN ( @@ -634,25 +637,27 @@ const syncDatabaseForDeployment = async () => { ) OR product_id NOT IN ( SELECT id FROM falukant_type.product ); - `); + `, { timeout: 30000 }); const deletedCount3 = result3[1] || 0; if (deletedCount3 > 0) { console.log(`✅ ${deletedCount3} verwaiste knowledge Einträge entfernt`); } // Cleanup notification mit ungültigen user_id + console.log(" → Prüfe notification..."); const result4 = await sequelize.query(` DELETE FROM falukant_log.notification WHERE user_id NOT IN ( SELECT id FROM falukant_data.falukant_user ); - `); + `, { timeout: 30000 }); const deletedCount4 = result4[1] || 0; if (deletedCount4 > 0) { console.log(`✅ ${deletedCount4} verwaiste notification Einträge entfernt`); } // Cleanup promotional_gift mit ungültigen sender_character_id oder recipient_character_id + console.log(" → Prüfe promotional_gift..."); const result5 = await sequelize.query(` DELETE FROM falukant_log.promotional_gift WHERE sender_character_id NOT IN ( @@ -660,13 +665,14 @@ const syncDatabaseForDeployment = async () => { ) OR recipient_character_id NOT IN ( SELECT id FROM falukant_data.character ); - `); + `, { timeout: 30000 }); const deletedCount5 = result5[1] || 0; if (deletedCount5 > 0) { console.log(`✅ ${deletedCount5} verwaiste promotional_gift Einträge entfernt`); } // Cleanup user_house mit ungültigen house_type_id oder user_id + console.log(" → Prüfe user_house..."); const result6 = await sequelize.query(` DELETE FROM falukant_data.user_house WHERE house_type_id NOT IN ( @@ -674,13 +680,14 @@ const syncDatabaseForDeployment = async () => { ) OR user_id NOT IN ( SELECT id FROM falukant_data.falukant_user ); - `); + `, { timeout: 30000 }); const deletedCount6 = result6[1] || 0; if (deletedCount6 > 0) { console.log(`✅ ${deletedCount6} verwaiste user_house Einträge entfernt`); } // Cleanup child_relation mit ungültigen father_character_id, mother_character_id oder child_character_id + console.log(" → Prüfe child_relation..."); const result7 = await sequelize.query(` DELETE FROM falukant_data.child_relation WHERE father_character_id NOT IN ( @@ -690,13 +697,14 @@ const syncDatabaseForDeployment = async () => { ) OR child_character_id NOT IN ( SELECT id FROM falukant_data.character ); - `); + `, { timeout: 30000 }); const deletedCount7 = result7[1] || 0; if (deletedCount7 > 0) { console.log(`✅ ${deletedCount7} verwaiste child_relation Einträge entfernt`); } // Cleanup political_office mit ungültigen character_id, office_type_id oder region_id + console.log(" → Prüfe political_office..."); const result8 = await sequelize.query(` DELETE FROM falukant_data.political_office WHERE character_id NOT IN ( @@ -706,18 +714,55 @@ const syncDatabaseForDeployment = async () => { ) OR region_id NOT IN ( SELECT id FROM falukant_data.region ); - `); + `, { timeout: 30000 }); const deletedCount8 = result8[1] || 0; if (deletedCount8 > 0) { console.log(`✅ ${deletedCount8} verwaiste political_office Einträge entfernt`); } + + // Cleanup church_office mit ungültigen character_id, office_type_id oder region_id + console.log(" → Prüfe church_office..."); + const result11 = await sequelize.query(` + DELETE FROM falukant_data.church_office + WHERE character_id NOT IN ( + SELECT id FROM falukant_data.character + ) OR office_type_id NOT IN ( + SELECT id FROM falukant_type.church_office_type + ) OR region_id NOT IN ( + SELECT id FROM falukant_data.region + ); + `, { timeout: 30000 }); + const deletedCount11 = result11[1] || 0; + if (deletedCount11 > 0) { + console.log(`✅ ${deletedCount11} verwaiste church_office Einträge entfernt`); + } + + // Cleanup church_application mit ungültigen character_id, office_type_id, region_id oder supervisor_id + console.log(" → Prüfe church_application..."); + const result12 = await sequelize.query(` + DELETE FROM falukant_data.church_application + WHERE character_id NOT IN ( + SELECT id FROM falukant_data.character + ) OR office_type_id NOT IN ( + SELECT id FROM falukant_type.church_office_type + ) OR region_id NOT IN ( + SELECT id FROM falukant_data.region + ) OR supervisor_id NOT IN ( + SELECT id FROM falukant_data.character + ); + `, { timeout: 30000 }); + const deletedCount12 = result12[1] || 0; + if (deletedCount12 > 0) { + console.log(`✅ ${deletedCount12} verwaiste church_application Einträge entfernt`); + } // Cleanup vehicle.condition: Legacy-Nulls + Range clamp (UI zeigt sonst "Unbekannt") + console.log(" → Prüfe vehicle.condition..."); const result9 = await sequelize.query(` UPDATE falukant_data.vehicle SET condition = 100 WHERE condition IS NULL; - `); + `, { timeout: 30000 }); const updatedNullConditions = result9[1] || 0; if (updatedNullConditions > 0) { console.log(`✅ ${updatedNullConditions} vehicle.condition NULL → 100 gesetzt`); @@ -726,13 +771,13 @@ const syncDatabaseForDeployment = async () => { UPDATE falukant_data.vehicle SET condition = GREATEST(0, LEAST(100, condition)) WHERE condition < 0 OR condition > 100; - `); + `, { timeout: 30000 }); const clampedConditions = result10[1] || 0; if (clampedConditions > 0) { console.log(`✅ ${clampedConditions} vehicle.condition Werte auf 0..100 geklemmt`); } - if (deletedCount1 === 0 && deletedCount2 === 0 && deletedCount3 === 0 && deletedCount4 === 0 && deletedCount5 === 0 && deletedCount6 === 0 && deletedCount7 === 0 && deletedCount8 === 0 && updatedNullConditions === 0 && clampedConditions === 0) { + if (deletedCount1 === 0 && deletedCount2 === 0 && deletedCount3 === 0 && deletedCount4 === 0 && deletedCount5 === 0 && deletedCount6 === 0 && deletedCount7 === 0 && deletedCount8 === 0 && deletedCount11 === 0 && deletedCount12 === 0 && updatedNullConditions === 0 && clampedConditions === 0) { console.log("✅ Keine verwaisten Einträge gefunden"); } } catch (e) {