Newer
Older
gitbucket_jkp / src / main / scala / app / WikiController.scala
@takezoe takezoe on 11 Jul 2013 6 KB (refs #35)Fixed.
  1. package app
  2.  
  3. import service._
  4. import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, JGitUtil, StringUtil}
  5. import util.Directory._
  6. import jp.sf.amateras.scalatra.forms._
  7.  
  8. class WikiController extends WikiControllerBase
  9. with WikiService with RepositoryService with AccountService with ActivityService
  10. with CollaboratorsAuthenticator with ReferrerAuthenticator
  11.  
  12. trait WikiControllerBase extends ControllerBase {
  13. self: WikiService with RepositoryService with ActivityService
  14. with CollaboratorsAuthenticator with ReferrerAuthenticator =>
  15.  
  16. case class WikiPageEditForm(pageName: String, content: String, message: Option[String], currentPageName: String)
  17. val newForm = mapping(
  18. "pageName" -> trim(label("Page name" , text(required, maxlength(40), pagename, unique))),
  19. "content" -> trim(label("Content" , text(required))),
  20. "message" -> trim(label("Message" , optional(text()))),
  21. "currentPageName" -> trim(label("Current page name" , text()))
  22. )(WikiPageEditForm.apply)
  23. val editForm = mapping(
  24. "pageName" -> trim(label("Page name" , text(required, maxlength(40), pagename))),
  25. "content" -> trim(label("Content" , text(required))),
  26. "message" -> trim(label("Message" , optional(text()))),
  27. "currentPageName" -> trim(label("Current page name" , text(required)))
  28. )(WikiPageEditForm.apply)
  29. get("/:owner/:repository/wiki")(referrersOnly { repository =>
  30. getWikiPage(repository.owner, repository.name, "Home").map { page =>
  31. wiki.html.page("Home", page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
  32. } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit")
  33. })
  34. get("/:owner/:repository/wiki/:page")(referrersOnly { repository =>
  35. val pageName = StringUtil.urlDecode(params("page"))
  36.  
  37. getWikiPage(repository.owner, repository.name, pageName).map { page =>
  38. wiki.html.page(pageName, page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
  39. } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/${pageName}/_edit") // TODO URLEncode
  40. })
  41. get("/:owner/:repository/wiki/:page/_history")(referrersOnly { repository =>
  42. val pageName = StringUtil.urlDecode(params("page"))
  43.  
  44. JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
  45. JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match {
  46. case Right((logs, hasNext)) => wiki.html.history(Some(pageName), logs, repository)
  47. case Left(_) => NotFound
  48. }
  49. }
  50. })
  51. get("/:owner/:repository/wiki/:page/_compare/:commitId")(referrersOnly { repository =>
  52. val pageName = StringUtil.urlDecode(params("page"))
  53. val commitId = params("commitId").split("\\.\\.\\.")
  54.  
  55. JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
  56. wiki.html.compare(Some(pageName), getWikiDiffs(git, commitId(0), commitId(1)), repository)
  57. }
  58. })
  59. get("/:owner/:repository/wiki/_compare/:commitId")(referrersOnly { repository =>
  60. val commitId = params("commitId").split("\\.\\.\\.")
  61.  
  62. JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
  63. wiki.html.compare(None, getWikiDiffs(git, commitId(0), commitId(1)), repository)
  64. }
  65. })
  66. get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository =>
  67. val pageName = StringUtil.urlDecode(params("page"))
  68. wiki.html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository)
  69. })
  70. post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { (form, repository) =>
  71. val loginAccount = context.loginAccount.get
  72. saveWikiPage(repository.owner, repository.name, form.currentPageName, form.pageName,
  73. form.content, loginAccount, form.message.getOrElse(""))
  74. updateLastActivityDate(repository.owner, repository.name)
  75. recordEditWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
  76.  
  77. redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
  78. })
  79. get("/:owner/:repository/wiki/_new")(collaboratorsOnly {
  80. wiki.html.edit("", None, _)
  81. })
  82. post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { (form, repository) =>
  83. val loginAccount = context.loginAccount.get
  84. saveWikiPage(repository.owner, repository.name, form.currentPageName, form.pageName,
  85. form.content, context.loginAccount.get, form.message.getOrElse(""))
  86. updateLastActivityDate(repository.owner, repository.name)
  87. recordCreateWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
  88.  
  89. redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
  90. })
  91. get("/:owner/:repository/wiki/:page/_delete")(collaboratorsOnly { repository =>
  92. val pageName = StringUtil.urlDecode(params("page"))
  93. deleteWikiPage(repository.owner, repository.name, pageName, context.loginAccount.get.userName, s"Delete ${pageName}")
  94. updateLastActivityDate(repository.owner, repository.name)
  95.  
  96. redirect(s"/${repository.owner}/${repository.name}/wiki")
  97. })
  98. get("/:owner/:repository/wiki/_pages")(referrersOnly { repository =>
  99. wiki.html.pages(getWikiPageList(repository.owner, repository.name), repository,
  100. hasWritePermission(repository.owner, repository.name, context.loginAccount))
  101. })
  102. get("/:owner/:repository/wiki/_history")(referrersOnly { repository =>
  103. JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
  104. JGitUtil.getCommitLog(git, "master") match {
  105. case Right((logs, hasNext)) => wiki.html.history(None, logs, repository)
  106. case Left(_) => NotFound
  107. }
  108. }
  109. })
  110.  
  111. get("/:owner/:repository/wiki/_blob/*")(referrersOnly { repository =>
  112. getFileContent(repository.owner, repository.name, multiParams("splat").head).map { content =>
  113. contentType = "application/octet-stream"
  114. content
  115. } getOrElse NotFound
  116. })
  117.  
  118. private def unique: Constraint = new Constraint(){
  119. def validate(name: String, value: String): Option[String] =
  120. getWikiPageList(params("owner"), params("repository")).find(_ == value).map(_ => "Page already exists.")
  121. }
  122.  
  123. private def pagename: Constraint = new Constraint(){
  124. def validate(name: String, value: String): Option[String] =
  125. if(value.exists("\\/:*?\"<>|".contains(_))){
  126. Some(s"${name} contains invalid character.")
  127. } else if(value.startsWith("_") || value.startsWith("-")){
  128. Some(s"${name} starts with invalid character.")
  129. } else {
  130. None
  131. }
  132. }
  133.  
  134.  
  135. }