make WebHookPullRequestPayload

This commit is contained in:
nazoking
2015-01-07 02:45:54 +09:00
parent ae7ead6272
commit b512e7c390
2 changed files with 181 additions and 47 deletions

View File

@@ -15,9 +15,10 @@ import service.PullRequestService._
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.eclipse.jgit.merge.MergeStrategy import org.eclipse.jgit.merge.MergeStrategy
import org.eclipse.jgit.errors.NoMergeBaseException import org.eclipse.jgit.errors.NoMergeBaseException
import service.WebHookService.WebHookPayload import service.WebHookService.{ WebHookPayload, WebHookPullRequestPayload }
import util.JGitUtil.DiffInfo import util.JGitUtil.DiffInfo
import util.JGitUtil.CommitInfo import util.JGitUtil.CommitInfo
import model.{PullRequest, Issue}
class PullRequestsController extends PullRequestsControllerBase class PullRequestsController extends PullRequestsControllerBase
@@ -192,14 +193,8 @@ trait PullRequestsControllerBase extends ControllerBase {
closeIssuesFromMessage(form.message, loginAccount.userName, owner, name) closeIssuesFromMessage(form.message, loginAccount.userName, owner, name)
} }
// call web hook // call web hook
// TODO: set action https://developer.github.com/v3/activity/events/types/#pullrequestevent getPullRequest(repository.owner, repository.name, issueId).map{ case (issue, pr) =>
getWebHookURLs(owner, name) match { callPullRequestWebHook("closed", repository, issue, pr, context.baseUrl, context.loginAccount.get)
case webHookURLs if(webHookURLs.nonEmpty) =>
for(ownerAccount <- getAccountByUserName(owner)){
callWebHook("pull_request", webHookURLs,
WebHookPayload(git, loginAccount, mergeBaseRefName, repository, commits.flatten.toList, ownerAccount))
}
case _ =>
} }
// notifications // notifications
@@ -358,6 +353,11 @@ trait PullRequestsControllerBase extends ControllerBase {
// record activity // record activity
recordPullRequestActivity(repository.owner, repository.name, loginUserName, issueId, form.title) recordPullRequestActivity(repository.owner, repository.name, loginUserName, issueId, form.title)
// call web hook
getPullRequest(repository.owner, repository.name, issueId).map{ case (issue, pr) =>
callPullRequestWebHook("opend", repository, issue, pr, context.baseUrl, context.loginAccount.get)
}
// notifications // notifications
Notifier().toNotify(repository, issueId, form.content.getOrElse("")){ Notifier().toNotify(repository, issueId, form.content.getOrElse("")){
Notifier.msgPullRequest(s"${context.baseUrl}/${repository.owner}/${repository.name}/pull/${issueId}") Notifier.msgPullRequest(s"${context.baseUrl}/${repository.owner}/${repository.name}/pull/${issueId}")
@@ -481,4 +481,30 @@ trait PullRequestsControllerBase extends ControllerBase {
hasWritePermission(owner, repoName, context.loginAccount)) hasWritePermission(owner, repoName, context.loginAccount))
} }
private def callPullRequestWebHook(action: String, repository: RepositoryService.RepositoryInfo, issue: Issue, pullRequest: PullRequest, baseUrl: String, sender: model.Account): Unit = {
import WebHookService._
getWebHookURLs(repository.owner, repository.name) match {
case webHookURLs if(webHookURLs.nonEmpty) =>
def findOwner(owner: String, knowns: Seq[model.Account]): Option[model.Account] = knowns.find(_.fullName == owner).orElse(getAccountByUserName(owner))
for{
baseOwner <- findOwner(repository.owner, Seq(sender))
headOwner <- findOwner(pullRequest.requestUserName, Seq(sender, baseOwner))
headRepo <- getRepository(pullRequest.requestUserName, pullRequest.requestRepositoryName, baseUrl)
} yield {
val payload = WebHookPullRequestPayload(
action = action,
issue = issue,
pullRequest = pullRequest,
headRepository = headRepo,
headOwner = headOwner,
baseRepository = repository,
baseOwner = baseOwner,
sender = sender)
for(ownerAccount <- getAccountByUserName(repository.owner)){
callWebHook("pull_request", webHookURLs, payload)
}
}
case _ =>
}
}
} }

