2014-05-31 13:03:04 -06:00
|
|
|
package lila.blog
|
|
|
|
|
|
|
|
import io.prismic._
|
2018-11-16 02:49:47 -07:00
|
|
|
import play.api.mvc.RequestHeader
|
2015-08-27 20:11:17 -06:00
|
|
|
import scala.concurrent.duration._
|
2014-05-31 13:03:04 -06:00
|
|
|
|
2018-03-14 08:31:09 -06:00
|
|
|
import lila.common.MaxPerPage
|
|
|
|
import lila.common.paginator._
|
|
|
|
|
2017-01-26 15:22:12 -07:00
|
|
|
final class BlogApi(
|
2017-01-28 11:51:51 -07:00
|
|
|
asyncCache: lila.memo.AsyncCache.Builder,
|
2017-01-26 15:22:12 -07:00
|
|
|
prismicUrl: String,
|
2017-02-14 08:34:07 -07:00
|
|
|
collection: String
|
|
|
|
) {
|
2014-05-31 13:03:04 -06:00
|
|
|
|
2018-03-14 08:31:09 -06:00
|
|
|
def recent(api: Api, ref: Option[String], page: Int, maxPerPage: MaxPerPage): Fu[Option[Paginator[Document]]] =
|
2018-11-16 02:49:47 -07:00
|
|
|
api.forms(collection).ref(ref | api.master.ref)
|
2015-09-01 03:47:29 -06:00
|
|
|
.orderings(s"[my.$collection.date desc]")
|
2018-03-14 08:31:09 -06:00
|
|
|
.pageSize(maxPerPage.value).page(page).submit().fold(_ => none, some _) map2 { (res: Response) =>
|
|
|
|
PrismicPaginator(res, page, maxPerPage)
|
|
|
|
}
|
2018-11-16 02:49:47 -07:00
|
|
|
def recent(prismic: BlogApi.Context, page: Int, maxPerPage: MaxPerPage): Fu[Option[Paginator[Document]]] =
|
|
|
|
recent(prismic.api, prismic.ref.some, page, maxPerPage)
|
2014-05-31 13:03:04 -06:00
|
|
|
|
2018-11-16 02:49:47 -07:00
|
|
|
def one(api: Api, ref: Option[String], id: String): Fu[Option[Document]] =
|
2015-09-01 03:47:29 -06:00
|
|
|
api.forms(collection)
|
|
|
|
.query(s"""[[:d = at(document.id, "$id")]]""")
|
2018-11-16 02:49:47 -07:00
|
|
|
.ref(ref | api.master.ref).submit() map (_.results.headOption)
|
2014-05-31 13:03:04 -06:00
|
|
|
|
2018-11-16 02:49:47 -07:00
|
|
|
def one(prismic: BlogApi.Context, id: String): Fu[Option[Document]] = one(prismic.api, prismic.ref.some, id)
|
|
|
|
|
|
|
|
def context(req: RequestHeader)(implicit linkResolver: (Api, Option[String]) => DocumentLinkResolver) = {
|
2014-05-31 13:03:04 -06:00
|
|
|
prismicApi map { api =>
|
2018-11-16 02:49:47 -07:00
|
|
|
val ref = resolveRef(api) {
|
|
|
|
req.cookies.get(Prismic.previewCookie).map(_.value)
|
|
|
|
.orElse(req.queryString get "ref" flatMap (_.headOption) filter (_.nonEmpty))
|
|
|
|
}
|
|
|
|
BlogApi.Context(api, ref.pp | api.master.ref, linkResolver(api, ref))
|
2016-03-23 21:51:51 -06:00
|
|
|
}
|
2018-11-16 02:49:47 -07:00
|
|
|
}
|
2016-03-23 21:51:51 -06:00
|
|
|
|
|
|
|
private def resolveRef(api: Api)(ref: Option[String]) =
|
2018-11-16 02:49:47 -07:00
|
|
|
ref.map(_.trim).filterNot(_.isEmpty) map { reqRef =>
|
2016-03-23 21:51:51 -06:00
|
|
|
api.refs.values.collectFirst {
|
|
|
|
case r if r.label == reqRef => r.ref
|
2018-11-16 02:49:47 -07:00
|
|
|
} getOrElse reqRef
|
2014-05-31 13:03:04 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
private val cache = BuiltInCache(200)
|
2016-03-20 03:31:09 -06:00
|
|
|
private val prismicLogger = (level: Symbol, message: String) => level match {
|
|
|
|
case 'DEBUG => logger debug message
|
|
|
|
case 'ERROR => logger error message
|
2017-02-14 08:34:07 -07:00
|
|
|
case _ => logger info message
|
2014-05-31 13:03:04 -06:00
|
|
|
}
|
|
|
|
|
2017-01-26 15:22:12 -07:00
|
|
|
private val fetchPrismicApi = asyncCache.single[Api](
|
2016-11-27 22:52:56 -07:00
|
|
|
name = "blogApi.fetchPrismicApi",
|
2016-03-20 03:31:09 -06:00
|
|
|
f = Api.get(prismicUrl, cache = cache, logger = prismicLogger),
|
2017-02-14 08:34:07 -07:00
|
|
|
expireAfter = _.ExpireAfterWrite(15 seconds)
|
|
|
|
)
|
2015-08-27 20:11:17 -06:00
|
|
|
|
2017-01-26 15:22:12 -07:00
|
|
|
def prismicApi = fetchPrismicApi.get
|
2014-05-31 13:03:04 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
object BlogApi {
|
|
|
|
|
2018-11-16 02:49:47 -07:00
|
|
|
def extract(body: fragments.StructuredText): String =
|
2014-05-31 14:50:04 -06:00
|
|
|
body.blocks
|
|
|
|
.takeWhile(_.isInstanceOf[Fragment.StructuredText.Block.Paragraph])
|
|
|
|
.take(2).map {
|
2018-11-16 02:49:47 -07:00
|
|
|
case Fragment.StructuredText.Block.Paragraph(text, _, _, _) => s"<p>$text</p>"
|
2014-05-31 14:50:04 -06:00
|
|
|
case _ => ""
|
|
|
|
}.mkString
|
|
|
|
|
2014-05-31 13:03:04 -06:00
|
|
|
case class Context(api: Api, ref: String, linkResolver: DocumentLinkResolver) {
|
|
|
|
def maybeRef = Option(ref).filterNot(_ == api.master.ref)
|
|
|
|
}
|
|
|
|
}
|