lila/modules/blog/src/main/BlogApi.scala

102 lines
2.9 KiB
Scala
Raw Normal View History

2014-05-31 13:03:04 -06:00
package lila.blog
import io.prismic._
import play.api.mvc.RequestHeader
2019-12-01 19:04:35 -07:00
import play.api.libs.ws.WSClient
2014-05-31 13:03:04 -06:00
2019-12-01 19:04:35 -07:00
import lila.common.config.MaxPerPage
2018-03-14 08:31:09 -06:00
import lila.common.paginator._
final class BlogApi(
2019-12-19 20:34:38 -07:00
config: BlogConfig
)(implicit ec: scala.concurrent.ExecutionContext, ws: WSClient) {
2014-05-31 13:03:04 -06:00
2019-12-19 20:34:38 -07:00
private def collection = config.collection
2019-12-13 07:30:20 -07:00
def recent(
api: Api,
page: Int,
maxPerPage: MaxPerPage,
ref: Option[String]
): Fu[Option[Paginator[Document]]] =
api
.forms(collection)
.ref(ref | api.master.ref)
2015-09-01 03:47:29 -06:00
.orderings(s"[my.$collection.date desc]")
2019-12-13 07:30:20 -07:00
.pageSize(maxPerPage.value)
.page(page)
.submit()
2019-12-19 20:34:38 -07:00
.fold(_ => none, some _)
.dmap2 { PrismicPaginator(_, page, maxPerPage) }
2019-12-21 12:34:42 -07:00
2019-12-13 07:30:20 -07:00
def recent(
prismic: BlogApi.Context,
page: Int,
maxPerPage: MaxPerPage,
ref: Option[String]
): Fu[Option[Paginator[Document]]] =
2019-12-08 10:35:26 -07:00
recent(prismic.api, page, maxPerPage, ref)
2014-05-31 13:03:04 -06:00
def one(api: Api, ref: Option[String], id: String): Fu[Option[Document]] =
2019-12-13 07:30:20 -07:00
api
.forms(collection)
2015-09-01 03:47:29 -06:00
.query(s"""[[:d = at(document.id, "$id")]]""")
2019-12-13 07:30:20 -07:00
.ref(ref | api.master.ref)
.submit() map (_.results.headOption)
2014-05-31 13:03:04 -06:00
def one(prismic: BlogApi.Context, id: String): Fu[Option[Document]] = one(prismic.api, prismic.ref.some, id)
2019-11-25 07:50:47 -07:00
def byYear(prismic: BlogApi.Context, year: Int): Fu[List[MiniPost]] = {
2019-12-13 07:30:20 -07:00
prismic.api
.forms(collection)
.ref(prismic.ref)
2019-11-25 07:50:47 -07:00
.query(s"[[date.year(my.$collection.date, $year)]]")
.orderings(s"[my.$collection.date desc]")
.pageSize(100) // prismic max
2019-12-13 07:30:20 -07:00
.submit()
.fold(_ => Nil, _.results flatMap MiniPost.fromDocument(collection, "wide"))
2019-11-25 07:50:47 -07:00
}
2019-12-13 07:30:20 -07:00
def context(
req: RequestHeader
)(implicit linkResolver: (Api, Option[String]) => DocumentLinkResolver): Fu[BlogApi.Context] = {
2014-05-31 13:03:04 -06:00
prismicApi map { api =>
val ref = resolveRef(api) {
2019-12-13 07:30:20 -07:00
req.cookies
.get(Prismic.previewCookie)
.map(_.value)
.orElse(req.queryString get "ref" flatMap (_.headOption) filter (_.nonEmpty))
}
2018-11-16 02:55:49 -07:00
BlogApi.Context(api, ref | api.master.ref, linkResolver(api, ref))
}
}
private def resolveRef(api: Api)(ref: Option[String]) =
ref.map(_.trim).filterNot(_.isEmpty) map { reqRef =>
api.refs.values.collectFirst {
case r if r.label == reqRef => r.ref
} getOrElse reqRef
2014-05-31 13:03:04 -06:00
}
2019-12-21 18:45:13 -07:00
private val prismicBuilder = new Prismic
2015-08-27 20:11:17 -06:00
2019-12-21 18:45:13 -07:00
def prismicApi = prismicBuilder.get(config.apiUrl)
2014-05-31 13:03:04 -06:00
}
object BlogApi {
def extract(body: Fragment.StructuredText): String =
body.blocks
.takeWhile(_.isInstanceOf[Fragment.StructuredText.Block.Paragraph])
2019-12-13 07:30:20 -07:00
.take(2)
.map {
case Fragment.StructuredText.Block.Paragraph(text, _, _) => s"<p>$text</p>"
2019-12-13 07:30:20 -07: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)
}
}