moar user refactoring

pull/83/head
Thibault Duplessis 2013-03-20 15:23:41 +01:00
parent de96562a2c
commit 5c89ded11e
6 changed files with 153 additions and 144 deletions

View File

@ -0,0 +1,125 @@
package controllers
import lila.app._
import views._
import lila.security.Permission
import lila.user.{ Context, GameFilterMenu, User UserModel }
import lila.http.LilaCookie
import lila.user.Env.{ current => userEnv }
import play.api.mvc._
import play.api.mvc.Results._
object User extends LilaController {
private def userRepo = userEnv.userRepo
private def paginator = userEnv.paginator
// private def gamePaginator = env.game.paginator
private def forms = lila.user.DataForm
private def eloUpdater = userEnv.eloUpdater
// private def bookmarkApi = env.bookmark.api
private def securityStore = securityEnv.store
// private def modApi = env.mod.api
def show(username: String) = showFilter(username, "all", 1)
def showFilter(username: String, filterName: String, page: Int) = Open { implicit ctx
Async {
Akka.future {
(page < 50).fold(
IOptionIOk(userRepo byId username) { userShow(_, filterName, page) },
BadRequest("too old")
)
}
}
}
private def userShow(u: UserModel, filterName: String, page: Int)(implicit ctx: Context) =
(u.enabled || isGranted(_.MarkEngine)).fold({
val userSpy = isGranted(_.UserSpy) option securityStore.userSpy _
userEnvInfo(u, bookmarkApi, userSpy, ctx) map { info
val filters = GameFilterMenu(info, ctx.me, filterName)
val paginator = filters.query.fold(bookmarkApi.gamePaginatorByUser(u, page)) { query
gamePaginator.recentlyCreated(query, filters.cachedNb)(page)
}
html.user.show(u, info, paginator, filters)
}
}, io(html.user.disabled(u)))
// def list(page: Int) = Open { implicit ctx
// (page < 50).fold(
// IOk(onlineUsers map { html.user.list(paginator elo page, _) }),
// BadRequest("too old")
// )
// }
// val online = Open { implicit ctx
// IOk(onlineUsers map { html.user.online(_) })
// }
// val autocomplete = Action { implicit req
// get("term", req).filter(""!=).fold(BadRequest("No search term provided"): PlainResult) { term
// JsonOk((userRepo usernamesLike term).unsafePerformIO)
// }
// }
// val getBio = Auth { ctx me Ok(me.bio) }
// val setBio = AuthBody { ctx
// me
// implicit val req = ctx.body
// JsonIOk(forms.bio.bindFromRequest.fold(
// f putStrLn(f.errors.toString) map { _ me.bio | "" },
// bio userRepo.setBio(me, bio) map { _ bio }
// ) map { bio Map("bio" -> bio) })
// }
// val passwd = Auth { implicit ctx
// me
// Ok(html.user.passwd(me, forms.passwd))
// }
// val passwdApply = AuthBody { implicit ctx
// me
// implicit val req = ctx.body
// FormIOResult(forms.passwd) { err
// html.user.passwd(me, err)
// } { passwd
// for {
// ok userRepo.checkPassword(me.username, passwd.oldPasswd)
// _ userRepo.passwd(me, passwd.newPasswd1) map (_ ()) doIf ok
// } yield ok.fold(
// Redirect(routes.User show me.username),
// BadRequest(html.user.passwd(me, forms.passwd))
// )
// }
// }
// val close = Auth { implicit ctx
// me
// Ok(html.user.close(me))
// }
// val closeConfirm = Auth { ctx
// me
// implicit val req = ctx.req
// IOResult {
// (userRepo disable me) >>
// env.team.api.quitAll(me.id) >>
// (securityEnv.store deleteUsername me.username) inject {
// Redirect(routes.User show me.username) withCookies LilaCookie.newSession
// }
// }
// }
// def export(username: String) = Open { implicit ctx
// IOptionIOResult(userRepo byId username) { u
// env.game.export(u).apply map { path
// Redirect(path)
// }
// }
// }
// private val onlineUsers: IO[List[UserModel]] =
// userRepo byIds userEnv.usernameMemo.keys
}

View File

