From 6a86bd4cbbcddb69c275284088143ce241ffcbba Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 17 Apr 2022 17:06:00 +0200
Subject: [PATCH] #663 - migrator: cleanup database before migration

---
 .../databasemigrator/BatchConfiguration.java  | 62 +++++++++++++++++++
 .../DatabaseMigratorMain.java                 |  7 ++-
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java
index 733a86dd2..80f6c1b21 100644
--- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java
+++ b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/BatchConfiguration.java
@@ -53,6 +53,8 @@ import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.report.ReportSe
 import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag.TagReader;
 import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag.TemplateTagReader;
 import de.deadlocker8.budgetmaster.databasemigrator.steps.reader.tag.TransactionTagReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.batch.core.Job;
 import org.springframework.batch.core.Step;
 import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
@@ -68,6 +70,8 @@ import javax.sql.DataSource;
 @EnableBatchProcessing
 public class BatchConfiguration
 {
+	private static final Logger LOGGER = LoggerFactory.getLogger(BatchConfiguration.class);
+
 	final JobBuilderFactory jobBuilderFactory;
 	final StepBuilderFactory stepBuilderFactory;
 
@@ -107,6 +111,7 @@ public class BatchConfiguration
 	final DestinationTemplateRepository destinationTemplateRepository;
 	final DestinationTemplateGroupRepository destinationTemplateGroupRepository;
 
+	@SuppressWarnings("squid:S107")
 	public BatchConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, DataSource primaryDataSource, DestinationImageRepository destinationImageRepository, DestinationIconRepository destinationIconRepository, DestinationCategoryRepository destinationCategoryRepository, DestinationAccountRepository destinationAccountRepository, DestinationChartRepository destinationChartRepository, DestinationHintRepository destinationHintRepository, DestinationRepeatingEndRepository destinationRepeatingEndRepository, DestinationRepeatingEndAfterXTimesRepository destinationRepeatingEndAfterXTimesRepository, DestinationRepeatingEndDateRepository destinationRepeatingEndDateRepository, DestinationRepeatingEndNeverRepository destinationRepeatingEndNeverRepository, DestinationRepeatingModifierRepository destinationRepeatingModifierRepository, DestinationRepeatingModifierDaysRepository destinationRepeatingModifierDaysRepository, DestinationRepeatingModifierMonthsRepository destinationRepeatingModifierMonthsRepository, DestinationRepeatingModifierYearsRepository destinationRepeatingModifierYearsRepository, DestinationRepeatingOptionRepository destinationRepeatingOptionRepository, DestinationReportColumnRepository destinationReportColumnRepository, DestinationReportSettingsRepository destinationReportSettingsRepository, DestinationSettingsRepository destinationSettingsRepository, DestinationTagRepository destinationTagRepository, DestinationTemplateTagRepository destinationTemplateTagRepository, DestinationTransactionTagRepository destinationTransactionTagRepository, DestinationUserRepository destinationUserRepository, DestinationTransactionRepository destinationTransactionRepository, DestinationTemplateRepository destinationTemplateRepository, DestinationTemplateGroupRepository destinationTemplateGroupRepository)
 	{
 		this.jobBuilderFactory = jobBuilderFactory;
@@ -148,6 +153,63 @@ public class BatchConfiguration
 		this.destinationTemplateGroupRepository = destinationTemplateGroupRepository;
 	}
 
+	public void cleanDatabase()
+	{
+		LOGGER.debug(">>> Cleanup database...");
+
+		// deletion order is important!
+
+		LOGGER.debug("Cleaning tags...");
+		destinationTemplateTagRepository.deleteAll();
+		destinationTransactionTagRepository.deleteAll();
+		destinationTagRepository.deleteAll();
+
+		LOGGER.debug("Cleaning transactions...");
+		destinationTransactionRepository.deleteAll();
+
+		LOGGER.debug("Cleaning templates...");
+		destinationTemplateRepository.deleteAll();
+		LOGGER.debug("Cleaning template groups.");
+		destinationTemplateGroupRepository.deleteAll();
+
+		LOGGER.debug("Cleaning categories...");
+		destinationCategoryRepository.deleteAll();
+		LOGGER.debug("Cleaning users...");
+		destinationUserRepository.deleteAll();
+		LOGGER.debug("Cleaning accounts...");
+		destinationAccountRepository.deleteAll();
+
+		LOGGER.debug("Cleaning report settings...");
+		destinationReportColumnRepository.deleteAll();
+		destinationReportSettingsRepository.deleteAll();
+
+		LOGGER.debug("Cleaning charts...");
+		destinationChartRepository.deleteAll();
+		LOGGER.debug("Cleaning hints...");
+		destinationHintRepository.deleteAll();
+
+		LOGGER.debug("Cleaning icons...");
+		destinationIconRepository.deleteAll();
+		LOGGER.debug("Cleaning images...");
+		destinationImageRepository.deleteAll();
+
+		LOGGER.debug("Cleaning repeating options...");
+		destinationRepeatingOptionRepository.deleteAll();
+		destinationRepeatingEndAfterXTimesRepository.deleteAll();
+		destinationRepeatingEndDateRepository.deleteAll();
+		destinationRepeatingEndNeverRepository.deleteAll();
+		destinationRepeatingEndRepository.deleteAll();
+		destinationRepeatingModifierDaysRepository.deleteAll();
+		destinationRepeatingModifierMonthsRepository.deleteAll();
+		destinationRepeatingModifierYearsRepository.deleteAll();
+		destinationRepeatingModifierRepository.deleteAll();
+
+		LOGGER.debug("Cleaning settings...");
+		destinationSettingsRepository.deleteAll();
+
+		LOGGER.debug(">>> Cleanup database DONE");
+	}
+
 	@Bean(name = "migrateJob")
 	public Job createMigrateJob()
 	{
diff --git a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java
index b7f4ee5f5..d22b9b0ad 100644
--- a/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java
+++ b/BudgetMasterDatabaseMigrator/src/main/java/de/deadlocker8/budgetmaster/databasemigrator/DatabaseMigratorMain.java
@@ -18,12 +18,15 @@ public class DatabaseMigratorMain implements CommandLineRunner
 
 	private final JobLauncher jobLauncher;
 
+	private final BatchConfiguration batchConfiguration;
+
 	@Qualifier("migrateJob")
 	private final Job migrateJob;
 
-	public DatabaseMigratorMain(JobLauncher jobLauncher, Job migrateJob)
+	public DatabaseMigratorMain(JobLauncher jobLauncher, BatchConfiguration batchConfiguration, Job migrateJob)
 	{
 		this.jobLauncher = jobLauncher;
+		this.batchConfiguration = batchConfiguration;
 		this.migrateJob = migrateJob;
 	}
 
@@ -68,6 +71,8 @@ public class DatabaseMigratorMain implements CommandLineRunner
 	@Override
 	public void run(String... args) throws Exception
 	{
+		batchConfiguration.cleanDatabase();
+
 		jobLauncher.run(migrateJob, new JobParametersBuilder().toJobParameters());
 	}
 }
-- 
GitLab