package app import model.Account import org.scalatra._ import org.scalatra.json._ import org.json4s._ import jp.sf.amateras.scalatra.forms._ import service._ /** * Provides generic features for ScalatraServlet implementations. */ abstract class ControllerBase extends ScalatraFilter with ClientSideValidationFormSupport with JacksonJsonSupport { implicit val jsonFormats = DefaultFormats /** * Returns the context object for the request. */ implicit def context: Context = Context(servletContext.getContextPath, LoginAccount) private def LoginAccount: Option[Account] = { session.get("LOGIN_ACCOUNT") match { case Some(x: Account) => Some(x) case _ => None } } /** * Allows only the repository owner and administrators. */ protected def ownerOnly(action: => Any) = { { context.loginAccount match { case Some(x) if(x.userType == AccountService.Administrator) => action case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action case _ => redirect("/signin") } } } /** * Allows only the repository owner and administrators. */ protected def ownerOnly[T](action: T => Any) = { (form: T) => { context.loginAccount match { case Some(x) if(x.userType == AccountService.Administrator) => action(form) case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form) case _ => redirect("/signin") } } } /** * Allows only signed in users. */ protected def usersOnly(action: => Any) = { { context.loginAccount match { case Some(x) => action case None => redirect("/signin") } } } /** * Allows only signed in users. */ protected def usersOnly[T](action: T => Any) = { (form: T) => { context.loginAccount match { case Some(x) => action(form) case None => redirect("/signin") } } } // /** // * Allows only collaborators and administrators. // */ // protected def collaboratorsOnly(action: => Any) = { // { // context.loginAccount match { // case Some(x) if(x.userType == AccountService.Administrator) => action // case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action // case Some(x) => { // val paths = request.getRequestURI.split("/") // if(getCollaborators(paths(1), paths(2)).contains(x.userName)){ // action // } else { // redirect("/signin") // } // } // case None => redirect("/signin") // } // } // } // // /** // * Allows only collaborators and administrators. // */ // protected def collaboratorsOnly[T](action: T => Any) = { // (form: T) => { // context.loginAccount match { // case Some(x) if(x.userType == AccountService.Administrator) => action(form) // case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form) // case Some(x) => { // val paths = request.getRequestURI.split("/") // if(getCollaborators(paths(1), paths(2)).contains(x.userName)){ // action(form) // } else { // redirect("/signin") // } // } // case None => redirect("/signin") // } // } // } // protected def adminOnly() } case class Context(path: String, loginAccount: Option[Account])