forked from prismicio/scala-play-starter
/
Application.scala
58 lines (46 loc) · 1.8 KB
/
Application.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package controllers
import play.api._
import play.api.mvc._
import scala.concurrent._
import play.api.libs.concurrent.Execution.Implicits._
import io.prismic._
object Application extends Controller {
import Prismic._
// -- Resolve links to documents
def linkResolver(api: Api, ref: Option[String])(implicit request: RequestHeader) = DocumentLinkResolver(api) {
case (Fragment.DocumentLink(id, docType, tags, slug, false), maybeBookmarked) => routes.Application.detail(id, slug, ref).absoluteURL()
case (link@Fragment.DocumentLink(_, _, _, _, true), _) => routes.Application.brokenLink(ref).absoluteURL()
}
// -- Page not found
def PageNotFound(implicit ctx: Prismic.Context) = NotFound(views.html.pageNotFound())
def brokenLink(ref: Option[String]) = Prismic.action(ref) { implicit request =>
Future.successful(PageNotFound)
}
// -- Home page
def index(ref: Option[String]) = Prismic.action(ref) { implicit request =>
for {
someDocuments <- ctx.api.forms("everything").ref(ctx.ref).submit()
} yield {
Ok(views.html.index(someDocuments))
}
}
// -- Document detail
def detail(id: String, slug: String, ref: Option[String]) = Prismic.action(ref) { implicit request =>
for {
maybeDocument <- getDocument(id)
} yield {
checkSlug(maybeDocument, slug) {
case Left(newSlug) => MovedPermanently(routes.Application.detail(id, newSlug, ref).url)
case Right(document) => Ok(views.html.detail(document))
}
}
}
// -- Basic Search
def search(q: Option[String], ref: Option[String]) = Prismic.action(ref) { implicit request =>
for {
results <- ctx.api.forms("everything").query(s"""[[:d = fulltext(document, "${q.getOrElse("")}")]]""").ref(ctx.ref).submit()
} yield {
Ok(views.html.search(q, results))
}
}
}