Learning-HTMX/16-countries-page-from-api/src/main/scala/example/Routes.scala

62 lines
1.7 KiB
Scala

package example
import cask.model.Response
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver
import org.thymeleaf.TemplateEngine
import org.thymeleaf.context.Context
import org.thymeleaf.templatemode.TemplateMode
import scala.jdk.CollectionConverters._
import cask.model.Request
case class Routes(countries: List[Country])(implicit
cc: castor.Context,
log: cask.Logger
) extends cask.Routes {
def buildTemplateEngine(): TemplateEngine = {
val templateResolver = new ClassLoaderTemplateResolver()
templateResolver.setTemplateMode(TemplateMode.HTML)
templateResolver.setPrefix("/templates/")
templateResolver.setSuffix(".html")
templateResolver.setCacheTTLMs(3600000L);
val templateEngine = new TemplateEngine()
templateEngine.setTemplateResolver(templateResolver)
templateEngine
}
val engine: TemplateEngine = buildTemplateEngine()
@cask.get("/")
def indexPage(region: Option[String] = None) = {
val context = new Context()
val regions = countries.map(_.region).distinct.sorted.asJava
val selectedCountries = region match {
case None => countries
case Some(selectedRegion) => countries.filter(_.region == selectedRegion)
}
context.setVariable("regionsSet", regions)
context.setVariable("countriesList", selectedCountries.asJava)
context.setVariable("selectedRegion", region.getOrElse(""))
val indexPage = engine.process("index", context)
Response(
indexPage,
headers = Seq("Content-Type" -> "text/html; charset=utf-8")
)
}
@cask.post("/do-thing")
def doThing(request: cask.Request) = {
request.text().reverse
}
@cask.staticResources("public")
def giveStaticResources() = "public"
initialize()
}