app/load/AppComponents.scala (53 lines of code) (raw):

package load import auth.AuthorisedAction import com.gu.identity.auth.{OktaAudience, OktaAuthService, OktaIssuerUrl, OktaTokenValidationConfig} import com.okta.sdk.client.AuthorizationMode.PRIVATE_KEY import com.okta.sdk.client.Clients import com.okta.sdk.resource.api.UserApi import controllers.{HealthCheckController, UserController} import logging.RequestLoggingFilter import play.api.ApplicationLoader.Context import play.api.BuiltInComponentsFromContext import play.api.db.slick.{DbName, SlickComponents} import play.api.libs.ws.ahc.AhcWSComponents import play.api.mvc.EssentialFilter import play.filters.HttpFiltersComponents import router.Routes import services.{CompositeUserService, LegacyIdentityDbUserService, OktaUserService} import slick.jdbc.JdbcProfile import scala.jdk.CollectionConverters.* class AppComponents(context: Context) extends BuiltInComponentsFromContext(context) with HttpFiltersComponents with SlickComponents with AhcWSComponents { override def httpFilters: Seq[EssentialFilter] = super.httpFilters :+ new RequestLoggingFilter(materializer) private lazy val oktaOrgUrl = s"https://${configuration.get[String]("oktaApi.domain")}" private lazy val oktaUserApi = { val apiClient = Clients .builder() .setOrgUrl(oktaOrgUrl) .setClientId(configuration.get[String]("oktaApi.clientId")) .setAuthorizationMode(PRIVATE_KEY) .setPrivateKey(configuration.get[String]("oktaApi.privateKey")) .setScopes(configuration.get[Seq[String]]("oktaApi.scopes").toSet.asJava) .build() new UserApi(apiClient) } private lazy val authService = OktaAuthService( OktaTokenValidationConfig( issuerUrl = OktaIssuerUrl(configuration.get[String]("idProvider.issuer")), audience = Some(OktaAudience(configuration.get[String]("idProvider.audience"))), clientId = None ) ) private lazy val legacyIdentityDbUserService = new LegacyIdentityDbUserService( slickApi.dbConfig[JdbcProfile](DbName("legacyIdentityDb")) ) private lazy val oktaUserService = new OktaUserService(oktaUserApi, oktaOrgUrl, wsClient) private lazy val userService = new CompositeUserService(oktaUserService, legacyIdentityDbUserService) private lazy val authorisedAction = new AuthorisedAction(authService, playBodyParsers.defaultBodyParser, _) private lazy val healthCheckController = new HealthCheckController(controllerComponents, userService) private lazy val userController = new UserController(controllerComponents, authorisedAction, userService) lazy val router: Routes = new Routes(httpErrorHandler, healthCheckController, userController) }