app/config/Config.scala (78 lines of code) (raw):

package config import java.util.UUID import com.gu.workflow.util._ import play.Logger import play.api.{Configuration, Logging} import scala.jdk.CollectionConverters._ import scala.util.Try class Config(playConfig: Configuration) extends AwsInstanceTags with Logging { lazy val stage: Stage = readTag("Stage") match { case Some(value) => Stage(value) // If in AWS and we don't know our stage, fail fast to avoid ending up running an instance with dev config in PROD! case other if instanceId.nonEmpty => throw new IllegalStateException(s"Unable to read Stage tag: $other") case None => Stage("DEV") // default to dev stage } logger.info(s"running in stage: $stage") lazy val isDev: Boolean = stage == Dev lazy val isProd: Boolean = stage == Prod lazy val domain: String = stage.appDomain lazy val localLogShipping: Boolean = sys.env.getOrElse("LOCAL_LOG_SHIPPING", "false").toBoolean logger.info(s"Domain is: $domain") lazy val host: String = s"https://workflow.$domain" logger.info(s"Host is: $host") lazy val composerUrl: String = s"https://composer.$domain" lazy val composerRestorerUrl: String = s"https://restorer.$domain/content" lazy val mediaAtomMakerUrl: String = s"https://video.$domain" lazy val atomWorkshopUrl: String = s"https://atomworkshop.$domain" lazy val telemetryUrl: String = s"https://user-telemetry.$domain" private lazy val composerUrls: Set[String] = stage match { case Dev => Set(composerUrl) // Composer secondary does not exist in DEV case _ => Set(composerUrl, s"https://composer-secondary.$domain") } private def allowDevServiceToCallWorkflowCode(subDomain: String) = stage match { case Code => Some(s"https://${subDomain}.${Dev.appDomain}") case _ => None } def baseUri(host: String) = s"https://$host" final def getStringSetFromConf(key: String): Set[String] = Try( playConfig .get[String](key) .split(",") .map(_.trim) .toSet ).getOrElse(Set.empty) lazy val corsAllowedOrigins: Set[String] = getStringSetFromConf("security.cors.allowedOrigins").map(baseUri) lazy val corsAllowedDomains: Set[String] = composerUrls + mediaAtomMakerUrl ++ allowDevServiceToCallWorkflowCode("video") + atomWorkshopUrl ++ allowDevServiceToCallWorkflowCode("atomworkshop") + s"https://recipes.$domain" ++ allowDevServiceToCallWorkflowCode("recipes") + telemetryUrl lazy val presenceUrl: String = s"wss://presence.$domain/socket" lazy val presenceClientLib: String = s"https://presence.$domain/client/1/lib.js" lazy val preferencesHost: String = s"preferences.$domain" lazy val preferencesUrl: String = s"https://$preferencesHost/preferences" lazy val pinboardLoaderUrl: String = s"https://pinboard.$domain/pinboard.loader.js" lazy val tagManagerUrl: String = s"https://tagmanager.$domain" lazy val capiPreviewIamUrl: String = playConfig.get[String]("capi.preview.iamUrl") lazy val capiPreviewRole: String = playConfig.get[String]("capi.preview.role") lazy val sharedSecret: String = playConfig.get[String]("api.sharedsecret") lazy val incopyOpenUrl: String = "gnm://openinincopy/storybundle/${storyBundleId}/checkout/readwrite" lazy val incopyExportUrl: String = "gnm://composer/export/${composerId}" lazy val indesignExportUrl: String = "gnm://composerindesign/export/${composerId}" lazy val viewerUrl: String = s"https://viewer.$domain" lazy val storyPackagesUrl: String = s"https://packages.$domain" lazy val googleTrackingId: String = playConfig.get[String]("google.tracking.id") lazy val no2faUser: String = "composer.test@guardian.co.uk" lazy val editorialSupportDynamoTable: String = stage match { case Prod => "editorial-support-PROD" case _ => "editorial-support-CODE" } lazy val atomTypes: List[String] = List("media", "chart") lazy val contentTypes: List[String] = List("article", "liveblog", "gallery", "interactive", "picture", "video", "audio") lazy val sessionId: String = UUID.randomUUID().toString lazy val capiKey: String = playConfig.get[String]("capi.key") lazy val pandaSystem: String = "workflow" lazy val pandaBucketName: String = "pan-domain-auth-settings" lazy val loggingStreamName: Option[String] = playConfig.getOptional[String]("aws.kinesis.logging.streamName") lazy val loggingRole: Option[String] = playConfig.getOptional[String]("aws.kinesis.logging.stsRoleToAssume") lazy val apiRoot: String = playConfig.get[String]("api.url") }