All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gitbucket.core.service.HandleCommentService.scala Maven / Gradle / Ivy

The newest version!
package gitbucket.core.service

import gitbucket.core.controller.Context
import gitbucket.core.model.{Issue, IssueComment}
import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.model.activity.{
  CloseIssueInfo,
  ClosePullRequestInfo,
  IssueCommentInfo,
  PullRequestCommentInfo,
  ReopenIssueInfo,
  ReopenPullRequestInfo
}
import gitbucket.core.plugin.{IssueHook, PluginRegistry}
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.util.Implicits._

trait HandleCommentService {
  self: RepositoryService
    with IssuesService
    with ActivityService
    with WebHookService
    with WebHookIssueCommentService
    with WebHookPullRequestService =>

  /**
   * @see [[https://github.com/gitbucket/gitbucket/wiki/CommentAction]]
   */
  def handleComment(
    issue: Issue,
    content: Option[String],
    repository: RepositoryService.RepositoryInfo,
    actionOpt: Option[String]
  )(implicit context: Context, s: Session) = {
    context.loginAccount.flatMap { loginAccount =>
      val owner = repository.owner
      val name = repository.name
      val userName = loginAccount.userName

      actionOpt.collect {
        case "close" if !issue.closed =>
          updateClosed(owner, name, issue.issueId, true)
        case "reopen" if issue.closed =>
          updateClosed(owner, name, issue.issueId, false)
      }

      val (action, _) = actionOpt
        .collect {
          case "close" if !issue.closed =>
            val info = if (issue.isPullRequest) {
              ClosePullRequestInfo(owner, name, userName, issue.issueId, issue.title)
            } else {
              CloseIssueInfo(owner, name, userName, issue.issueId, issue.title)
            }
            recordActivity(info)
            Some("close") -> info
          case "reopen" if issue.closed =>
            val info = if (issue.isPullRequest) {
              ReopenPullRequestInfo(owner, name, userName, issue.issueId, issue.title)
            } else {
              ReopenIssueInfo(owner, name, userName, issue.issueId, issue.title)
            }
            recordActivity(info)
            Some("reopen") -> info
        }
        .getOrElse(None -> None)

      val commentId = (content, action) match {
        case (None, None) => None
        case (None, Some(action)) =>
          Some(createComment(owner, name, userName, issue.issueId, action.capitalize, action))
        case (Some(content), _) =>
          val id = Some(
            createComment(
              owner,
              name,
              userName,
              issue.issueId,
              content,
              action.map(_ + "_comment").getOrElse("comment")
            )
          )

          // record comment activity
          val commentInfo = if (issue.isPullRequest) {
            PullRequestCommentInfo(owner, name, userName, content, issue.issueId)
          } else {
            IssueCommentInfo(owner, name, userName, content, issue.issueId)
          }
          recordActivity(commentInfo)

          // extract references and create refer comment
          createReferComment(owner, name, issue, content, loginAccount)

          id
      }

      // call web hooks
      action match {
        case None =>
          commentId foreach (callIssueCommentWebHook(repository, issue, _, loginAccount, context.settings))
        case Some(act) =>
          val webHookAction = act match {
            case "close"  => "closed"
            case "reopen" => "reopened"
          }
          if (issue.isPullRequest)
            callPullRequestWebHook(webHookAction, repository, issue.issueId, loginAccount, context.settings)
          else
            callIssuesWebHook(webHookAction, repository, issue, loginAccount, context.settings)
      }

      // call hooks
      content foreach { x =>
        if (issue.isPullRequest)
          PluginRegistry().getPullRequestHooks.foreach(_.addedComment(commentId.get, x, issue, repository))
        else
          PluginRegistry().getIssueHooks.foreach(_.addedComment(commentId.get, x, issue, repository))
      }
      action foreach {
        case "close" =>
          if (issue.isPullRequest)
            PluginRegistry().getPullRequestHooks.foreach(_.closed(issue, repository))
          else
            PluginRegistry().getIssueHooks.foreach(_.closed(issue, repository))
        case "reopen" =>
          if (issue.isPullRequest)
            PluginRegistry().getPullRequestHooks.foreach(_.reopened(issue, repository))
          else
            PluginRegistry().getIssueHooks.foreach(_.reopened(issue, repository))
      }

      commentId.map(issue -> _)
    }
  }

  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(repoInfo.owner, repoInfo.name, 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(
    repository: RepositoryService.RepositoryInfo,
    issue: Issue,
    commentId: String,
    content: Option[String]
  )(implicit context: Context, s: Session): Option[(Issue, Int)] = {
    context.loginAccount.flatMap { loginAccount =>
      val owner = repository.owner
      val name = repository.name
      val userName = loginAccount.userName
      content match {
        case Some(content) =>
          // Update comment
          val _commentId = Some(updateComment(owner, name, issue.issueId, commentId.toInt, content))
          // Record comment activity
          val commentInfo = if (issue.isPullRequest) {
            PullRequestCommentInfo(owner, name, userName, content, issue.issueId)
          } else {
            IssueCommentInfo(owner, name, userName, content, issue.issueId)
          }
          recordActivity(commentInfo)
          // extract references and create refer comment
          createReferComment(owner, name, issue, content, loginAccount)
          // call web hooks
          commentId foreach (callIssueCommentWebHook(repository, issue, _, loginAccount, context.settings))
          // call hooks
          if (issue.isPullRequest)
            PluginRegistry().getPullRequestHooks
              .foreach(_.updatedComment(commentId.toInt, content, issue, repository))
          else
            PluginRegistry().getIssueHooks.foreach(_.updatedComment(commentId.toInt, content, issue, repository))
          _commentId.map(issue -> _)
        case _ => None
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy