Skip to content

Instantly share code, notes, and snippets.

@rssh
Created July 18, 2012 06:45
Show Gist options
  • Save rssh/3134651 to your computer and use it in GitHub Desktop.
Save rssh/3134651 to your computer and use it in GitHub Desktop.
GobAction simplicified with commented out variants.
package controllers
import models.Account
import play.api.mvc._
import org.bson.types.ObjectId
import play.api.mvc.Results._
import play.api.i18n.Messages
object JobAction {
def apply(f: JobRequest => Result) = process(mustBeAuthenticated=false)(f)
def authenticated = process(mustBeAuthenticated=true) _
def owner(id: ObjectId) = process(mustBeAuthenticated=true, optUserId = Option(id)) _
def admin = process(mustBeAuthenticated=true, mustBeAdmin=true) _
private def process(mustBeAuthenticated: Boolean, mustBeAdmin: Boolean = false, optUserId: Option[ObjectId] = None)(f: JobRequest => Result) = Action {
request =>
val account = request.session.get("accountId").flatMap(id => Account.find(new ObjectId(id)))
/*
if (id.isDefined && !(account.isDefined && (account.get.isAdmin || id.get == account.get.id)))
Redirect(routes.Application.login).flashing("error" -> Messages("error.no.rights"))
else if (isAuthenticated && !account.isDefined)
Redirect(routes.Application.login).flashing("error" -> Messages("error.must.login"))
else if (isAdmin && !account.map(a => a.isAdmin).getOrElse(false))
Redirect(routes.Application.login).flashing("error" -> Messages("error.must.be.admin"))
else
f(JobRequest(account, request))
*/
/*
findSessionAccount(request).map(
account => if (optUserId.exists( _ != account.id)) {
Redirect(routes.Application.login).flashing("error" -> Messages("error.no.rights"))
} else if (isAdmin && !account.isAdmin) {
Redirect(routes.Application.login).flashing("error" -> Messages("error.must.be.admin"))
} else {
f(JobRequest(Some(account), request))
}
).getOrElse(
if (isAuthenticated) {
Redirect(routes.Application.login).flashing("error" -> Messages("error.must.login"))
} else {
f(JobRequest(None, request))
}
)
*/
(findCurrentSessionAccount(request) match {
case Some(account) => if (optUserId.exists( _ != account.id)) {
Left("error.no.rights")
} else if (mustBeAdmin && !account.isAdmin) {
Left("error.must.be.admin")
} else {
Right(Some(account))
}
case None => if (mustBeAuthenticated) {
Left("error.must.login")
} else {
Right(None)
}
}) fold (
error => Redirect(routes.Application.login).flashing("error" -> Messages(error)),
account => f(JobRequest(account,request))
)
}
private def findCurrentSessionAccount(request: Request[AnyContent]): Option[Account] =
request.session.get("accountId").flatMap(id => Account.find(new ObjectId(id)))
}
case class JobRequest(account: Option[Account], request: Request[AnyContent]) extends WrappedRequest(request)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment