diff --git a/src/main/scala/app/RepositorySettingsController.scala b/src/main/scala/app/RepositorySettingsController.scala index 6647518..26a35fd 100644 --- a/src/main/scala/app/RepositorySettingsController.scala +++ b/src/main/scala/app/RepositorySettingsController.scala @@ -44,6 +44,13 @@ "url" -> trim(label("url", text(required, webHook))) )(WebHookForm.apply) + // for transfer ownership + case class TransferOwnerShipForm(newOwner: String) + + val transferForm = mapping( + "newOwner" -> trim(label("New owner", text(required))) // TODO user and repository existence check + )(TransferOwnerShipForm.apply) + /** * Redirect to the Options page. */ @@ -167,6 +174,34 @@ }) /** + * Display the transfer ownership page. + */ + get("/:owner/:repository/settings/transfer")(ownerOnly { + settings.html.transfer(_) + }) + + /** + * Save the repository options. + */ + post("/:owner/:repository/settings/transfer", transferForm)(ownerOnly { (form, repository) => + // Change repository owner + if(repository.owner != form.newOwner){ + // Update database + renameRepository(repository.owner, repository.name, form.newOwner, repository.name) + // Move git repository + defining(getRepositoryDir(repository.owner, repository.name)){ dir => + FileUtils.moveDirectory(dir, getRepositoryDir(form.newOwner, repository.name)) + } + // Move wiki repository + defining(getWikiRepositoryDir(repository.owner, repository.name)){ dir => + FileUtils.moveDirectory(dir, getWikiRepositoryDir(form.newOwner, repository.name)) + } + } +// flash += "info" -> "Repository ownership is transferred." + redirect(s"/${form.newOwner}/${repository.name}/settings/transfer") + }) + + /** * Display the delete repository page. */ get("/:owner/:repository/settings/delete")(ownerOnly { diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/service/RepositoryService.scala index 480784e..74bd139 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -41,7 +41,7 @@ def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String): Unit = { (Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository => - Repositories insert repository.copy(repositoryName = newRepositoryName) + Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName) val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list diff --git a/src/main/twirl/settings/menu.scala.html b/src/main/twirl/settings/menu.scala.html index fa546eb..f08ba41 100644 --- a/src/main/twirl/settings/menu.scala.html +++ b/src/main/twirl/settings/menu.scala.html @@ -14,6 +14,9 @@ Service Hooks + + Transfer Ownership + Delete Repository diff --git a/src/main/twirl/settings/transfer.scala.html b/src/main/twirl/settings/transfer.scala.html new file mode 100644 index 0000000..c6c8af8 --- /dev/null +++ b/src/main/twirl/settings/transfer.scala.html @@ -0,0 +1,24 @@ +@(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context) +@import context._ +@import view.helpers._ +@html.main("Delete Repository", Some(repository)){ + @html.header("settings", repository) + @menu("transfer", repository){ +
+

Transfer Ownership

+
+ + + +
+ +
+ } +} + \ No newline at end of file