app/AppLoader.scala (104 lines of code) (raw):
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceAsync
import com.gu.googleauth.AuthAction
import config.AmiableConfigProvider
import controllers.{AMIable, Healthcheck, Login, routes}
import metrics.CloudWatch
import play.api.ApplicationLoader.Context
import play.api.libs.logback.LogbackLoggerConfigurator
import play.api.libs.ws.ahc.AhcWSComponents
import play.api.mvc.AnyContent
import play.filters.HttpFiltersComponents
import router.Routes
import services.{Agents, Metrics}
import services.notification.{
AWSMailClient,
Notifications,
ScheduledNotificationRunner
}
import services.notification.AmazonSimpleEmailServiceAsyncFactory._
class AppLoader extends play.api.ApplicationLoader {
override def load(context: Context): play.api.Application = {
new LogbackLoggerConfigurator().configure(context.environment)
println("""
.---.
__ __ ___ .--. /| | | __.....__
| |/ `.' `. |__| || | | .-'' '.
| .-. .-. '.--. || | | / .-''"'-. `.
__ | | | | | || | __ || __ | |/ /________\ \
.:--.'. | | | | | || | .:--.'. ||/'__ '. | || |
/ | \ || | | | | || |/ | \ | |:/` '. '| |\ .-------------'
`" __ | || | | | | || |`" __ | | || | || | \ '-.____...---.
.'.''| ||__| |__| |__||__| .'.''| | ||\ / '| | `. .'
/ / | |_ / / | |_|/\'..' / '---' `''-...... -'
\ \._,\ '/ \ \._,\ '/' `'-'`
`--' `" `--' `"
""")
val components = new AppComponents(context)
components.application
}
}
class AppComponents(context: Context)
extends play.api.BuiltInComponentsFromContext(context)
with HttpFiltersComponents
with AhcWSComponents
with controllers.AssetsComponents {
lazy val amiableConfigProvider =
new AmiableConfigProvider(wsClient, configuration, httpConfiguration)
val cloudwatch = new CloudWatch()
val agents = new Agents(
amiableConfigProvider,
applicationLifecycle,
actorSystem,
environment,
cloudwatch
)
val metrics = new Metrics(
cloudwatch,
amiableConfigProvider.shouldCreateCloudwatchMetrics,
amiableConfigProvider.cloudwatchWriteNamespace,
amiableConfigProvider.cloudwatchSecurityHqNamespace,
agents,
applicationLifecycle,
actorSystem
)
lazy val amazonMailClient: AmazonSimpleEmailServiceAsync =
amazonSimpleEmailServiceAsync
lazy val awsMailClient = new AWSMailClient(amazonMailClient)(executionContext)
lazy val scheduledNotificationRunner = new ScheduledNotificationRunner(
awsMailClient,
environment,
amiableConfigProvider
)
lazy val notifications = new Notifications(
amiableConfigProvider,
environment,
applicationLifecycle,
scheduledNotificationRunner
)
private val authAction = new AuthAction[AnyContent](
amiableConfigProvider.googleAuthConfig,
routes.Login.startLogin,
controllerComponents.parsers.default
)(executionContext)
lazy val amiableController = new AMIable(
controllerComponents,
amiableConfigProvider,
agents,
notifications,
authAction
)(executionContext)
lazy val healthCheckController = new Healthcheck(controllerComponents)
lazy val loginController = new Login(
controllerComponents,
amiableConfigProvider,
wsClient,
amiableConfigProvider.googleAuthConfig
)(executionContext)
lazy val router = new Routes(
httpErrorHandler,
amiableController,
healthCheckController,
loginController,
assets
)
}