diff --git a/src/main/java/com/petshop/backend/BackendApplication.java b/src/main/java/com/petshop/backend/BackendApplication.java index b2df1cc4..2a9718c3 100644 --- a/src/main/java/com/petshop/backend/BackendApplication.java +++ b/src/main/java/com/petshop/backend/BackendApplication.java @@ -1,6 +1,7 @@ package com.petshop.backend; -import org.springframework.boot.SpringApplication; +import com.petshop.backend.config.FlywayContextInitializer; +import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.web.config.EnableSpringDataWebSupport; @@ -8,6 +9,8 @@ import org.springframework.data.web.config.EnableSpringDataWebSupport; @EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO) public class BackendApplication { public static void main(String[] args) { - SpringApplication.run(BackendApplication.class, args); + new SpringApplicationBuilder(BackendApplication.class) + .initializers(new FlywayContextInitializer()) + .run(args); } } diff --git a/src/main/java/com/petshop/backend/DevStackApplication.java b/src/main/java/com/petshop/backend/DevStackApplication.java index a049b7ee..76b76de4 100644 --- a/src/main/java/com/petshop/backend/DevStackApplication.java +++ b/src/main/java/com/petshop/backend/DevStackApplication.java @@ -1,5 +1,6 @@ package com.petshop.backend; +import com.petshop.backend.config.FlywayContextInitializer; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.event.ContextClosedEvent; @@ -30,7 +31,9 @@ public class DevStackApplication { try { controller.startDatabase(); - context = new SpringApplicationBuilder(BackendApplication.class).run(args); + context = new SpringApplicationBuilder(BackendApplication.class) + .initializers(new FlywayContextInitializer()) + .run(args); ConfigurableApplicationContext appContext = context; context.addApplicationListener(event -> { if (event instanceof ContextClosedEvent) { diff --git a/src/main/java/com/petshop/backend/config/FlywayContextInitializer.java b/src/main/java/com/petshop/backend/config/FlywayContextInitializer.java new file mode 100644 index 00000000..3fb28d10 --- /dev/null +++ b/src/main/java/com/petshop/backend/config/FlywayContextInitializer.java @@ -0,0 +1,40 @@ +package com.petshop.backend.config; + +import org.flywaydb.core.Flyway; +import org.flywaydb.core.api.MigrationVersion; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.Arrays; + +public class FlywayContextInitializer implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + ConfigurableEnvironment environment = applicationContext.getEnvironment(); + + String url = environment.getProperty("spring.datasource.url"); + String username = environment.getProperty("spring.datasource.username"); + String password = environment.getProperty("spring.datasource.password"); + + if (url == null || username == null || password == null) { + throw new IllegalStateException("Datasource properties are required before startup"); + } + + String[] locations = Arrays.stream(environment + .getProperty("spring.flyway.locations", "classpath:db/migration") + .split(",")) + .map(String::trim) + .filter(location -> !location.isEmpty()) + .toArray(String[]::new); + + Flyway.configure() + .dataSource(url, username, password) + .locations(locations) + .baselineOnMigrate(environment.getProperty("spring.flyway.baseline-on-migrate", Boolean.class, false)) + .baselineVersion(MigrationVersion.fromVersion(environment.getProperty("spring.flyway.baseline-version", "1"))) + .load() + .migrate(); + } +}