-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathModule.scala
executable file
·122 lines (106 loc) · 4.17 KB
/
Module.scala
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import akka.actor.ActorSystem
import akka.management.cluster.bootstrap.ClusterBootstrap
import akka.management.scaladsl.AkkaManagement
import com.google.auth.oauth2.{AccessToken, GoogleCredentials}
import com.google.firebase.{FirebaseApp, FirebaseOptions}
import com.google.firebase.auth.internal.Utils.isEmulatorMode
import javax.inject.{Inject, Provider, Singleton}
import com.typesafe.config.Config
import play.api.inject.ApplicationLifecycle
import play.api.{Configuration, Environment, Logger, Mode}
import slick.jdbc.JdbcBackend.Database
import com.google.inject.AbstractModule
import de.innfactory.bootstrapplay2.commons.firebase.FirebaseBase
import de.innfactory.play.flyway.FlywayMigrator
import de.innfactory.play.tracing.OpentelemetryProvider
import org.joda.time.DateTime
import play.api.libs.concurrent.AkkaGuiceSupport
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
/**
* This module handles the bindings for the API to the Slick implementation.
*
* https://www.playframework.com/documentation/latest/ScalaDependencyInjection#Programmatic-bindings
*/
class Module(environment: Environment, configuration: Configuration) extends AbstractModule with AkkaGuiceSupport {
val logger = Logger("application")
override def configure(): Unit = {
logger.info(s"Configuring ${environment.mode}")
bind(classOf[Database]).toProvider(classOf[DatabaseProvider])
bind(classOf[FlywayMigratorImpl]).asEagerSingleton()
logger.info(s"- - - Binding Firebase - - -")
bind(classOf[firebaseCreationService]).asEagerSingleton()
bind(classOf[firebaseDeletionService]).asEagerSingleton()
bind(classOf[AkkaCluster]).asEagerSingleton()
/**
* Inject Modules depended on environment (Test, Prod, Dev)
*/
if (environment.mode == Mode.Test) {
logger.info(s"- - - Binding Services for for Test Mode - - -")
bind(classOf[TracingConfiguratorMock]).asEagerSingleton()
} else if (environment.mode == Mode.Dev) {
logger.info(s"- - - Binding Services for for Dev Mode - - -")
bind(classOf[TracingConfigurator]).asEagerSingleton()
} else {
logger.info(s"- - - Binding Services for for Prod Mode - - -")
bind(classOf[TracingConfigurator]).asEagerSingleton()
}
}
}
@Singleton
class TracingConfigurator @Inject() (implicit ec: ExecutionContext, config: Config, lifecycle: ApplicationLifecycle) {
Try(
OpentelemetryProvider.configure(
"bootstrap-play2",
config.getString("project.id"),
Some(config.getString("gcp.serviceAccount"))
)
)
}
@Singleton
class TracingConfiguratorMock @Inject() (implicit
ec: ExecutionContext,
config: Config,
lifecycle: ApplicationLifecycle
) {
OpentelemetryProvider.configure("bootstrap-play2", config.getString("project.id"), None)
}
@Singleton
class AkkaCluster @Inject() (system: ActorSystem) {
AkkaManagement(system).start()
ClusterBootstrap(system).start()
}
/** Migrate Flyway on application start */
class FlywayMigratorImpl @Inject() (env: Environment, configuration: Configuration, config: Config)
extends FlywayMigrator(configuration, env, configIdentifier = s"${config.getString("project.id")}.database")
/** Creates FirebaseApp on Application creation */
class firebaseCreationService @Inject() (config: Config, env: Environment) {
if (env.mode == Mode.Prod || env.mode == Mode.Dev) {
FirebaseBase.instantiateFirebase(config.getString("gcp.serviceAccount"), config.getString("project.id"))
} else if (isEmulatorMode) {
FirebaseApp.initializeApp(
FirebaseOptions
.builder()
.setCredentials(
GoogleCredentials.create(
new AccessToken(
"owner",
new DateTime().plusYears(1).toDate
)
)
)
.setProjectId(s"demo-bootstrap-play2")
.build()
)
}
}
/** Deletes FirebaseApp safely. Important on dev restart. */
class firebaseDeletionService @Inject() (lifecycle: ApplicationLifecycle) {
lifecycle.addStopHook { () =>
Future.successful(FirebaseBase.deleteFirebase())
}
}
@Singleton
class DatabaseProvider @Inject() (config: Config) extends Provider[Database] {
lazy val get = Database.forConfig("bootstrap-play2.database", config)
}