diff --git a/app/Components.scala b/app/Components.scala index bde78a420ea..0274450033c 100644 --- a/app/Components.scala +++ b/app/Components.scala @@ -83,7 +83,6 @@ class AppComponents(context: Context, val config: ApplicationConfiguration) val updateManager = new UpdateManager(updateActions, configAgent, s3FrontsApi) val cloudwatch = new CloudWatch(config, awsEndpoints) val press = new Press(faciaPress) - val assetsManager = new AssetsManager(config, isDev) override lazy val httpErrorHandler = new LoggingHttpErrorHandler(environment, configuration, sourceMapper, Some(router)) // Controllers @@ -99,10 +98,10 @@ class AppComponents(context: Context, val config: ApplicationConfiguration) val storiesVisible = new StoriesVisibleController(containerService, this) val thumbnail = new ThumbnailController(containerThumbnails, this) val troubleshoot = new TroubleshootController(this) - val uncachedAssets = new UncachedAssets(assets, this) + val uncachedAssets = new V1Assets(assets, this) val v2Assets = new V2Assets(assets) val vanityRedirects = new VanityRedirects(acl, this) - val views = new ViewsController(acl, assetsManager, isDev, this) + val views = new ViewsController(acl, isDev, this) val pressController = new PressController(dynamo, this) val v2App = new V2App(isDev, acl, dynamo, this) val faciaToolV2 = new FaciaToolV2Controller(acl, structuredLogger, faciaPress, updateActions, configAgent, collectionService, faciaApiIO, this) diff --git a/app/controllers/UncachedAssets.scala b/app/controllers/UncachedAssets.scala deleted file mode 100644 index 2749b7810db..00000000000 --- a/app/controllers/UncachedAssets.scala +++ /dev/null @@ -1,9 +0,0 @@ -package controllers - -import scala.concurrent.ExecutionContext.Implicits.global - -class UncachedAssets(val assets: Assets, deps: BaseFaciaControllerComponents) extends BaseFaciaController(deps) { - def at(file: String, relativePath: String = "") = model.NoCache { - assets.at("/public/src", relativePath + file) - } -} diff --git a/app/controllers/V1Assets.scala b/app/controllers/V1Assets.scala new file mode 100644 index 00000000000..76a0f5b1b0d --- /dev/null +++ b/app/controllers/V1Assets.scala @@ -0,0 +1,12 @@ +package controllers + +import scala.concurrent.ExecutionContext.Implicits.global + +class V1Assets(val assets: Assets, deps: BaseFaciaControllerComponents) extends BaseFaciaController(deps) { + + def aggressivelyCached(file: String) = + assets.at("/public/dist", file, aggressiveCaching = true) + def notCached(file: String) = model.NoCache { + assets.at("/public/src", file) + } +} diff --git a/app/controllers/ViewsController.scala b/app/controllers/ViewsController.scala index ac316668c74..8e55fe18027 100644 --- a/app/controllers/ViewsController.scala +++ b/app/controllers/ViewsController.scala @@ -6,11 +6,20 @@ import model.Cached import org.joda.time.DateTime import permissions.ConfigPermissionCheck import play.api.mvc._ -import services.AssetsManager import util.Acl -class ViewsController(val acl: Acl, assetsManager: AssetsManager, isDev: Boolean, - val deps: BaseFaciaControllerComponents)(implicit ec: ExecutionContext) extends BaseFaciaController(deps) { +import java.io.File + +class ViewsController( + val acl: Acl, + isDev: Boolean, + val deps: BaseFaciaControllerComponents +)(implicit ec: ExecutionContext) extends BaseFaciaController(deps) { + + private def getV1DistFilename(prefix: String) = + new File("/public/src/").listFiles().find(_.getName.startsWith(prefix)).get.getName + private val v1ConfigBundleHashedName = getV1DistFilename("config.") + private val v1CollectionsBundleHashedName = getV1DistFilename("collections.") private def shouldRedirectToV2(request: UserRequest[AnyContent], priority: Option[String] = None): Boolean = { val isBreakingNews = priority.getOrElse("") == "breaking-news" || request.queryString.getOrElse("layout", Seq("")).exists(_.contains("breaking-news")) @@ -27,7 +36,12 @@ class ViewsController(val acl: Acl, assetsManager: AssetsManager, isDev: Boolean } else { val identity = request.user Cached(60) { - Ok(views.html.priority(Option(identity), config.facia.stage, isDev, true)) + Ok(views.html.priority( + identity = Option(identity), + stage = config.facia.stage, + isDev = isDev, + displayV2Message = true + )) } } } @@ -38,8 +52,14 @@ class ViewsController(val acl: Acl, assetsManager: AssetsManager, isDev: Boolean } else { val identity = request.user Cached(60) { - Ok(views.html.admin_main(Option(identity), config.facia.stage, overrideIsDev(request, isDev), - assetsManager.pathForCollections, priority != "email", priority)) + Ok(views.html.admin_main( + identity = Option(identity), + stage = config.facia.stage, + isDev = overrideIsDev(request, isDev), + bundleFilename = v1ConfigBundleHashedName, + displayV2Message = priority != "email", + priority = priority + )) } } } @@ -47,8 +67,13 @@ class ViewsController(val acl: Acl, assetsManager: AssetsManager, isDev: Boolean def configEditor() = (AccessAuthAction andThen new ConfigPermissionCheck(acl)) { request => val identity = request.user Cached(60) { - Ok(views.html.admin_main(Option(identity), config.facia.stage, overrideIsDev(request, isDev), - assetsManager.pathForConfig, false)) + Ok(views.html.admin_main( + identity = Option(identity), + stage = config.facia.stage, + isDev = overrideIsDev(request, isDev), + bundleFilename = v1CollectionsBundleHashedName, + displayV2Message = false + )) } } diff --git a/app/services/AssetsManager.scala b/app/services/AssetsManager.scala deleted file mode 100644 index c9803b2fab3..00000000000 --- a/app/services/AssetsManager.scala +++ /dev/null @@ -1,40 +0,0 @@ -package services - -import java.io.FileInputStream - -import conf.ApplicationConfiguration -import play.api.libs.functional.syntax._ -import play.api.libs.json.{JsError, JsPath, JsSuccess, Json} - - -class InvalidAssetsException(msg: String) extends RuntimeException(msg) - -object Bundles { - implicit val jsonRead = ( - (JsPath \ "config.js").read[String] and - (JsPath \ "collections.js").read[String] - )(Bundles.apply _) -} -case class Bundles (config: String, collections: String) - - -class AssetsManager(config: ApplicationConfiguration, isDev: Boolean) { - val filePath = "/etc/gu/facia-tool.assets-map.json" - val assetsMap: Option[Bundles] = if (isDev) None else Some(readFromPath(filePath)) - - private def readFromPath(path: String): Bundles = { - val stream = new FileInputStream(filePath) - val maybeJson = try { Json.parse(stream) } finally { stream.close() } - maybeJson.validate[Bundles] match { - case e: JsError => throw new InvalidAssetsException(s"JSON in $filePath does not match a valid Bundles") - case json: JsSuccess[Bundles] => json.getOrElse(throw new InvalidAssetsException(s"Invalid JSON Bundle in $filePath")) - } - } - - def pathForConfig: String = pathFor(assetsMap.map(_.config).getOrElse("")) - def pathForCollections: String = pathFor(assetsMap.map(_.collections).getOrElse("")) - - private def pathFor(hashedFileName: String): String = { - s"${config.cdn.basePath}$hashedFileName" - } -} diff --git a/app/views/admin_main.scala.html b/app/views/admin_main.scala.html index 88370a3133a..a928a52da40 100644 --- a/app/views/admin_main.scala.html +++ b/app/views/admin_main.scala.html @@ -1,4 +1,4 @@ -@(identity: Option[com.gu.pandomainauth.model.User] = None, stage: String, isDev: Boolean, bundlePath: String, displayV2Message: Boolean = false, priority: String = "") +@(identity: Option[com.gu.pandomainauth.model.User] = None, stage: String, isDev: Boolean, bundleFilename: String, displayV2Message: Boolean = false, priority: String = "") @import switchboard.SwitchManager @@ -9,14 +9,7 @@