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));
        };
    }
}