lila/app/controllers/QaControllers.scala
2017-02-14 16:34:07 +01:00

64 lines
2.3 KiB
Scala

package controllers
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] = for {
answers <- api.answer popular q.id
popular <- fetchPopular
related <- api.relation questions q
captcha <- QaAuth.canAsk ?? { forms.anyCaptcha map (_.some) }
_ <- Env.user.lightUserApi preloadMany answers.flatMap(_.userIds)
} yield Ok(
views.html.qa.questionShow(
q, answers, popular, related,
answerForm = (QaAuth canAnswer q) option { answerForm | forms.answer },
captcha = captcha
)
)
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
}