adding support for GitHub v3 delete comment (#2540)

This commit is contained in:
James Yoo
2020-09-11 22:52:47 -07:00
committed by GitHub
parent 851141c2f4
commit 0d20bc0173
3 changed files with 49 additions and 3 deletions

View File

@@ -4,6 +4,7 @@ import gitbucket.core.controller.{Context, ControllerBase}
import gitbucket.core.service._ import gitbucket.core.service._
import gitbucket.core.util.Implicits._ import gitbucket.core.util.Implicits._
import gitbucket.core.util.{ReadableUsersAuthenticator, ReferrerAuthenticator, RepositoryName} import gitbucket.core.util.{ReadableUsersAuthenticator, ReferrerAuthenticator, RepositoryName}
import org.scalatra.{ActionResult, NoContent}
trait ApiIssueCommentControllerBase extends ControllerBase { trait ApiIssueCommentControllerBase extends ControllerBase {
self: AccountService self: AccountService
@@ -112,8 +113,30 @@ trait ApiIssueCommentControllerBase extends ControllerBase {
/* /*
* vi. Delete a comment * vi. Delete a comment
* https://developer.github.com/v3/issues/comments/#delete-a-comment * https://docs.github.com/en/rest/reference/issues#delete-an-issue-comment
*
*/ */
delete("/api/v3/repos/{owner}/{repo}/issues/comments/:id")(readableUsersOnly { repository =>
val maybeDeleteResponse: Option[Either[ActionResult, Option[Int]]] =
for {
commentId <- params("id").toIntOpt
comment <- getComment(repository.owner, repository.name, commentId.toString)
issue <- getIssue(repository.owner, repository.name, comment.issueId.toString)
} yield {
if (isEditable(repository.owner, repository.name, comment.commentedUserName)) {
val maybeDeletedComment = deleteCommentByApi(repository, comment, issue)
Right(maybeDeletedComment.map(_.commentId))
} else {
Left(Unauthorized())
}
}
maybeDeleteResponse
.map {
case Right(maybeDeletedCommentId) => maybeDeletedCommentId.getOrElse(NotFound())
case Left(err) => err
}
.getOrElse(NotFound())
})
private def isEditable(owner: String, repository: String, author: String)(implicit context: Context): Boolean = private def isEditable(owner: String, repository: String, author: String)(implicit context: Context): Boolean =
hasDeveloperRole(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName hasDeveloperRole(owner, repository, context.loginAccount) || author == context.loginAccount.get.userName

View File

@@ -13,6 +13,10 @@ trait IssueHook {
implicit session: Session, implicit session: Session,
context: Context context: Context
): Unit = () ): Unit = ()
def deletedComment(commentId: Int, issue: Issue, repository: RepositoryInfo)(
implicit session: Session,
context: Context
): Unit = ()
def updatedComment(commentId: Int, content: String, issue: Issue, repository: RepositoryInfo)( def updatedComment(commentId: Int, content: String, issue: Issue, repository: RepositoryInfo)(
implicit session: Session, implicit session: Session,
context: Context context: Context

View File

@@ -1,7 +1,7 @@
package gitbucket.core.service package gitbucket.core.service
import gitbucket.core.controller.Context import gitbucket.core.controller.Context
import gitbucket.core.model.Issue import gitbucket.core.model.{Issue, IssueComment}
import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.model.activity.{ import gitbucket.core.model.activity.{
CloseIssueInfo, CloseIssueInfo,
@@ -11,7 +11,8 @@ import gitbucket.core.model.activity.{
ReopenIssueInfo, ReopenIssueInfo,
ReopenPullRequestInfo ReopenPullRequestInfo
} }
import gitbucket.core.plugin.PluginRegistry import gitbucket.core.plugin.{IssueHook, PluginRegistry}
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.SyntaxSugars._
import gitbucket.core.util.Implicits._ import gitbucket.core.util.Implicits._
@@ -135,6 +136,24 @@ trait HandleCommentService {
} }
} }
def deleteCommentByApi(repoInfo: RepositoryInfo, comment: IssueComment, issue: Issue)(
implicit context: Context,
s: Session
): Option[IssueComment] = context.loginAccount.flatMap { _ =>
comment.action match {
case "comment" =>
val deleteResult = deleteComment(comment.issueId, comment.commentId)
val registry = PluginRegistry()
val hooks: Seq[IssueHook] = if (issue.isPullRequest) registry.getPullRequestHooks else registry.getIssueHooks
hooks.foreach(_.deletedComment(comment.commentId, issue, repoInfo))
deleteResult match {
case n if n > 0 => Some(comment)
case _ => None
}
case _ => None
}
}
def updateCommentByApi( def updateCommentByApi(
repository: RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
issue: Issue, issue: Issue,