lila/app/controllers/Prismic.scala
Thibault Duplessis 6bc20d9b75 app/ migration WIP
2019-12-04 19:47:46 -06:00

63 lines
1.8 KiB
Scala

package controllers
import scala.concurrent.duration._
import io.prismic.{ Api => PrismicApi, _ }
import lila.app._
final class Prismic(
env: Env
)(implicit ws: play.api.libs.ws.WSClient) {
private val logger = lila.log("prismic")
val prismicLogger = (level: Symbol, message: String) => level match {
case Symbol("DEBUG") => logger debug message
case Symbol("ERROR") => logger error message
case _ => logger info message
}
private val prismicApiCache = env.memo.asyncCache.single[PrismicApi](
name = "prismic.fetchPrismicApi",
f = PrismicApi.get(env.api.config.prismicApiUrl, logger = prismicLogger),
expireAfter = _.ExpireAfterWrite(1 minute)
)
def prismicApi = prismicApiCache.get
implicit def makeLinkResolver(prismicApi: PrismicApi, ref: Option[String] = None) =
DocumentLinkResolver(prismicApi) {
case (link, _) => routes.Blog.show(link.id, link.slug, ref).url
case _ => routes.Lobby.home.url
}
def getDocument(id: String): Fu[Option[Document]] = prismicApi flatMap { api =>
api.forms("everything")
.query(s"""[[:d = at(document.id, "$id")]]""")
.ref(api.master.ref)
.submit() map {
_.results.headOption
}
}
def getBookmark(name: String) = prismicApiCache.get flatMap { api =>
api.bookmarks.get(name) ?? getDocument map2 { (doc: io.prismic.Document) =>
doc -> makeLinkResolver(api)
}
} recover {
case e: Exception =>
logger.error(s"bookmark:$name", e)
lila.mon.http.prismic.timeout()
none
}
def getVariant(variant: chess.variant.Variant) = prismicApi flatMap { api =>
api.forms("variant")
.query(s"""[[:d = at(my.variant.key, "${variant.key}")]]""")
.ref(api.master.ref)
.submit() map {
_.results.headOption map (_ -> makeLinkResolver(api))
}
}
}