lila/app/controllers/Relay.scala

82 lines
2.5 KiB
Scala
Raw Normal View History

2015-06-24 05:24:16 -06:00
package controllers
import play.api.data.Form
import play.api.libs.json._
2015-06-26 06:48:56 -06:00
import play.api.mvc._, Results._
2015-06-24 05:24:16 -06:00
import lila.api.Context
import lila.app._
import lila.relay.{ Relay => RelayModel }
import views._
object Relay extends LilaController {
private def env = Env.relay
private def relayNotFound(implicit ctx: Context) = NotFound(html.relay.notFound())
val index = Open { implicit ctx =>
2015-06-27 12:33:37 -06:00
env.api paginator getInt("page").|(1) map { relays =>
Ok(html.relay.home(relays))
2015-06-24 05:24:16 -06:00
}
}
def show(id: String, slug: String) = Open { implicit ctx =>
env.repo byId id flatMap {
_.fold(relayNotFound.fuccess) { relay =>
if (relay.slug != slug) Redirect(routes.Relay.show(id, relay.slug)).fuccess
2015-06-26 06:08:44 -06:00
else env.contentApi.byRelay(relay) flatMap { content =>
env.version(relay.id) zip
env.jsonView(relay, content) zip
chatOf(relay) map {
case ((version, data), chat) => html.relay.show(relay, content, version, data, chat)
}
2015-06-24 05:24:16 -06:00
}
} map NoCache
}
}
2015-06-26 06:48:56 -06:00
def atom = Action.async { implicit req =>
env.repo recent 100 flatMap { relays =>
env.contentApi byRelays relays map { contents =>
Ok(xml.relay.atom(relays, contents)) as XML
}
}
}
2015-06-26 06:08:44 -06:00
def contentForm(id: String, slug: String) = Secure(_.RelayContent) { implicit ctx =>
me =>
OptionFuOk(env.repo byId id) { relay =>
env.contentApi byRelay relay map { content =>
html.relay.contentForm(relay, content, lila.relay.ContentApi form content)
}
}
}
def contentPost(id: String, slug: String) = SecureBody(_.RelayContent) { implicit ctx =>
me =>
OptionFuResult(env.repo byId id) { relay =>
env.contentApi byRelay relay flatMap { content =>
implicit val req = ctx.body
lila.relay.ContentApi.form.bindFromRequest.fold(
err => BadRequest(html.relay.contentForm(relay, content, err)).fuccess,
2015-07-13 06:59:08 -06:00
data => env.contentApi.upsert(relay, data, me) >>
2015-07-15 06:17:47 -06:00
Env.mod.logApi.editRelay(me.id, relay.name) inject
2015-06-26 06:08:44 -06:00
Redirect(routes.Relay.show(relay.id, relay.slug))
)
}
}
}
2015-06-24 05:24:16 -06:00
def websocket(id: String, apiVersion: Int) = SocketOption[JsValue] { implicit ctx =>
(getInt("version") |@| get("sri")).tupled ?? {
case (version, uid) => env.socketHandler.join(id, version, uid, ctx.me)
}
}
private def chatOf(relay: RelayModel)(implicit ctx: Context) =
ctx.isAuth ?? {
Env.chat.api.userChat find relay.id map (_.forUser(ctx.me).some)
}
}