diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index 16a75c2..9fa0956 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -16,15 +16,15 @@ case class AccountEditForm(password: Option[String], mailAddress: String, url: Option[String]) val newForm = mapping( - "userName" -> trim(label("User name" , text(required, maxlength(100), identifier, unique))), + "userName" -> trim(label("User name" , text(required, maxlength(100), identifier, uniqueUserName))), "password" -> trim(label("Password" , text(required, maxlength(20)))), - "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))), + "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100), uniqueMailAddress()))), "url" -> trim(label("URL" , optional(text(maxlength(200))))) )(AccountNewForm.apply) val editForm = mapping( "password" -> trim(label("Password" , optional(text(maxlength(20))))), - "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))), + "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100), uniqueMailAddress("userName")))), "url" -> trim(label("URL" , optional(text(maxlength(200))))) )(AccountEditForm.apply) @@ -67,9 +67,18 @@ } else NotFound } - private def unique: Constraint = new Constraint(){ + // TODO Merge with UserManagementController + private def uniqueUserName: Constraint = new Constraint(){ def validate(name: String, value: String): Option[String] = getAccountByUserName(value).map { _ => "User already exists." } } + // TODO Merge with UserManagementController + private def uniqueMailAddress(paramName: String = ""): Constraint = new Constraint(){ + def validate(name: String, value: String): Option[String] = + getAccountByMailAddress(value) + .filter { x => if(paramName.isEmpty) true else Some(x.userName) != params.get(paramName) } + .map { _ => "Mail address is already registered." } + } + } diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index 850ca3e..f05062f 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -13,9 +13,9 @@ case class UserEditForm(userName: String, password: Option[String], mailAddress: String, isAdmin: Boolean, url: Option[String]) val newForm = mapping( - "userName" -> trim(label("Username" , text(required, maxlength(100), identifier, unique))), + "userName" -> trim(label("Username" , text(required, maxlength(100), identifier, uniqueUserName))), "password" -> trim(label("Password" , text(required, maxlength(20)))), - "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))), + "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100), uniqueMailAddress()))), "isAdmin" -> trim(label("User Type" , boolean())), "url" -> trim(label("URL" , optional(text(maxlength(200))))) )(UserNewForm.apply) @@ -23,7 +23,7 @@ val editForm = mapping( "userName" -> trim(label("Username" , text(required, maxlength(100), identifier))), "password" -> trim(label("Password" , optional(text(maxlength(20))))), - "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))), + "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100), uniqueMailAddress("userName")))), "isAdmin" -> trim(label("User Type" , boolean())), "url" -> trim(label("URL" , optional(text(maxlength(200))))) )(UserEditForm.apply) @@ -59,9 +59,18 @@ } getOrElse NotFound }) - private def unique: Constraint = new Constraint(){ + // TODO Merge with AccountController? + private def uniqueUserName: Constraint = new Constraint(){ def validate(name: String, value: String): Option[String] = getAccountByUserName(value).map { _ => "User already exists." } - } + } + + // TODO Merge with AccountController? + private def uniqueMailAddress(paramName: String = ""): Constraint = new Constraint(){ + def validate(name: String, value: String): Option[String] = + getAccountByMailAddress(value) + .filter { x => if(paramName.isEmpty) true else Some(x.userName) != params.get(paramName) } + .map { _ => "Mail address is already registered." } + } } \ No newline at end of file diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala index 816bbda..83d6d05 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -9,7 +9,10 @@ def getAccountByUserName(userName: String): Option[Account] = Query(Accounts) filter(_.userName is userName.bind) firstOption - + + def getAccountByMailAddress(mailAddress: String): Option[Account] = + Query(Accounts) filter(_.mailAddress is mailAddress.bind) firstOption + def getAllUsers(): List[Account] = Query(Accounts) sortBy(_.userName) list def createAccount(userName: String, password: String, mailAddress: String, isAdmin: Boolean, url: Option[String]): Unit =