View File

@@ -2,7 +2,7 @@ package service
import model.Profile._ import model.Profile._
import profile.simple._ import profile.simple._
import model.{WebHook, Account} import model.{WebHook, Account, Issue, PullRequest}
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import service.RepositoryService.RepositoryInfo import service.RepositoryService.RepositoryInfo
import util.JGitUtil import util.JGitUtil
@@ -72,48 +72,25 @@ trait WebHookService {
object WebHookService { object WebHookService {
case class WebHookPayload( trait WebHookPayload
pusher: WebHookUser,
case class WebHookPushPayload(
pusher: WebHookApiUser,
ref: String, ref: String,
commits: List[WebHookCommit], commits: List[WebHookCommit],
repository: WebHookRepository) repository: WebHookRepository
) extends WebHookPayload
object WebHookPayload { object WebHookPayload {
def apply(git: Git, pusher: Account, refName: String, repositoryInfo: RepositoryInfo, def apply(git: Git, pusher: Account, refName: String, repositoryInfo: RepositoryInfo,
commits: List[CommitInfo], repositoryOwner: Account): WebHookPayload = commits: List[CommitInfo], repositoryOwner: Account): WebHookPayload =
WebHookPayload( WebHookPushPayload(
WebHookUser(pusher.fullName, pusher.mailAddress), WebHookApiUser(pusher),
refName, refName,
commits.map { commit => commits.map{ commit => WebHookCommit(git, repositoryInfo, commit) },
val diffs = JGitUtil.getDiffs(git, commit.id, false)
val commitUrl = repositoryInfo.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/commit/" + commit.id
WebHookCommit(
id = commit.id,
message = commit.fullMessage,
timestamp = commit.commitTime.toString,
url = commitUrl,
added = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.ADD) => x.newPath },
removed = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.DELETE) => x.oldPath },
modified = diffs._1.collect { case x if(x.changeType != DiffEntry.ChangeType.ADD &&
x.changeType != DiffEntry.ChangeType.DELETE) => x.newPath },
author = WebHookUser(
name = commit.committerName,
email = commit.committerEmailAddress
)
)
},
WebHookRepository( WebHookRepository(
name = repositoryInfo.name, repositoryInfo,
url = repositoryInfo.httpUrl, owner= WebHookApiUser(repositoryOwner)
description = repositoryInfo.repository.description.getOrElse(""),
watchers = 0,
forks = repositoryInfo.forkedCount,
`private` = repositoryInfo.repository.isPrivate,
owner = WebHookUser(
name = repositoryOwner.userName,
email = repositoryOwner.mailAddress
)
) )
) )
} }
@@ -126,7 +103,46 @@ object WebHookService {
added: List[String], added: List[String],
removed: List[String], removed: List[String],
modified: List[String], modified: List[String],
author: WebHookUser) author: WebHookCommitUser,
committer: WebHookCommitUser)
object WebHookCommit{
def apply(git: Git, repositoryInfo: RepositoryInfo, commit: CommitInfo): WebHookCommit = {
val diffs = JGitUtil.getDiffs(git, commit.id, false)
val commitUrl = repositoryInfo.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/commit/" + commit.id
WebHookCommit(
id = commit.id,
message = commit.fullMessage,
timestamp = commit.commitTime.toString,
url = commitUrl,
added = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.ADD) => x.newPath },
removed = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.DELETE) => x.oldPath },
modified = diffs._1.collect { case x if(x.changeType != DiffEntry.ChangeType.ADD &&
x.changeType != DiffEntry.ChangeType.DELETE) => x.newPath },
author = WebHookCommitUser(
name = commit.authorName,
email = commit.authorEmailAddress
),
committer = WebHookCommitUser(
name = commit.committerName,
email = commit.committerEmailAddress
)
)
}
}
case class WebHookApiUser(
login: String,
`type`: String,
site_admin: Boolean)
object WebHookApiUser{
def apply(user: Account): WebHookApiUser = WebHookApiUser(
login = user.fullName,
`type` = if(user.isGroupAccount){ "Organization" }else{ "User" },
site_admin = user.isAdmin
)
}
case class WebHookRepository( case class WebHookRepository(
name: String, name: String,
@@ -135,10 +151,102 @@ object WebHookService {
watchers: Int, watchers: Int,
forks: Int, forks: Int,
`private`: Boolean, `private`: Boolean,
owner: WebHookUser) owner: WebHookApiUser)
case class WebHookUser( object WebHookRepository{
def apply(repositoryInfo: RepositoryInfo, owner: WebHookApiUser): WebHookRepository =
WebHookRepository(
name = repositoryInfo.name,
url = repositoryInfo.httpUrl,
description = repositoryInfo.repository.description.getOrElse(""),
watchers = 0,
forks = repositoryInfo.forkedCount,
`private` = repositoryInfo.repository.isPrivate,
owner = owner
)
}
case class WebHookCommitUser(
name: String, name: String,
email: String) email: String)
case class WebHookPullRequestPayload(
val action: String,
val number: Int,
val repository: WebHookRepository,
val pull_request: WebHookPullRequest,
val sender: WebHookApiUser
) extends WebHookPayload
object WebHookPullRequestPayload{
def apply(action: String,
issue: Issue,
pullRequest: PullRequest,
headRepository: RepositoryInfo,
headOwner: Account,
baseRepository: RepositoryInfo,
baseOwner: Account,
sender: model.Account): WebHookPullRequestPayload = {
val headRepoPayload = WebHookRepository(headRepository, owner=WebHookApiUser(headOwner))
val baseRepoPayload = WebHookRepository(baseRepository, owner=WebHookApiUser(baseOwner))
val senderPayload = WebHookApiUser(sender)
val pr = WebHookPullRequest(issue, pullRequest, headRepoPayload, baseRepoPayload, senderPayload)
WebHookPullRequestPayload(
action = action,
number = issue.issueId,
repository = pr.base.repo,
pull_request = pr,
sender = senderPayload
)
}
}
case class WebHookPullRequest(
number: Int,
updated_at: String,
head: WebHookPullRequestCommit,
base: WebHookPullRequestCommit,
mergeable: Option[Boolean],
title: String,
body: String,
user: WebHookApiUser,
url: String)
object WebHookPullRequest{
def apply(issue: Issue, pullRequest: PullRequest, headRepo: WebHookRepository, baseRepo: WebHookRepository, user: WebHookApiUser): WebHookPullRequest = WebHookPullRequest(
number = issue.issueId,
updated_at = issue.updatedDate.toString(),
head = WebHookPullRequestCommit(
sha = pullRequest.commitIdTo,
ref = pullRequest.requestBranch,
repo = headRepo),
base = WebHookPullRequestCommit(
sha = pullRequest.commitIdFrom,
ref = pullRequest.branch,
repo = baseRepo),
mergeable = None,
title = issue.title,
body = issue.content.getOrElse(""),
user = user,
url = s"${baseRepo.url}/pulls/${issue.issueId}"
)
}
case class WebHookPullRequestCommit(
label: String,
sha: String,
ref: String,
repo: WebHookRepository,
user: WebHookApiUser)
object WebHookPullRequestCommit{
def apply(sha: String,
ref: String,
repo: WebHookRepository): WebHookPullRequestCommit = WebHookPullRequestCommit(
label = s"${repo.owner.login}:${ref}",
sha = sha,
ref = ref,
repo = repo,
user = repo.owner)
}
} }