app/AppComponents.scala (65 lines of code) (raw):
import com.gu.pandomainauth.{PanDomainAuthSettingsRefresher, S3BucketLoader}
import com.gu.permissions.{PermissionsConfig, PermissionsProvider}
import com.gu.workflow.api.{DesksAPI, SectionDeskMappingsAPI, SectionsAPI, StubAPI}
import com.gu.workflow.lib.TagService
import com.gu.workflow.util.AWS
import config.Config
import controllers._
import lib.LoggingFilter
import play.api.ApplicationLoader.Context
import play.api.BuiltInComponentsFromContext
import play.api.libs.ws.ahc.AhcWSComponents
import play.api.mvc.EssentialFilter
import play.filters.HttpFiltersComponents
import play.filters.cors.{CORSComponents, CORSConfig}
import play.filters.cors.CORSConfig.Origins
import router.Routes
class AppComponents(context: Context)
extends BuiltInComponentsFromContext(context)
with HttpFiltersComponents
with AhcWSComponents
with AssetsComponents
with CORSComponents {
val config = new Config(context.initialConfiguration)
val panDomainRefresher = PanDomainAuthSettingsRefresher(
domain = config.domain,
system = config.pandaSystem,
S3BucketLoader.forAwsSdkV1(AWS.S3Client, config.pandaBucketName)
)
val permissions: PermissionsProvider =
PermissionsProvider(PermissionsConfig(stage = if (config.isProd) "PROD" else "CODE", AWS.region.getName, AWS.credentialsProvider))
val managementController = new Management(controllerComponents)
val loginController = new Login(config, controllerComponents, wsClient, panDomainRefresher, permissions)
val capiServiceController = new CAPIService(config, controllerComponents, wsClient, panDomainRefresher, permissions)
val sectionsApi = new SectionsAPI(config.apiRoot, wsClient)
val desksApi = new DesksAPI(config.apiRoot, wsClient)
val sectionsDeskMappingsApi = new SectionDeskMappingsAPI(config.apiRoot, wsClient)
val stubsApi = new StubAPI(config.apiRoot, wsClient)
val tagService = new TagService(config.tagManagerUrl, wsClient)
val adminController = new Admin(sectionsApi, desksApi, sectionsDeskMappingsApi, permissions, config, controllerComponents, wsClient, panDomainRefresher)
val editorialSupportTeamsController = new EditorialSupportTeamsController(config, controllerComponents, wsClient, panDomainRefresher, permissions)
val apiController = new Api(stubsApi, sectionsApi, editorialSupportTeamsController, config, controllerComponents, wsClient, panDomainRefresher, permissions)
val applicationController = new Application(editorialSupportTeamsController, sectionsApi, tagService, desksApi, sectionsDeskMappingsApi, permissions, config, controllerComponents, wsClient, panDomainRefresher, stubsApi)
val peopleServiceController = new PeopleService(config, controllerComponents, wsClient, panDomainRefresher, permissions)
val preferencesProxyController = new PreferencesProxy(config, controllerComponents, wsClient, panDomainRefresher, permissions)
val supportController = new Support(config, controllerComponents, wsClient, panDomainRefresher, permissions)
override val router = new Routes(
httpErrorHandler,
applicationController,
loginController,
apiController,
peopleServiceController,
capiServiceController,
adminController,
supportController,
managementController,
assets,
preferencesProxyController
)
final override lazy val corsConfig: CORSConfig = CORSConfig.fromConfiguration(context.initialConfiguration).copy(
allowedOrigins = Origins.Matching(Set(config.host) ++ config.corsAllowedDomains ++ config.corsAllowedOrigins)
)
override lazy val httpFilters: Seq[EssentialFilter] = {
// corsFilter before csrfFilter to allow other Tools to call the api
// see https://www.playframework.com/documentation/2.7.x/ScalaCsrf#Trusting-CORS-requests
Seq(corsFilter, csrfFilter, securityHeadersFilter, new LoggingFilter(materializer))
}
}