1 /*
2  *  Make.org Core API
3  *  Copyright (C) 2018 Make.org
4  *
5  * This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU Affero General Public License as
7  *  published by the Free Software Foundation, either version 3 of the
8  *  License, or (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU Affero General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Affero General Public License
16  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  *
18  */
19 
20 package org.make.api.extensions
21 
22 import com.github.t3hnar.bcrypt._
23 import com.typesafe.config.Config
24 import grizzled.slf4j.Logging
25 import org.apache.commons.dbcp2.BasicDataSource
26 import org.flywaydb.core.Flyway
27 import org.flywaydb.core.api.MigrationVersion
28 import org.flywaydb.core.api.configuration.FluentConfiguration
29 import org.make.api.extensions.MakeSettings.DefaultAdmin
30 import org.make.api.technical.ExecutorServiceHelper._
31 import org.make.api.technical.MonitorableExecutionContext
32 import scalikejdbc.{ConnectionPool, DataSourceConnectionPool, GlobalSettings, LoggingSQLAndTimeSettings}
33 
34 import java.sql.Connection
35 import java.util.concurrent.{Executors, ThreadPoolExecutor}
36 import scala.concurrent.ExecutionContext
37 import scala.jdk.CollectionConverters._
38 import scala.util.{Failure, Success, Try}
39 
40 class DatabaseConfiguration(override protected val configuration: Config, defaultAdmin: DefaultAdmin)
41     extends ConfigurationSupport
42     with Logging {
43 
44   private val user: String = configuration.getString("database.user")
45   private val password: String = configuration.getString("database.password")
46 
47   private val jdbcUrl: String = configuration.getString("database.jdbc-url")
48 
49   private val readDatasource = new BasicDataSource()
50   readDatasource.setDriverClassName("org.postgresql.Driver")
51   readDatasource.setUrl(jdbcUrl)
52   readDatasource.setUsername(user)
53   readDatasource.setPassword(password)
54   readDatasource.setInitialSize(configuration.getInt("database.pools.read.initial-size"))
55   readDatasource.setMaxTotal(configuration.getInt("database.pools.read.max-total"))
56   readDatasource.setMaxIdle(configuration.getInt("database.pools.read.max-idle"))
57 
58   val (readExecutor: MonitorableExecutionContext, readThreadPool: ExecutionContext) = {
59     @SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf"))
60     val executor = Executors
61       .newFixedThreadPool(configuration.getInt("database.pools.read.max-total"))
62       .asInstanceOf[ThreadPoolExecutor]
63     (new MonitorableExecutionContext(executor), executor.instrument("db-read-executor").toExecutionContext)
64   }
65 
66   private val writeDatasource = new BasicDataSource()
67   writeDatasource.setDriverClassName("org.postgresql.Driver")
68   writeDatasource.setUrl(jdbcUrl)
69   writeDatasource.setUsername(user)
70   writeDatasource.setPassword(password)
71   writeDatasource.setInitialSize(configuration.getInt("database.pools.write.initial-size"))
72   writeDatasource.setMaxTotal(configuration.getInt("database.pools.write.max-total"))
73   writeDatasource.setMaxIdle(configuration.getInt("database.pools.write.max-idle"))
74 
75   val (writeExecutor: MonitorableExecutionContext, writeThreadPool: ExecutionContext) = {
76     @SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf"))
77     val executor = Executors
78       .newFixedThreadPool(configuration.getInt("database.pools.write.max-total"))
79       .asInstanceOf[ThreadPoolExecutor]
80     (new MonitorableExecutionContext(executor), executor.instrument("db-write-executor").toExecutionContext)
81   }
82 
83   ConnectionPool.add("READ", new DataSourceConnectionPool(dataSource = readDatasource))
84   ConnectionPool.add("WRITE", new DataSourceConnectionPool(dataSource = writeDatasource))
85 
86   GlobalSettings.loggingSQLErrors = true
87   GlobalSettings.loggingSQLAndTime = LoggingSQLAndTimeSettings(
88     enabled = true,
89     warningEnabled = true,
90     warningThresholdMillis = 500,
91     warningLogLevel = "warn",
92     printUnprocessedStackTrace = false,
93     logLevel = "debug"
94   )
95 
96   private val databaseName = writeDatasource.getConnection.getCatalog
97   private val defaultClientId: String = configuration.getString("authentication.default-client-id")
98   private val defaultClientSecret: String = configuration.getString("authentication.default-client-secret")
99   private val defaultBackofficeClientId: String = configuration.getString("authentication.backoffice.client-id")
100   private val defaultBackofficeClientSecret: String = configuration.getString("authentication.backoffice.client-secret")
101 
102   def migrateDatabase(): Unit = {
103     logger.debug(s"Creating database with name: $databaseName")
104     Try {
105       val connection: Connection = writeDatasource.getConnection
106       connection.prepareStatement(s"CREATE DATABASE IF NOT EXISTS $databaseName").execute()
107       connection.close()
108     } match {
109       case Success(_) =>
110       case Failure(e) => logger.debug(s"Error when creating database: ${e.getMessage}")
111     }
112 
113     val setBaselineVersion: Boolean = configuration.getBoolean("database.migration.init-schema")
114 
115     val baselineVersion: MigrationVersion =
116       MigrationVersion.fromVersion(configuration.getString("database.migration.baseline-version"))
117 
118     val repair: Boolean = configuration.getBoolean("database.migration.repair")
119 
120     var flywayBuilder: FluentConfiguration = Flyway
121       .configure()
122       .dataSource(writeDatasource)
123       .initSql("SET autocommit_before_ddl = off")
124       .baselineOnMigrate(true)
125       .locations("classpath:db/migration", "classpath:org/make/api/migrations/db")
126       .placeholders(
127         Map(
128           "dbname" -> databaseName,
129           "clientId" -> defaultClientId,
130           "clientSecret" -> defaultClientSecret,
131           "backofficeClientId" -> defaultBackofficeClientId,
132           "backofficeClientSecret" -> defaultBackofficeClientSecret,
133           "adminEmail" -> defaultAdmin.email,
134           "adminFirstName" -> defaultAdmin.firstName,
135           "adminEncryptedPassword" -> defaultAdmin.password.boundedBcrypt
136         ).asJava
137       )
138 
139     if (!setBaselineVersion && flywayBuilder.getBaselineVersion.compareTo(baselineVersion) < 0) {
140       flywayBuilder = flywayBuilder.baselineVersion(baselineVersion)
141     }
142 
143     val flyway: Flyway = flywayBuilder.load()
144     if (repair) {
145       Try(flyway.repair()) match {
146         case Success(_) => logger.info("Repairing SQL migrations history: success")
147         case Failure(e) => logger.warn("Cannot repair SQL migrations history:", e)
148       }
149     }
150     flyway.migrate()
151     Try(flyway.validate()) match {
152       case Success(_) => logger.info("SQL migrations: success")
153       case Failure(e) => logger.warn("Cannot migrate database:", e)
154     }
155   }
156 }
Line Stmt Id Pos Tree Symbol Tests Code
44 21487 1735 - 1775 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("database.user")
45 21020 1809 - 1853 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("database.password")
47 19972 1887 - 1931 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("database.jdbc-url")
49 21642 1964 - 1985 Apply org.apache.commons.dbcp2.BasicDataSource.<init> new org.apache.commons.dbcp2.BasicDataSource()
50 20708 1988 - 2046 Apply org.apache.commons.dbcp2.BasicDataSource.setDriverClassName DatabaseConfiguration.this.readDatasource.setDriverClassName("org.postgresql.Driver")
51 19731 2071 - 2078 Select org.make.api.extensions.DatabaseConfiguration.jdbcUrl DatabaseConfiguration.this.jdbcUrl
51 21730 2049 - 2079 Apply org.apache.commons.dbcp2.BasicDataSource.setUrl DatabaseConfiguration.this.readDatasource.setUrl(DatabaseConfiguration.this.jdbcUrl)
52 19811 2082 - 2114 Apply org.apache.commons.dbcp2.BasicDataSource.setUsername DatabaseConfiguration.this.readDatasource.setUsername(DatabaseConfiguration.this.user)
52 20834 2109 - 2113 Select org.make.api.extensions.DatabaseConfiguration.user DatabaseConfiguration.this.user
53 20945 2117 - 2153 Apply org.apache.commons.dbcp2.BasicDataSource.setPassword DatabaseConfiguration.this.readDatasource.setPassword(DatabaseConfiguration.this.password)
53 21494 2144 - 2152 Select org.make.api.extensions.DatabaseConfiguration.password DatabaseConfiguration.this.password
54 19976 2186 - 2242 Apply com.typesafe.config.Config.getInt DatabaseConfiguration.this.configuration.getInt("database.pools.read.initial-size")
54 21647 2156 - 2243 Apply org.apache.commons.dbcp2.BasicDataSource.setInitialSize DatabaseConfiguration.this.readDatasource.setInitialSize(DatabaseConfiguration.this.configuration.getInt("database.pools.read.initial-size"))
55 20622 2273 - 2326 Apply com.typesafe.config.Config.getInt DatabaseConfiguration.this.configuration.getInt("database.pools.read.max-total")
55 19738 2246 - 2327 Apply org.apache.commons.dbcp2.BasicDataSource.setMaxTotal DatabaseConfiguration.this.readDatasource.setMaxTotal(DatabaseConfiguration.this.configuration.getInt("database.pools.read.max-total"))
56 21717 2356 - 2408 Apply com.typesafe.config.Config.getInt DatabaseConfiguration.this.configuration.getInt("database.pools.read.max-idle")
56 20788 2330 - 2409 Apply org.apache.commons.dbcp2.BasicDataSource.setMaxIdle DatabaseConfiguration.this.readDatasource.setMaxIdle(DatabaseConfiguration.this.configuration.getInt("database.pools.read.max-idle"))
58 19820 2418 - 2418 Select scala.Tuple2._1 DatabaseConfiguration.this.x$1._1
58 21420 2461 - 2461 Select scala.Tuple2._2 DatabaseConfiguration.this.x$1._2
66 20461 2861 - 2882 Apply org.apache.commons.dbcp2.BasicDataSource.<init> new org.apache.commons.dbcp2.BasicDataSource()
67 19981 2885 - 2944 Apply org.apache.commons.dbcp2.BasicDataSource.setDriverClassName DatabaseConfiguration.this.writeDatasource.setDriverClassName("org.postgresql.Driver")
68 20629 2947 - 2978 Apply org.apache.commons.dbcp2.BasicDataSource.setUrl DatabaseConfiguration.this.writeDatasource.setUrl(DatabaseConfiguration.this.jdbcUrl)
68 21536 2970 - 2977 Select org.make.api.extensions.DatabaseConfiguration.jdbcUrl DatabaseConfiguration.this.jdbcUrl
69 21718 2981 - 3014 Apply org.apache.commons.dbcp2.BasicDataSource.setUsername DatabaseConfiguration.this.writeDatasource.setUsername(DatabaseConfiguration.this.user)
69 19720 3009 - 3013 Select org.make.api.extensions.DatabaseConfiguration.user DatabaseConfiguration.this.user
70 19784 3017 - 3054 Apply org.apache.commons.dbcp2.BasicDataSource.setPassword DatabaseConfiguration.this.writeDatasource.setPassword(DatabaseConfiguration.this.password)
70 20791 3045 - 3053 Select org.make.api.extensions.DatabaseConfiguration.password DatabaseConfiguration.this.password
71 21423 3088 - 3145 Apply com.typesafe.config.Config.getInt DatabaseConfiguration.this.configuration.getInt("database.pools.write.initial-size")
71 20528 3057 - 3146 Apply org.apache.commons.dbcp2.BasicDataSource.setInitialSize DatabaseConfiguration.this.writeDatasource.setInitialSize(DatabaseConfiguration.this.configuration.getInt("database.pools.write.initial-size"))
72 19958 3177 - 3231 Apply com.typesafe.config.Config.getInt DatabaseConfiguration.this.configuration.getInt("database.pools.write.max-total")
72 21539 3149 - 3232 Apply org.apache.commons.dbcp2.BasicDataSource.setMaxTotal DatabaseConfiguration.this.writeDatasource.setMaxTotal(DatabaseConfiguration.this.configuration.getInt("database.pools.write.max-total"))
73 19727 3235 - 3316 Apply org.apache.commons.dbcp2.BasicDataSource.setMaxIdle DatabaseConfiguration.this.writeDatasource.setMaxIdle(DatabaseConfiguration.this.configuration.getInt("database.pools.write.max-idle"))
73 20585 3262 - 3315 Apply com.typesafe.config.Config.getInt DatabaseConfiguration.this.configuration.getInt("database.pools.write.max-idle")
75 20886 3369 - 3369 Select scala.Tuple2._2 DatabaseConfiguration.this.x$2._2
75 21218 3325 - 3325 Select scala.Tuple2._1 DatabaseConfiguration.this.x$2._1
83 21681 3769 - 3826 Apply scalikejdbc.DataSourceConnectionPool.<init> new scalikejdbc.DataSourceConnectionPool(DatabaseConfiguration.this.readDatasource, scalikejdbc.this.DataSourceConnectionPool.<init>$default$2, scalikejdbc.this.DataSourceConnectionPool.<init>$default$3)
83 20535 3769 - 3769 Select scalikejdbc.DataSourceConnectionPool.<init>$default$2 scalikejdbc.this.DataSourceConnectionPool.<init>$default$2
83 19787 3761 - 3767 Literal <nosymbol> "READ"
83 20074 3769 - 3769 Select scalikejdbc.DataSourceConnectionPool.<init>$default$3 scalikejdbc.this.DataSourceConnectionPool.<init>$default$3
83 20588 3742 - 3827 Apply scalikejdbc.ConnectionPool.add scalikejdbc.ConnectionPool.add("READ", new scalikejdbc.DataSourceConnectionPool(DatabaseConfiguration.this.readDatasource, scalikejdbc.this.DataSourceConnectionPool.<init>$default$2, scalikejdbc.this.DataSourceConnectionPool.<init>$default$3))
83 21386 3811 - 3825 Select org.make.api.extensions.DatabaseConfiguration.readDatasource DatabaseConfiguration.this.readDatasource
84 21463 3858 - 3916 Apply scalikejdbc.DataSourceConnectionPool.<init> new scalikejdbc.DataSourceConnectionPool(DatabaseConfiguration.this.writeDatasource, scalikejdbc.this.DataSourceConnectionPool.<init>$default$2, scalikejdbc.this.DataSourceConnectionPool.<init>$default$3)
84 19923 3858 - 3858 Select scalikejdbc.DataSourceConnectionPool.<init>$default$3 scalikejdbc.this.DataSourceConnectionPool.<init>$default$3
84 20544 3830 - 3917 Apply scalikejdbc.ConnectionPool.add scalikejdbc.ConnectionPool.add("WRITE", new scalikejdbc.DataSourceConnectionPool(DatabaseConfiguration.this.writeDatasource, scalikejdbc.this.DataSourceConnectionPool.<init>$default$2, scalikejdbc.this.DataSourceConnectionPool.<init>$default$3))
84 19736 3849 - 3856 Literal <nosymbol> "WRITE"
84 20786 3858 - 3858 Select scalikejdbc.DataSourceConnectionPool.<init>$default$2 scalikejdbc.this.DataSourceConnectionPool.<init>$default$2
84 21347 3900 - 3915 Select org.make.api.extensions.DatabaseConfiguration.writeDatasource DatabaseConfiguration.this.writeDatasource
86 19956 3921 - 3959 Apply scalikejdbc.GlobalSettings.loggingSQLErrors_= scalikejdbc.GlobalSettings.loggingSQLErrors_=(true)
87 19522 3997 - 3997 Select scalikejdbc.LoggingSQLAndTimeSettings.apply$default$9 scalikejdbc.LoggingSQLAndTimeSettings.apply$default$9
87 19701 3962 - 4201 Apply scalikejdbc.GlobalSettings.loggingSQLAndTime_= scalikejdbc.GlobalSettings.loggingSQLAndTime_=({ <artifact> val x$1: Boolean(true) = true; <artifact> val x$2: Boolean(true) = true; <artifact> val x$3: Long(500L) = 500L; <artifact> val x$4: String("warn") = "warn"; <artifact> val x$5: Boolean(false) = false; <artifact> val x$6: String("debug") = "debug"; <artifact> val x$7: Boolean = scalikejdbc.LoggingSQLAndTimeSettings.apply$default$2; <artifact> val x$8: Int = scalikejdbc.LoggingSQLAndTimeSettings.apply$default$4; <artifact> val x$9: Option[Int] @scala.reflect.internal.annotations.uncheckedBounds = scalikejdbc.LoggingSQLAndTimeSettings.apply$default$9; <artifact> val x$10: Option[Int] @scala.reflect.internal.annotations.uncheckedBounds = scalikejdbc.LoggingSQLAndTimeSettings.apply$default$10; scalikejdbc.LoggingSQLAndTimeSettings.apply(true, x$7, false, x$8, "debug", true, 500L, "warn", x$9, x$10) })
87 20499 3997 - 3997 Select scalikejdbc.LoggingSQLAndTimeSettings.apply$default$4 scalikejdbc.LoggingSQLAndTimeSettings.apply$default$4
87 20582 3997 - 4201 Apply scalikejdbc.LoggingSQLAndTimeSettings.apply scalikejdbc.LoggingSQLAndTimeSettings.apply(true, x$7, false, x$8, "debug", true, 500L, "warn", x$9, x$10)
87 21467 3997 - 3997 Select scalikejdbc.LoggingSQLAndTimeSettings.apply$default$2 scalikejdbc.LoggingSQLAndTimeSettings.apply$default$2
87 21568 3997 - 3997 Select scalikejdbc.LoggingSQLAndTimeSettings.apply$default$10 scalikejdbc.LoggingSQLAndTimeSettings.apply$default$10
88 21606 4038 - 4042 Literal <nosymbol> true
89 20715 4065 - 4069 Literal <nosymbol> true
90 19695 4100 - 4103 Literal <nosymbol> 500L
91 21351 4127 - 4133 Literal <nosymbol> "warn"
92 20756 4168 - 4173 Literal <nosymbol> false
93 19866 4190 - 4197 Literal <nosymbol> "debug"
96 21236 4232 - 4272 Apply java.sql.Connection.getCatalog DatabaseConfiguration.this.writeDatasource.getConnection().getCatalog()
97 20760 4313 - 4372 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("authentication.default-client-id")
98 19871 4417 - 4480 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("authentication.default-client-secret")
99 21384 4531 - 4593 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("authentication.backoffice.client-id")
100 20503 4648 - 4714 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("authentication.backoffice.client-secret")
103 19480 4754 - 4813 Apply grizzled.slf4j.Logger.debug DatabaseConfiguration.this.logger.debug(("Creating database with name: ".+(DatabaseConfiguration.this.databaseName): String))
104 21241 4818 - 5011 Apply scala.util.Try.apply scala.util.Try.apply[Unit]({ val connection: java.sql.Connection = DatabaseConfiguration.this.writeDatasource.getConnection(); connection.prepareStatement(("CREATE DATABASE IF NOT EXISTS ".+(DatabaseConfiguration.this.databaseName): String)).execute(); connection.close() })
105 21571 4859 - 4888 Apply org.apache.commons.dbcp2.BasicDataSource.getConnection DatabaseConfiguration.this.writeDatasource.getConnection()
106 20586 4895 - 4980 Apply java.sql.PreparedStatement.execute connection.prepareStatement(("CREATE DATABASE IF NOT EXISTS ".+(DatabaseConfiguration.this.databaseName): String)).execute()
107 19626 4987 - 5005 Apply java.sql.Connection.close connection.close()
109 20743 5042 - 5044 Literal <nosymbol> ()
110 19922 5070 - 5132 Apply grizzled.slf4j.Logger.debug DatabaseConfiguration.this.logger.debug(("Error when creating database: ".+(e.getMessage()): String))
113 21388 5178 - 5236 Apply com.typesafe.config.Config.getBoolean DatabaseConfiguration.this.configuration.getBoolean("database.migration.init-schema")
116 20490 5317 - 5379 Apply com.typesafe.config.Config.getString DatabaseConfiguration.this.configuration.getString("database.migration.baseline-version")
116 19487 5288 - 5380 Apply org.flywaydb.core.api.MigrationVersion.fromVersion org.flywaydb.core.api.MigrationVersion.fromVersion(DatabaseConfiguration.this.configuration.getString("database.migration.baseline-version"))
118 21577 5408 - 5461 Apply com.typesafe.config.Config.getBoolean DatabaseConfiguration.this.configuration.getBoolean("database.migration.repair")
122 20712 5552 - 5567 Select org.make.api.extensions.DatabaseConfiguration.writeDatasource DatabaseConfiguration.this.writeDatasource
123 19630 5584 - 5617 Literal <nosymbol> "SET autocommit_before_ddl = off"
124 21302 5644 - 5648 Literal <nosymbol> true
125 19924 5693 - 5731 Literal <nosymbol> "classpath:org/make/api/migrations/db"
125 20303 5667 - 5691 Literal <nosymbol> "classpath:db/migration"
126 21497 5508 - 6221 Apply org.flywaydb.core.api.configuration.FluentConfiguration.placeholders org.flywaydb.core.Flyway.configure().dataSource(DatabaseConfiguration.this.writeDatasource).initSql("SET autocommit_before_ddl = off").baselineOnMigrate(true).locations("classpath:db/migration", "classpath:org/make/api/migrations/db").placeholders(scala.jdk.CollectionConverters.MapHasAsJava[String, String](scala.Predef.Map.apply[String, String](scala.Predef.ArrowAssoc[String]("dbname").->[String](DatabaseConfiguration.this.databaseName), scala.Predef.ArrowAssoc[String]("clientId").->[String](DatabaseConfiguration.this.defaultClientId), scala.Predef.ArrowAssoc[String]("clientSecret").->[String](DatabaseConfiguration.this.defaultClientSecret), scala.Predef.ArrowAssoc[String]("backofficeClientId").->[String](DatabaseConfiguration.this.defaultBackofficeClientId), scala.Predef.ArrowAssoc[String]("backofficeClientSecret").->[String](DatabaseConfiguration.this.defaultBackofficeClientSecret), scala.Predef.ArrowAssoc[String]("adminEmail").->[String](DatabaseConfiguration.this.defaultAdmin.email), scala.Predef.ArrowAssoc[String]("adminFirstName").->[String](DatabaseConfiguration.this.defaultAdmin.firstName), scala.Predef.ArrowAssoc[String]("adminEncryptedPassword").->[String](com.github.t3hnar.bcrypt.`package`.BCryptStrOps(DatabaseConfiguration.this.defaultAdmin.password).boundedBcrypt))).asJava)
127 20299 5762 - 6206 Apply scala.collection.MapFactory.apply scala.Predef.Map.apply[String, String](scala.Predef.ArrowAssoc[String]("dbname").->[String](DatabaseConfiguration.this.databaseName), scala.Predef.ArrowAssoc[String]("clientId").->[String](DatabaseConfiguration.this.defaultClientId), scala.Predef.ArrowAssoc[String]("clientSecret").->[String](DatabaseConfiguration.this.defaultClientSecret), scala.Predef.ArrowAssoc[String]("backofficeClientId").->[String](DatabaseConfiguration.this.defaultBackofficeClientId), scala.Predef.ArrowAssoc[String]("backofficeClientSecret").->[String](DatabaseConfiguration.this.defaultBackofficeClientSecret), scala.Predef.ArrowAssoc[String]("adminEmail").->[String](DatabaseConfiguration.this.defaultAdmin.email), scala.Predef.ArrowAssoc[String]("adminFirstName").->[String](DatabaseConfiguration.this.defaultAdmin.firstName), scala.Predef.ArrowAssoc[String]("adminEncryptedPassword").->[String](com.github.t3hnar.bcrypt.`package`.BCryptStrOps(DatabaseConfiguration.this.defaultAdmin.password).boundedBcrypt))
128 21499 5777 - 5785 Literal <nosymbol> "dbname"
128 19567 5777 - 5801 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("dbname").->[String](DatabaseConfiguration.this.databaseName)
128 20495 5789 - 5801 Select org.make.api.extensions.DatabaseConfiguration.databaseName DatabaseConfiguration.this.databaseName
129 21663 5813 - 5823 Literal <nosymbol> "clientId"
129 20716 5827 - 5842 Select org.make.api.extensions.DatabaseConfiguration.defaultClientId DatabaseConfiguration.this.defaultClientId
129 19747 5813 - 5842 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("clientId").->[String](DatabaseConfiguration.this.defaultClientId)
130 19907 5854 - 5891 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("clientSecret").->[String](DatabaseConfiguration.this.defaultClientSecret)
130 21309 5854 - 5868 Literal <nosymbol> "clientSecret"
130 20408 5872 - 5891 Select org.make.api.extensions.DatabaseConfiguration.defaultClientSecret DatabaseConfiguration.this.defaultClientSecret
131 19572 5903 - 5952 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("backofficeClientId").->[String](DatabaseConfiguration.this.defaultBackofficeClientId)
131 21503 5903 - 5923 Literal <nosymbol> "backofficeClientId"
131 20465 5927 - 5952 Select org.make.api.extensions.DatabaseConfiguration.defaultBackofficeClientId DatabaseConfiguration.this.defaultBackofficeClientId
132 21158 5964 - 5988 Literal <nosymbol> "backofficeClientSecret"
132 20693 5992 - 6021 Select org.make.api.extensions.DatabaseConfiguration.defaultBackofficeClientSecret DatabaseConfiguration.this.defaultBackofficeClientSecret
132 19681 5964 - 6021 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("backofficeClientSecret").->[String](DatabaseConfiguration.this.defaultBackofficeClientSecret)
133 21316 6033 - 6045 Literal <nosymbol> "adminEmail"
133 20293 6049 - 6067 Select org.make.api.extensions.MakeSettings.DefaultAdmin.email DatabaseConfiguration.this.defaultAdmin.email
133 19832 6033 - 6067 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("adminEmail").->[String](DatabaseConfiguration.this.defaultAdmin.email)
134 21471 6079 - 6095 Literal <nosymbol> "adminFirstName"
134 19577 6079 - 6121 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("adminFirstName").->[String](DatabaseConfiguration.this.defaultAdmin.firstName)
134 20468 6099 - 6121 Select org.make.api.extensions.MakeSettings.DefaultAdmin.firstName DatabaseConfiguration.this.defaultAdmin.firstName
135 19669 6161 - 6196 Select com.github.t3hnar.bcrypt.BCryptStrOps.boundedBcrypt com.github.t3hnar.bcrypt.`package`.BCryptStrOps(DatabaseConfiguration.this.defaultAdmin.password).boundedBcrypt
135 21275 6133 - 6196 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("adminEncryptedPassword").->[String](com.github.t3hnar.bcrypt.`package`.BCryptStrOps(DatabaseConfiguration.this.defaultAdmin.password).boundedBcrypt)
135 21110 6133 - 6157 Literal <nosymbol> "adminEncryptedPassword"
135 20637 6161 - 6182 Select org.make.api.extensions.MakeSettings.DefaultAdmin.password DatabaseConfiguration.this.defaultAdmin.password
136 19791 5762 - 6213 Select scala.collection.convert.AsJavaExtensions.MapHasAsJava.asJava scala.jdk.CollectionConverters.MapHasAsJava[String, String](scala.Predef.Map.apply[String, String](scala.Predef.ArrowAssoc[String]("dbname").->[String](DatabaseConfiguration.this.databaseName), scala.Predef.ArrowAssoc[String]("clientId").->[String](DatabaseConfiguration.this.defaultClientId), scala.Predef.ArrowAssoc[String]("clientSecret").->[String](DatabaseConfiguration.this.defaultClientSecret), scala.Predef.ArrowAssoc[String]("backofficeClientId").->[String](DatabaseConfiguration.this.defaultBackofficeClientId), scala.Predef.ArrowAssoc[String]("backofficeClientSecret").->[String](DatabaseConfiguration.this.defaultBackofficeClientSecret), scala.Predef.ArrowAssoc[String]("adminEmail").->[String](DatabaseConfiguration.this.defaultAdmin.email), scala.Predef.ArrowAssoc[String]("adminFirstName").->[String](DatabaseConfiguration.this.defaultAdmin.firstName), scala.Predef.ArrowAssoc[String]("adminEncryptedPassword").->[String](com.github.t3hnar.bcrypt.`package`.BCryptStrOps(DatabaseConfiguration.this.defaultAdmin.password).boundedBcrypt))).asJava
139 19743 6227 - 6227 Literal <nosymbol> ()
139 20471 6254 - 6317 Apply scala.Int.< flywayBuilder.getBaselineVersion().compareTo(baselineVersion).<(0)
139 19463 6231 - 6317 Apply scala.Boolean.&& setBaselineVersion.unary_!.&&(flywayBuilder.getBaselineVersion().compareTo(baselineVersion).<(0))
139 21278 6227 - 6227 Block <nosymbol> ()
140 20593 6327 - 6389 Assign <nosymbol> flywayBuilder = flywayBuilder.baselineVersion(baselineVersion)
140 21122 6343 - 6389 Apply org.flywaydb.core.api.configuration.FluentConfiguration.baselineVersion flywayBuilder.baselineVersion(baselineVersion)
143 20268 6422 - 6442 Apply org.flywaydb.core.api.configuration.FluentConfiguration.load flywayBuilder.load()
144 20691 6447 - 6447 Literal <nosymbol> ()
144 19749 6447 - 6447 Block <nosymbol> ()
145 21466 6467 - 6487 Apply scala.util.Try.apply scala.util.Try.apply[org.flywaydb.core.api.output.RepairResult](flyway.repair())
145 21070 6467 - 6670 Match <nosymbol> scala.util.Try.apply[org.flywaydb.core.api.output.RepairResult](flyway.repair()) match { case (value: org.flywaydb.core.api.output.RepairResult): scala.util.Success[org.flywaydb.core.api.output.RepairResult](_) => DatabaseConfiguration.this.logger.info("Repairing SQL migrations history: success") case (exception: Throwable): scala.util.Failure[org.flywaydb.core.api.output.RepairResult]((e @ _)) => DatabaseConfiguration.this.logger.warn("Cannot repair SQL migrations history:", e) }
145 21913 6471 - 6486 Apply org.flywaydb.core.Flyway.repair flyway.repair()
146 20547 6523 - 6579 Apply grizzled.slf4j.Logger.info DatabaseConfiguration.this.logger.info("Repairing SQL migrations history: success")
147 19468 6607 - 6662 Apply grizzled.slf4j.Logger.warn DatabaseConfiguration.this.logger.warn("Cannot repair SQL migrations history:", e)
150 21268 6681 - 6697 Apply org.flywaydb.core.Flyway.migrate flyway.migrate()
151 20271 6706 - 6723 Apply org.flywaydb.core.Flyway.validate flyway.validate()
151 21864 6702 - 6724 Apply scala.util.Try.apply scala.util.Try.apply[Unit](flyway.validate())
152 21469 6758 - 6796 Apply grizzled.slf4j.Logger.info DatabaseConfiguration.this.logger.info("SQL migrations: success")
153 20551 6822 - 6864 Apply grizzled.slf4j.Logger.warn DatabaseConfiguration.this.logger.warn("Cannot migrate database:", e)