async autofollow and seenAt update on user restoration

This commit is contained in:
Thibault Duplessis 2013-06-02 14:21:59 +02:00
parent 5c4246ddc0
commit 49d322a481
3 changed files with 36 additions and 22 deletions

View file

@ -1,18 +1,18 @@
package controllers
import play.api.data.Form
import play.api.http._
import play.api.libs.iteratee.{ Iteratee, Enumerator }
import play.api.libs.json.{ Json, JsValue, Writes }
import play.api.mvc._, Results._
import play.api.mvc.WebSocket.FrameFormatter
import play.api.templates.Html
import scalaz.Zero
import lila.app._
import lila.common.LilaCookie
import lila.user.{ Context, HeaderContext, BodyContext, User UserModel }
import lila.security.{ Permission, Granter }
import scalaz.Zero
import play.api.mvc._, Results._
import play.api.mvc.WebSocket.FrameFormatter
import play.api.libs.iteratee.{ Iteratee, Enumerator }
import play.api.data.Form
import play.api.templates.Html
import play.api.http._
import play.api.libs.json.{ Json, JsValue, Writes }
import lila.user.{ Context, HeaderContext, BodyContext, User UserModel }
private[controllers] trait LilaController
extends Controller
@ -169,20 +169,19 @@ private[controllers] trait LilaController
Forbidden("no permission")
protected def reqToCtx(req: Request[_]): Fu[BodyContext] =
Env.security.api restoreUser req map { user
setOnline(user)
Context(req, user)
}
restoreUser(req) map { Context(req, _) }
protected def reqToCtx(req: RequestHeader): Fu[HeaderContext] =
Env.security.api restoreUser req map { user
setOnline(user)
Context(req, user)
}
restoreUser(req) map { Context(req, _) }
private def setOnline(user: Option[UserModel]) {
user foreach Env.user.setOnline
}
private def restoreUser(req: RequestHeader): Fu[Option[UserModel]] =
Env.security.api restoreUser req addEffect {
_ foreach { user
lila.user.UserRepo setSeenAt user.id
Env.user setOnline user
user.seenAt.isEmpty ?? Env.relation.autofollow(user)
}
}
protected def Reasonable(page: Int, max: Int = 40)(result: Fu[Result]): Fu[Result] =
(page < max).fold(result, BadRequest("resource too old").fuccess)

View file

@ -25,4 +25,14 @@ object $update {
def field[ID: Writes, A: InColl, B: Writes](id: ID, name: String, value: B, upsert: Boolean = false): Funit =
apply($select(id), $set(name -> value), upsert = upsert)
// UNCHECKED
def unchecked[A: InColl](selector: JsObject, update: JsObject, upsert: Boolean = false, multi: Boolean = false) {
implicitly[InColl[A]].coll.uncheckedUpdate(selector, update, upsert, multi)
}
def fieldUnchecked[ID: Writes, A: InColl, B: Writes](id: ID, name: String, value: B, upsert: Boolean = false) {
unchecked($select(id), $set(name -> value), upsert = upsert)
}
}

View file

@ -152,6 +152,10 @@ object UserRepo {
}
}
def setSeenAt(id: ID) {
$update.fieldUnchecked(id, "seenAt", $date(DateTime.now))
}
def idsAverageElo(ids: Iterable[String]): Fu[Int] = {
val command = MapReduce(
collectionName = userTube.coll.name,
@ -207,7 +211,8 @@ object UserRepo {
"drawH" -> 0
),
"enabled" -> true,
"createdAt" -> $date(DateTime.now))
"createdAt" -> $date(DateTime.now),
"seenAt" -> $date(DateTime.now))
}
private def hash(pass: String, salt: String): String = "%s{%s}".format(pass, salt).sha1