app/story_packages/services/AssetsManager.scala (30 lines of code) (raw):
package story_packages.services
import conf.ApplicationConfiguration
import play.api.libs.json.Reads._
import play.api.libs.json._
import scala.io.Source
class InvalidAssetsException(msg: String) extends RuntimeException(msg)
object Bundles {
implicit object bundleReads extends Reads[Bundles] {
override def reads(json: JsValue): JsResult[Bundles] = {
(json \ "packages.js").validate[String].map(Bundles(_))
}
}
}
case class Bundles (packages: String)
class AssetsManager(config: ApplicationConfiguration, isDev: Boolean) {
val resourcePath = "public/story-packages/bundles/assets-map.json"
val assetsMap = if (isDev) None else Some(readFromPath(resourcePath))
private def readFromPath(path: String): Bundles = {
val assetsMapSource = Source.fromResource(path)
val maybeJson = Json.parse(assetsMapSource.mkString)
maybeJson.validate[Bundles] match {
case e: JsError => throw new InvalidAssetsException(s"JSON in $resourcePath does not match a valid Bundles: $e")
case json: JsSuccess[Bundles] => json.getOrElse(throw new InvalidAssetsException(s"Invalid JSON Bundle in $resourcePath"))
}
}
def pathForPackages: String = pathFor(assetsMap.map(_.packages).getOrElse(""))
private def pathFor(hashedFileName: String): String = {
s"/assets/story-packages/bundles/$hashedFileName"
}
}