def localFlyway: Flyway = buildFlyway()

in db/flyway.sc [95:159]


def localFlyway: Flyway = buildFlyway("postgres")

val location = Path.of(scriptPath).getParent().resolve("migrations").toString()

def buildFlyway(password: String) =
  Flyway
    .configure()
    .dataSource(
      "jdbc:postgresql://localhost:5432/newswires",
      "postgres",
      password
    )
    .locations(s"filesystem:$location")
    .load()

def remoteFlyway(stage: String): Flyway = {
  val credentials =
    DefaultCredentialsProvider.builder().profileName("editorial-feeds").build()
  val secretsManager =
    SecretsManagerClient
      .builder()
      .credentialsProvider(credentials)
      .region(Region.EU_WEST_1)
      .build()

  val matchingSecret = secretsManager
    .listSecrets()
    .secretList()
    .asScala
    .find(secret => {
      val tags = secret.tags().asScala
      secret.name().contains("NewswiresDBNewswiresSecret") && tags.exists(tag =>
        tag.key == "App" && tag.value == "newswires"
      ) && tags.exists(tag => tag.key == "Stage" && tag.value == stage)
    })
    .getOrElse {
      println("No secret matching the expected name or tags!")
      sys.exit(1)
    }

  val getSecretRequest = GetSecretValueRequest
    .builder()
    .secretId(matchingSecret.arn())
    .build()

  val response = secretsManager.getSecretValue(getSecretRequest)

  val secretData = ujson.read(response.secretString())

  val rds = RdsClient.builder()
  .credentialsProvider(credentials)
  .region(Region.EU_WEST_1)
  .build()

  val generateTokenRequest =  GenerateAuthenticationTokenRequest.builder()
    .credentialsProvider(credentials)
    .username("postgres")
    .port(5432)
    .hostname(secretData("host").str)
    .build()

  val token = rds.utilities().generateAuthenticationToken(generateTokenRequest)

  buildFlyway(token)
}