summaryrefslogtreecommitdiff
path: root/contrib/flyway/src/FlywayModule.scala
blob: 86e7ea32d5c234a7439bb3625126fe1ad0ea1c1d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package mill
package contrib.flyway

import java.net.URLClassLoader

import mill.scalalib.Lib.resolveDependencies
import mill.scalalib._
import org.flywaydb.core.Flyway
import org.flywaydb.core.api.logging.LogFactory
import org.flywaydb.core.internal.configuration.{ConfigUtils => flyway}
import org.flywaydb.core.internal.logging.console.ConsoleLog.Level
import org.flywaydb.core.internal.logging.console.ConsoleLogCreator

import scala.collection.JavaConverters._


trait FlywayModule extends JavaModule {

  def flywayUrl: T[String]
  def flywayUser: T[String] = T("")
  def flywayPassword: T[String] = T("")
  //def flywayClassLocationDeps: T[Agg[Dep]] = Agg.empty[Dep]
  //def flywayClassLocations: T[Seq[String]] = T(Nil)
  def flywayFileLocations: T[Seq[PathRef]] = T(resources().map(pr => PathRef(pr.path / "db" / "migration", pr.quick)))
  def flywayDriverDeps: T[Agg[Dep]]
  def jdbcClasspath = T ( resolveDependencies(
    repositories,
    Lib.depToDependencyJava(_),
    flywayDriverDeps()
  ))

  private def tToOptPair[A](key: String, t: A) =
    Option(t)
      .filter {
        case a: String => a.nonEmpty
        case _ => true
      }
      .map(key -> _)

  def flywayInstance = T {
    val jdbcClassloader = new URLClassLoader(jdbcClasspath().map(_.path.toIO.toURI.toURL).toArray)

    val configProps = Map(flyway.URL -> flywayUrl()) ++
      tToOptPair(flyway.USER, flywayUser()) ++
      tToOptPair(flyway.PASSWORD, flywayPassword())

    LogFactory.setLogCreator(new ConsoleLogCreator(Level.INFO))

    Flyway
      .configure(jdbcClassloader)
      .locations(flywayFileLocations().map("filesystem:" + _.path):_*)
      .configuration(configProps.asJava)
      .load
  }

  def flywayMigrate() = T.command (
    flywayInstance().migrate()
  )
}