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