moar user refactoring
parent
de96562a2c
commit
5c89ded11e
|
@ -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
|
||||
}
|
|
@ -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(
|
14
conf/routes
14
conf/routes
|
@ -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
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
package lila.app
|
||||
package user
|
||||
package lila.game
|
||||
|
||||
import http.Context
|
||||
import game.Query
|
|
@ -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(""))(_ += _)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue