diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index 4b5a919..d76150b 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -15,7 +15,7 @@ context.mount(new LabelsController, "/*") context.mount(new MilestonesController, "/*") context.mount(new IssuesController, "/*") - context.mount(new SettingsController, "/*") + context.mount(new RepositorySettingsController, "/*") val dir = new java.io.File(_root_.util.Directory.GitBucketHome) if(!dir.exists){ diff --git a/src/main/scala/app/RepositorySettingsController.scala b/src/main/scala/app/RepositorySettingsController.scala new file mode 100644 index 0000000..6ee1cfd --- /dev/null +++ b/src/main/scala/app/RepositorySettingsController.scala @@ -0,0 +1,119 @@ +package app + +import service._ +import util.Directory._ +import util.{UsersAuthenticator, OwnerAuthenticator} +import jp.sf.amateras.scalatra.forms._ +import org.apache.commons.io.FileUtils +import org.scalatra.FlashMapSupport + +class RepositorySettingsController extends RepositorySettingsControllerBase + with RepositoryService with AccountService with OwnerAuthenticator with UsersAuthenticator + +trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSupport { + self: RepositoryService with AccountService with OwnerAuthenticator with UsersAuthenticator => + + case class OptionsForm(description: Option[String], defaultBranch: String, isPrivate: Boolean) + + val optionsForm = mapping( + "description" -> trim(label("Description" , optional(text()))), + "defaultBranch" -> trim(label("Default Branch" , text(required, maxlength(100)))), + "isPrivate" -> trim(label("Repository Type", boolean())) + )(OptionsForm.apply) + + case class CollaboratorForm(userName: String) + + val collaboratorForm = mapping( + "userName" -> trim(label("Username", text(required, collaborator))) + )(CollaboratorForm.apply) + + /** + * Redirect to the Options page. + */ + get("/:owner/:repository/settings")(ownerOnly { repository => + redirect("/%s/%s/settings/options".format(repository.owner, repository.name)) + }) + + /** + * Display the Options page. + */ + get("/:owner/:repository/settings/options")(ownerOnly { + settings.html.options(_, flash.get("info")) + }) + + /** + * Save the repository options. + */ + post("/:owner/:repository/settings/options", optionsForm)(ownerOnly { (form, repository) => + saveRepositoryOptions(repository.owner, repository.name, form.description, form.defaultBranch, form.isPrivate) + flash += "info" -> "Settings updated." + redirect("/%s/%s/settings/options".format(repository.owner, repository.name)) + }) + + /** + * Display the Collaborators page. + */ + get("/:owner/:repository/settings/collaborators")(ownerOnly { repository => + settings.html.collaborators(getCollaborators(repository.owner, repository.name), repository) + }) + + /** + * JSON API for collaborator completion. + */ + get("/:owner/:repository/settings/collaborators/proposals")(usersOnly { + contentType = formats("json") + org.json4s.jackson.Serialization.write(Map("options" -> getAllUsers.map(_.userName).toArray)) + }) + + /** + * Add the collaborator. + */ + post("/:owner/:repository/settings/collaborators/add", collaboratorForm)(ownerOnly { (form, repository) => + addCollaborator(repository.owner, repository.name, form.userName) + redirect("/%s/%s/settings/collaborators".format(repository.owner, repository.name)) + }) + + /** + * Add the collaborator. + */ + get("/:owner/:repository/settings/collaborators/remove")(ownerOnly { repository => + removeCollaborator(repository.owner, repository.name, params("name")) + redirect("/%s/%s/settings/collaborators".format(repository.owner, repository.name)) + }) + + /** + * Display the delete repository page. + */ + get("/:owner/:repository/settings/delete")(ownerOnly { + settings.html.delete(_) + }) + + /** + * Delete the repository. + */ + post("/:owner/:repository/settings/delete")(ownerOnly { repository => + deleteRepository(repository.owner, repository.name) + + FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name)) + FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name)) + FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name)) + + redirect("/%s".format(repository.owner)) + }) + + /** + * Provides Constraint to validate the collaborator name. + */ + private def collaborator: Constraint = new Constraint(){ + def validate(name: String, value: String): Option[String] = { + val paths = request.getRequestURI.split("/") + getAccountByUserName(value) match { + case None => Some("User does not exist.") + case Some(x) if(x.userName == paths(1) || getCollaborators(paths(1), paths(2)).contains(x.userName)) + => Some("User can access this repository already.") + case _ => None + } + } + } + +} \ No newline at end of file diff --git a/src/main/scala/app/SettingsController.scala b/src/main/scala/app/SettingsController.scala deleted file mode 100644 index a39fdaa..0000000 --- a/src/main/scala/app/SettingsController.scala +++ /dev/null @@ -1,119 +0,0 @@ -package app - -import service._ -import util.Directory._ -import util.{UsersAuthenticator, OwnerAuthenticator} -import jp.sf.amateras.scalatra.forms._ -import org.apache.commons.io.FileUtils -import org.scalatra.FlashMapSupport - -class SettingsController extends SettingsControllerBase - with RepositoryService with AccountService with OwnerAuthenticator with UsersAuthenticator - -trait SettingsControllerBase extends ControllerBase with FlashMapSupport { - self: RepositoryService with AccountService with OwnerAuthenticator with UsersAuthenticator => - - case class OptionsForm(description: Option[String], defaultBranch: String, isPrivate: Boolean) - - val optionsForm = mapping( - "description" -> trim(label("Description" , optional(text()))), - "defaultBranch" -> trim(label("Default Branch" , text(required, maxlength(100)))), - "isPrivate" -> trim(label("Repository Type", boolean())) - )(OptionsForm.apply) - - case class CollaboratorForm(userName: String) - - val collaboratorForm = mapping( - "userName" -> trim(label("Username", text(required, collaborator))) - )(CollaboratorForm.apply) - - /** - * Redirect to the Options page. - */ - get("/:owner/:repository/settings")(ownerOnly { repository => - redirect("/%s/%s/settings/options".format(repository.owner, repository.name)) - }) - - /** - * Display the Options page. - */ - get("/:owner/:repository/settings/options")(ownerOnly { - settings.html.options(_, flash.get("info")) - }) - - /** - * Save the repository options. - */ - post("/:owner/:repository/settings/options", optionsForm)(ownerOnly { (form, repository) => - saveRepositoryOptions(repository.owner, repository.name, form.description, form.defaultBranch, form.isPrivate) - flash += "info" -> "Settings updated." - redirect("/%s/%s/settings/options".format(repository.owner, repository.name)) - }) - - /** - * Display the Collaborators page. - */ - get("/:owner/:repository/settings/collaborators")(ownerOnly { repository => - settings.html.collaborators(getCollaborators(repository.owner, repository.name), repository) - }) - - /** - * JSON API for collaborator completion. - */ - get("/:owner/:repository/settings/collaborators/proposals")(usersOnly { - contentType = formats("json") - org.json4s.jackson.Serialization.write(Map("options" -> getAllUsers.map(_.userName).toArray)) - }) - - /** - * Add the collaborator. - */ - post("/:owner/:repository/settings/collaborators/add", collaboratorForm)(ownerOnly { (form, repository) => - addCollaborator(repository.owner, repository.name, form.userName) - redirect("/%s/%s/settings/collaborators".format(repository.owner, repository.name)) - }) - - /** - * Add the collaborator. - */ - get("/:owner/:repository/settings/collaborators/remove")(ownerOnly { repository => - removeCollaborator(repository.owner, repository.name, params("name")) - redirect("/%s/%s/settings/collaborators".format(repository.owner, repository.name)) - }) - - /** - * Display the delete repository page. - */ - get("/:owner/:repository/settings/delete")(ownerOnly { - settings.html.delete(_) - }) - - /** - * Delete the repository. - */ - post("/:owner/:repository/settings/delete")(ownerOnly { repository => - deleteRepository(repository.owner, repository.name) - - FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name)) - FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name)) - FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name)) - - redirect("/%s".format(repository.owner)) - }) - - /** - * Provides Constraint to validate the collaborator name. - */ - private def collaborator: Constraint = new Constraint(){ - def validate(name: String, value: String): Option[String] = { - val paths = request.getRequestURI.split("/") - getAccountByUserName(value) match { - case None => Some("User does not exist.") - case Some(x) if(x.userName == paths(1) || getCollaborators(paths(1), paths(2)).contains(x.userName)) - => Some("User can access this repository already.") - case _ => None - } - } - } - -} \ No newline at end of file