forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQaControllers.scala
63 lines (52 loc) · 2.4 KB
/
QaControllers.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
59
60
61
62
63
package controllers
import play.api._
import play.api.data.Form
import play.api.mvc._
import lila.api.Context
import lila.app._
import lila.qa.{ QuestionId, Question, AnswerId, Answer, QaAuth }
trait QaController extends LilaController {
protected def api = Env.qa.api
protected def forms = Env.qa.forms
protected def renderQuestion(q: Question, answerForm: Option[Form[_]] = None)(implicit ctx: Context): Fu[Result] =
(api.answer popular q.id) zip
fetchPopular zip
api.relation.questions(q, 10) zip
(QaAuth.canAsk ?? { forms.anyCaptcha map (_.some) }) flatMap {
case (((answers, popular), related), captcha) => fuccess {
Ok(views.html.qa.questionShow(q, answers, popular, related,
answerForm = if (QaAuth canAnswer q) answerForm orElse Some(forms.answer) else None,
captcha = captcha))
}
case _ => notFound
}
protected def renderN00b(implicit ctx: Context) = fetchPopular map { popular =>
Forbidden(views.html.qa.n00b(popular))
}
protected def WithQuestion(id: QuestionId)(block: Question => Fu[Result])(implicit ctx: Context): Fu[Result] =
OptionFuResult(api.question findById id)(block)
protected def WithQuestion(id: QuestionId, slug: String)(block: Question => Fu[Result])(implicit ctx: Context): Fu[Result] =
WithQuestion(id) { q =>
if (slug != q.slug) fuccess(Redirect {
controllers.routes.QaQuestion.show(id, q.slug)
})
else block(q)
}
protected def WithOwnQuestion(id: QuestionId)(block: Question => Fu[Result])(implicit ctx: Context): Fu[Result] =
WithQuestion(id) { q =>
if (QaAuth canEdit q) block(q)
else fuccess(Unauthorized)
}
protected def WithOwnQuestion(id: QuestionId, slug: String)(block: Question => Fu[Result])(implicit ctx: Context): Fu[Result] =
WithQuestion(id, slug) { q =>
if (QaAuth canEdit q) block(q)
else fuccess(Unauthorized)
}
protected def WithOwnAnswer(questionId: QuestionId, answerId: AnswerId)(block: Question => Answer => Fu[Result])(implicit ctx: Context): Fu[Result] =
api.question findById questionId zip (api.answer findById answerId) flatMap {
case (Some(q), Some(a)) if (QaAuth canEdit a) => block(q)(a)
case (Some(q), Some(a)) => fuccess(Unauthorized)
case _ => notFound
}
protected def fetchPopular = api.question popular 20
}