diff --git a/src/main/scala/app/CreateRepositoryServlet.scala b/src/main/scala/app/CreateRepositoryServlet.scala index aff1e0c..f620ab3 100644 --- a/src/main/scala/app/CreateRepositoryServlet.scala +++ b/src/main/scala/app/CreateRepositoryServlet.scala @@ -10,8 +10,8 @@ /** * Creates new repository. */ -class CreateRepositoryServlet extends ScalatraServlet with ServletBase { - +class CreateRepositoryServlet extends ServletBase { + /** * Show the new repository form. */ @@ -23,42 +23,60 @@ * Create new repository. */ post("/") { - val repositoryName = params("name") - val description = params("description") + withValidation(validate, params){ + val repositoryName = params("name") + val description = params("description") - val gitdir = getRepositoryDir(LoginUser, repositoryName) - val repository = new RepositoryBuilder().setGitDir(gitdir).setBare.build + val gitdir = getRepositoryDir(LoginUser, repositoryName) + val repository = new RepositoryBuilder().setGitDir(gitdir).setBare.build - repository.create + repository.create - val config = repository.getConfig - config.setBoolean("http", null, "receivepack", true) - config.save + val config = repository.getConfig + config.setBoolean("http", null, "receivepack", true) + config.save - val tmpdir = getInitRepositoryDir(LoginUser, repositoryName) - try { - // Clone the repository - Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call + val tmpdir = getInitRepositoryDir(LoginUser, repositoryName) + try { + // Clone the repository + Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call - // Create README.md - val readme = new File(tmpdir, "README.md") + // Create README.md + FileUtils.writeStringToFile(new File(tmpdir, "README.md"), if(description.nonEmpty){ + repositoryName + "\n===============\n\n" + description + } else { + repositoryName + "\n===============\n" + }, "UTF-8") - FileUtils.writeStringToFile(readme, if(description.nonEmpty){ - repositoryName + "\n===============\n\n" + description - } else { - repositoryName + "\n===============\n" - }, "UTF-8") - - val git = Git.open(tmpdir) - git.add.addFilepattern("README.md").call - git.commit.setMessage("Initial commit").call - git.push.call + val git = Git.open(tmpdir) + git.add.addFilepattern("README.md").call + git.commit.setMessage("Initial commit").call + git.push.call - } finally { - FileUtils.deleteDirectory(tmpdir) + } finally { + FileUtils.deleteDirectory(tmpdir) + } + + // redirect to the repository + redirect("/%s/%s".format(LoginUser, repositoryName)) } - - // redirect to the repository - redirect("/%s/%s".format(LoginUser, repositoryName)) + } + + get("/validate") { + contentType = "application/json" + validate(params).toJSON + } + + def validate(params: Map[String, String]): ValidationResult = { + val name = params("name") + if(name.isEmpty){ + ValidationResult(false, Map("name" -> "Repository name is required.")) + } else if(!name.matches("^[a-z0-6\\-_]+$")){ + ValidationResult(false, Map("name" -> "Repository name contans invalid character.")) + } else if(getRepositories(LoginUser).contains(name)){ + ValidationResult(false, Map("name" -> "Repository already exists.")) + } else { + ValidationResult(true, Map.empty) + } } } \ No newline at end of file diff --git a/src/main/scala/app/RepositoryViewerServlet.scala b/src/main/scala/app/RepositoryViewerServlet.scala index f9b4c81..e878a30 100644 --- a/src/main/scala/app/RepositoryViewerServlet.scala +++ b/src/main/scala/app/RepositoryViewerServlet.scala @@ -18,7 +18,7 @@ /** * The repository viewer. */ -class RepositoryViewerServlet extends ScalatraServlet with ServletBase { +class RepositoryViewerServlet extends ServletBase { /** * Shows user information. diff --git a/src/main/scala/app/ServletBase.scala b/src/main/scala/app/ServletBase.scala index b0a88d9..8f5cd04 100644 --- a/src/main/scala/app/ServletBase.scala +++ b/src/main/scala/app/ServletBase.scala @@ -1,11 +1,36 @@ package app +import org.scalatra._ +import org.scalatra.json._ +import org.json4s._ +import org.json4s.jackson._ + /** * Provides generic features for ScalatraServlet implementations. */ -trait ServletBase { +abstract class ServletBase extends ScalatraServlet with JacksonJsonSupport { + + implicit val jsonFormats = DefaultFormats // TODO get from session val LoginUser = System.getProperty("user.name") + + protected def withValidation(validator: Map[String, String] => ValidationResult, params: Map[String, String])(action: => Any): Any = { + validator(params).valid match { + case true => action + case false => throw new RuntimeException("Invalid Request") // TODO show error page? + } + } + + case class ValidationResult(valid: Boolean, errors: Map[String, String]){ + def toJSON(): JObject = { + JObject( + "valid" -> JBool(valid), + "errors" -> JObject(errors.map { case (key, value) => + JField(key, JString(value)) + }.toList) + ) + } + } } \ No newline at end of file diff --git a/src/main/twirl/main.scala.html b/src/main/twirl/main.scala.html index 7c34ac7..3aa6f5e 100644 --- a/src/main/twirl/main.scala.html +++ b/src/main/twirl/main.scala.html @@ -13,6 +13,9 @@ + + +