@ -1,23 +1,22 @@
package lila.app
package user
package helper
import lila.user.{ User, Users }
import lila.user.Env.{ current userEnv }
import core.CoreEnv
import controllers.routes
import play.api.templates.Html
trait UserHelper {
protected def env: CoreEnv
private def cached = env.user.cached
private def usernameMemo = env.user.usernameMemo
import userEnv._
def userIdToUsername(userId: String): String =
cached usernameOrAnonymous userId
def userIdToUsername(userId: Option[String]): String =
userId.fold(User.anonymous)(cached.usernameOrAnonymous)
userId.fold(Users.anonymous)(cached.usernameOrAnonymous)
def isUsernameOnline(username: String) = usernameMemo get username
@ -25,7 +24,7 @@ trait UserHelper {
userId: Option[String],
cssClass: Option[String] = None,
withOnline: Boolean = true): Html = Html {
(userId flatMap cached.username).fold(User.anonymous) { username
(userId flatMap cached.username).fold(Users.anonymous) { username
"""<a class="user_link%s%s" href="%s">%s</a>""".format(
withOnline.fold(
isUsernameOnline(username).fold(" online", " offline"),
@ -60,7 +59,7 @@ trait UserHelper {
~cssClass.map(" " + _),
routes.User.show(user.username),
text | withElo.fold(user.usernameWithElo, user.username)
)
)
}
def userInfosLink(

View File

@ -10,3 +10,17 @@ POST /cli controllers.Cli.command
# Assets
GET /assets/*file controllers.Assets.at(path="/public", file)
# User
# POST /@/:username/export controllers.User.export(username: String)
# GET /@/:username/:filterName controllers.User.showFilter(username: String, filterName: String, page: Int ?= 1)
GET /@/:username controllers.User.show(username: String)
# GET /people controllers.User.list(page: Int ?= 1)
# GET /people/autocomplete controllers.User.autocomplete
# GET /people/online controllers.User.online
# GET /account/bio controllers.User.getBio
# PUT /account/bio.json controllers.User.setBio
# GET /account/passwd controllers.User.passwd
# POST /account/passwd controllers.User.passwdApply
# GET /account/close controllers.User.close
# POST /account/closeConfirm controllers.User.closeConfirm

View File

@ -1,5 +1,4 @@
package lila.app
package user
package lila.game
import http.Context
import game.Query

View File

@ -1,19 +1,17 @@
package lila.notification
import lila.user.{ User, UserHelper }
import lila.notification.Env.{ current notificationEnv }
import play.api.templates.Html
import play.api.mvc.Call
trait NotificationHelper {
protected def env: CoreEnv
private def api = env.notificationApi
trait NotificationHelper {
def notifications(user: User): Html = {
val notifs = api get user.id take 2 map { notif =>
views.html.notification.view(notif.id, notif.from)(Html(notif.html))
}
val notifs = notificationEnv.api get user.id take 2 map { notif
views.html.notification.view(notif.id, notif.from)(Html(notif.html))
}
notifs.foldLeft(Html(""))(_ += _)
}
}

View File

@ -1,126 +0,0 @@
package controllers
import lila.app._
import views._
import security.Permission
import user.{ GameFilter, User UserModel }
import http.{ Context, LilaCookie }
import play.api.mvc._
import play.api.mvc.Results._
import scalaz.effects._
import play.api.libs.concurrent.Akka
object User extends LilaController {
private def userRepo = env.user.userRepo
private def paginator = env.user.paginator
private def gamePaginator = env.game.paginator
private def forms = user.DataForm
private def eloUpdater = env.user.eloUpdater
private def bookmarkApi = env.bookmark.api
private def securityStore = env.security.store
private def modApi = env.mod.api
def show(username: String) = showFilter(username, "all", 1)
def showFilter(username: String, filterName: String, page: Int) = Open { implicit ctx
Async {
Akka.future {
(page < 50).fold(
IOptionIOk(userRepo byId username) { userShow(_, filterName, page) },
BadRequest("too old")
)
}
}
}
private def userShow(u: UserModel, filterName: String, page: Int)(implicit ctx: Context) =
(u.enabled || isGranted(_.MarkEngine)).fold({
val userSpy = isGranted(_.UserSpy) option securityStore.userSpy _
env.userInfo(u, bookmarkApi, userSpy, ctx) map { info
val filters = user.GameFilterMenu(info, ctx.me, filterName)
val paginator = filters.query.fold(bookmarkApi.gamePaginatorByUser(u, page)) { query
gamePaginator.recentlyCreated(query, filters.cachedNb)(page)
}
html.user.show(u, info, paginator, filters)
}
}, io(html.user.disabled(u)))
def list(page: Int) = Open { implicit ctx
(page < 50).fold(
IOk(onlineUsers map { html.user.list(paginator elo page, _) }),
BadRequest("too old")
)
}
val online = Open { implicit ctx
IOk(onlineUsers map { html.user.online(_) })
}
val autocomplete = Action { implicit req
get("term", req).filter(""!=).fold(BadRequest("No search term provided"): PlainResult) { term
JsonOk((userRepo usernamesLike term).unsafePerformIO)
}
}
val getBio = Auth { ctx me Ok(me.bio) }
val setBio = AuthBody { ctx
me
implicit val req = ctx.body
JsonIOk(forms.bio.bindFromRequest.fold(
f putStrLn(f.errors.toString) map { _ me.bio | "" },
bio userRepo.setBio(me, bio) map { _ bio }
) map { bio Map("bio" -> bio) })
}
val passwd = Auth { implicit ctx
me
Ok(html.user.passwd(me, forms.passwd))
}
val passwdApply = AuthBody { implicit ctx
me
implicit val req = ctx.body
FormIOResult(forms.passwd) { err
html.user.passwd(me, err)
} { passwd
for {
ok userRepo.checkPassword(me.username, passwd.oldPasswd)
_ userRepo.passwd(me, passwd.newPasswd1) map (_ ()) doIf ok
} yield ok.fold(
Redirect(routes.User show me.username),
BadRequest(html.user.passwd(me, forms.passwd))
)
}
}
val close = Auth { implicit ctx
me
Ok(html.user.close(me))
}
val closeConfirm = Auth { ctx
me
implicit val req = ctx.req
IOResult {
(userRepo disable me) >>
env.team.api.quitAll(me.id) >>
(env.security.store deleteUsername me.username) inject {
Redirect(routes.User show me.username) withCookies LilaCookie.newSession
}
}
}
def export(username: String) = Open { implicit ctx
IOptionIOResult(userRepo byId username) { u
env.game.export(u).apply map { path
Redirect(path)
}
}
}
private val onlineUsers: IO[List[UserModel]] =
userRepo byIds env.user.usernameMemo.keys
}