Newer
Older
gitbucket_jkp / src / main / scala / app / UsersController.scala
@takezoe takezoe on 4 Jun 2013 2 KB Add authentication.
package app

import model._
import service._
import util.AdminOnlyAuthenticator
import jp.sf.amateras.scalatra.forms._

class UsersController extends UsersControllerBase with AccountService with AdminOnlyAuthenticator

trait UsersControllerBase extends ControllerBase { self: AccountService with AdminOnlyAuthenticator =>
  
  // TODO ユーザ名の先頭に_は使えないようにする&利用可能文字チェック
  case class UserForm(userName: String, password: String, mailAddress: String, userType: Int, url: Option[String])
  
  val newForm = mapping(
    "userName"    -> trim(label("Username"     , text(required, maxlength(100), unique))), 
    "password"    -> trim(label("Password"     , text(required, maxlength(100)))),
    "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))),
    "userType"    -> trim(label("User Type"    , number())),
    "url"         -> trim(label("URL"          , optional(text(maxlength(200)))))
  )(UserForm.apply)

  val editForm = mapping(
    "userName"    -> trim(label("Username"     , text())), 
    "password"    -> trim(label("Password"     , text(required, maxlength(100)))),
    "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))),
    "userType"    -> trim(label("User Type"    , number())),
    "url"         -> trim(label("URL"          , optional(text(maxlength(200)))))
  )(UserForm.apply)
  
  get("/admin/users")(adminOnly {
    admin.html.userlist(getAllUsers())
  })
  
  get("/admin/users/_new")(adminOnly {
    admin.html.useredit(None)
  })
  
  post("/admin/users/_new", newForm)(adminOnly { form =>
    val currentDate = new java.sql.Date(System.currentTimeMillis)
    createAccount(Account(
        userName       = form.userName, 
        password       = form.password, 
        mailAddress    = form.mailAddress, 
        userType       = form.userType, 
        url            = form.url, 
        registeredDate = currentDate, 
        updatedDate    = currentDate, 
        lastLoginDate  = None))
        
    redirect("/admin/users")
  })
  
  get("/admin/users/:userName/_edit")(adminOnly {
    val userName = params("userName")
    admin.html.useredit(getAccountByUserName(userName))
  })
  
  post("/admin/users/:name/_edit", editForm)(adminOnly { form =>
    val userName = params("userName")
    val currentDate = new java.sql.Date(System.currentTimeMillis)
    updateAccount(getAccountByUserName(userName).get.copy(
        password       = form.password, 
        mailAddress    = form.mailAddress, 
        userType       = form.userType, 
        url            = form.url, 
        updatedDate    = currentDate))
    
    redirect("/admin/users")
  })
  
  def unique: Constraint = new Constraint(){
    def validate(name: String, value: String): Option[String] =
      getAccountByUserName(value).map { _ => "User already exists." }
  }  
  
}