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

67 lines
2.1 KiB
Scala
Raw Normal View History

2014-05-31 13:03:04 -06:00
package lila.blog
import io.prismic._
2015-08-27 20:11:17 -06:00
import scala.concurrent.duration._
2014-05-31 13:03:04 -06:00
final class BlogApi(
asyncCache: lila.memo.AsyncCache.Builder,
prismicUrl: String,
collection: String
) {
2014-05-31 13:03:04 -06:00
def recent(api: Api, ref: Option[String], nb: Int): Fu[Option[Response]] =
api.forms(collection).ref(resolveRef(api)(ref) | api.master.ref)
2015-09-01 03:47:29 -06:00
.orderings(s"[my.$collection.date desc]")
.pageSize(nb).page(1).submit().fold(_ => none, some _)
2014-05-31 13:03:04 -06:00
def one(api: Api, ref: Option[String], id: String) =
2015-09-01 03:47:29 -06:00
api.forms(collection)
.query(s"""[[:d = at(document.id, "$id")]]""")
.ref(resolveRef(api)(ref) | api.master.ref).submit() map (_.results.headOption)
2014-05-31 13:03:04 -06:00
// -- Build a Prismic context
def context(refName: Option[String])(implicit linkResolver: (Api, Option[String]) => DocumentLinkResolver) =
2014-05-31 13:03:04 -06:00
prismicApi map { api =>
val ref = resolveRef(api)(refName)
BlogApi.Context(api, ref | api.master.ref, linkResolver(api, ref))
}
private def resolveRef(api: Api)(ref: Option[String]) =
ref.map(_.trim).filterNot(_.isEmpty).flatMap { reqRef =>
api.refs.values.collectFirst {
case r if r.label == reqRef => r.ref
case r if r.ref == reqRef => r.ref
}
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
case _ => logger info message
2014-05-31 13:03:04 -06:00
}
private val fetchPrismicApi = asyncCache.single[Api](
name = "blogApi.fetchPrismicApi",
2016-03-20 03:31:09 -06:00
f = Api.get(prismicUrl, cache = cache, logger = prismicLogger),
expireAfter = _.ExpireAfterWrite(15 seconds)
)
2015-08-27 20:11:17 -06:00
def prismicApi = fetchPrismicApi.get
2014-05-31 13:03:04 -06:00
}
object BlogApi {
def extract(body: Fragment.StructuredText): String =
body.blocks
.takeWhile(_.isInstanceOf[Fragment.StructuredText.Block.Paragraph])
.take(2).map {
case Fragment.StructuredText.Block.Paragraph(text, _, _) => s"<p>$text</p>"
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)
}
}