FlywayConfiguration.java
package com.tdmconsult.ete.configuration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import javax.sql.DataSource;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.flywaydb.core.Flyway;
import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.support.JdbcUtils;
@Configuration
@RequiredArgsConstructor
public class FlywayConfiguration {
public static final String FLYWAY_USER = "flyway";
private final DataSource eteDataSource;
@Bean(initMethod = "migrate")
public Flyway flyway() {
final LocalDateTime today = LocalDateTime.now();
final ZoneId berlinTimeZone = ZoneId.of("Europe/Berlin");
return Flyway.configure()
.placeholders(Map.of(
"today", today.format(DateTimeFormatter.ofPattern("yyyyMMdd")),
"todayTimestamp", String.valueOf(today.atZone(berlinTimeZone).toInstant().toEpochMilli()),
"todayDateTime", today.atZone(berlinTimeZone).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME),
"flywayUser", FLYWAY_USER,
"uuidFunction", getUuidFunctionName()))
.dataSource(eteDataSource).load();
}
@SneakyThrows
private String getUuidFunctionName() {
final DatabaseDriver databaseDriver = DatabaseDriver
.fromJdbcUrl(JdbcUtils.extractDatabaseMetaData(eteDataSource, "getURL"));
return switch (databaseDriver) {
case H2 -> "random_uuid()";
case POSTGRESQL -> "gen_random_uuid()";
case MYSQL -> "UUID()";
default -> throw new RuntimeException(String.format("Database %s is not supported", databaseDriver));
};
}
}