diff --git a/src/main/scala/gitbucket/core/controller/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala index f2959ca..04455ea 100644 --- a/src/main/scala/gitbucket/core/controller/AccountController.scala +++ b/src/main/scala/gitbucket/core/controller/AccountController.scala @@ -139,7 +139,7 @@ private def accountWebhookEvents = new ValueType[Set[WebHook.Event]]{ def convert(name: String, params: Map[String, Seq[String]], messages: Messages): Set[WebHook.Event] = { WebHook.Event.values.flatMap { t => - params.get(name + "." + t.name).map(_ => t) + params.optionValue(name + "." + t.name).map(_ => t) }.toSet } def validate(name: String, params: Map[String, Seq[String]], messages: Messages): Seq[(String, String)] = @@ -636,10 +636,14 @@ } private def uniqueRepository: Constraint = new Constraint(){ - override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = - params.get("owner").flatMap { userName => - getRepositoryNamesOfUser(userName.head).find(_ == value).map(_ => "Repository already exists.") + override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = { + for { + userName <- params.optionValue("owner") + _ <- getRepositoryNamesOfUser(userName).find(_ == value) + } yield { + "Repository already exists." } + } } private def members: Constraint = new Constraint(){ diff --git a/src/main/scala/gitbucket/core/controller/ControllerBase.scala b/src/main/scala/gitbucket/core/controller/ControllerBase.scala index 4948c43..993f160 100644 --- a/src/main/scala/gitbucket/core/controller/ControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/ControllerBase.scala @@ -314,10 +314,11 @@ } protected def uniqueMailAddress(paramName: String = ""): Constraint = new Constraint(){ - override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = + override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = { getAccountByMailAddress(value, true) - .filter { x => if(paramName.isEmpty) true else Some(x.userName) != params.get(paramName) } + .filter { x => if(paramName.isEmpty) true else Some(x.userName) != params.optionValue(paramName) } .map { _ => "Mail address is already registered." } + } } val allReservedNames = Set("git", "admin", "upload", "api", "assets", "plugin-assets", "signin", "signout", "register", "activities.atom", "sidebar-collapse", "groups", "new") diff --git a/src/main/scala/gitbucket/core/controller/LabelsController.scala b/src/main/scala/gitbucket/core/controller/LabelsController.scala index d0d82d4..4f42475 100644 --- a/src/main/scala/gitbucket/core/controller/LabelsController.scala +++ b/src/main/scala/gitbucket/core/controller/LabelsController.scala @@ -4,6 +4,7 @@ import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, LabelsService} import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator} import gitbucket.core.util.Implicits._ +import gitbucket.core.util.SyntaxSugars._ import org.scalatra.forms._ import org.scalatra.i18n.Messages import org.scalatra.Ok @@ -83,10 +84,10 @@ private def uniqueLabelName: Constraint = new Constraint(){ override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = { - val owner = params("owner").head - val repository = params("repository").head - params.get("labelId").map { labelId => - getLabel(owner, repository, value).filter(_.labelId != labelId.head.toInt).map(_ => "Name has already been taken.") + val owner = params.value("owner") + val repository = params.value("repository") + params.optionValue("labelId").map { labelId => + getLabel(owner, repository, value).filter(_.labelId != labelId.toInt).map(_ => "Name has already been taken.") }.getOrElse { getLabel(owner, repository, value).map(_ => "Name has already been taken.") } diff --git a/src/main/scala/gitbucket/core/controller/PrioritiesController.scala b/src/main/scala/gitbucket/core/controller/PrioritiesController.scala index 340065f..dee6cbb 100644 --- a/src/main/scala/gitbucket/core/controller/PrioritiesController.scala +++ b/src/main/scala/gitbucket/core/controller/PrioritiesController.scala @@ -4,6 +4,7 @@ import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, PrioritiesService} import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator} import gitbucket.core.util.Implicits._ +import gitbucket.core.util.SyntaxSugars._ import org.scalatra.forms._ import org.scalatra.i18n.Messages import org.scalatra.Ok @@ -99,10 +100,10 @@ private def uniquePriorityName: Constraint = new Constraint(){ override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = { - val owner = params("owner").head - val repository = params("repository").head - params.get("priorityId").map { priorityId => - getPriority(owner, repository, value).filter(_.priorityId != priorityId.head.toInt).map(_ => "Name has already been taken.") + val owner = params.value("owner") + val repository = params.value("repository") + params.optionValue("priorityId").map { priorityId => + getPriority(owner, repository, value).filter(_.priorityId != priorityId.toInt).map(_ => "Name has already been taken.") }.getOrElse { getPriority(owner, repository, value).map(_ => "Name has already been taken.") } diff --git a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala index cab7c07..9e6c0b0 100644 --- a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala @@ -460,12 +460,15 @@ * Duplicate check for the rename repository name. */ private def renameRepositoryName: Constraint = new Constraint(){ - override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = - params.get("repository").filter(_ != value).flatMap { _ => - params.get("owner").flatMap { userName => - getRepositoryNamesOfUser(userName.head).find(_ == value).map(_ => "Repository already exists.") - } + override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = { + for { + repoName <- params.optionValue("repository") if repoName != value + userName <- params.optionValue("owner") + _ <- getRepositoryNamesOfUser(userName).find(_ == value) + } yield { + "Repository already exists." } + } } /** diff --git a/src/main/scala/gitbucket/core/controller/WikiController.scala b/src/main/scala/gitbucket/core/controller/WikiController.scala index b212b81..5dde40e 100644 --- a/src/main/scala/gitbucket/core/controller/WikiController.scala +++ b/src/main/scala/gitbucket/core/controller/WikiController.scala @@ -227,7 +227,7 @@ private def unique: Constraint = new Constraint(){ override def validate(name: String, value: String, params: Map[String, Seq[String]], messages: Messages): Option[String] = - getWikiPageList(params("owner").head, params("repository").head).find(_ == value).map(_ => "Page already exists.") + getWikiPageList(params.value("owner"), params.value("repository")).find(_ == value).map(_ => "Page already exists.") } private def pagename: Constraint = new Constraint(){ diff --git a/src/main/scala/gitbucket/core/util/SyntaxSugars.scala b/src/main/scala/gitbucket/core/util/SyntaxSugars.scala index 1c0384a..74d39cb 100644 --- a/src/main/scala/gitbucket/core/util/SyntaxSugars.scala +++ b/src/main/scala/gitbucket/core/util/SyntaxSugars.scala @@ -53,4 +53,14 @@ def unapply[A, B](t: (A, B)): Option[(A, B)] = Some(t) } + /** + * Provides easier and explicit ways to access to a head value of `Map[String, Seq[String]]`. + * This is intended to use in implementations of scalatra-forms's `Constraint` or `ValueType`. + */ + implicit class HeadValueAccessibleMap(map: Map[String, Seq[String]]){ + def value(key: String): String = map(key).head + def optionValue(key: String): Option[String] = map.get(key).flatMap(_.headOption) + def values(key: String): Seq[String] = map.get(key).getOrElse(Seq.empty) + } + }