diff --git a/src/main/scala/gitbucket/core/api/ApiPullRequest.scala b/src/main/scala/gitbucket/core/api/ApiPullRequest.scala index 0e21596..013128f 100644 --- a/src/main/scala/gitbucket/core/api/ApiPullRequest.scala +++ b/src/main/scala/gitbucket/core/api/ApiPullRequest.scala @@ -1,7 +1,6 @@ package gitbucket.core.api -import gitbucket.core.model.{Issue, PullRequest} - +import gitbucket.core.model.{Account, Issue, IssueComment, PullRequest} import java.util.Date @@ -34,8 +33,14 @@ } object ApiPullRequest{ - def apply(issue: Issue, pullRequest: PullRequest, headRepo: ApiRepository, baseRepo: ApiRepository, user: ApiUser, - /*mergeable: Boolean,*/ merged: Boolean, mergedAt: Option[Date], mergedBy: Option[ApiUser]): ApiPullRequest = + def apply( + issue: Issue, + pullRequest: PullRequest, + headRepo: ApiRepository, + baseRepo: ApiRepository, + user: ApiUser, + mergedComment: Option[(IssueComment, Account)] + ): ApiPullRequest = ApiPullRequest( number = issue.issueId, updated_at = issue.updatedDate, @@ -53,9 +58,9 @@ baseOwner = issue.userName ), mergeable = None, // TODO: need check mergeable. - merged = merged, - merged_at = mergedAt, - merged_by = mergedBy, + merged = mergedComment.isDefined, + merged_at = mergedComment.map { case (comment, _) => comment.registeredDate }, + merged_by = mergedComment.map { case (_, account) => ApiUser(account) }, title = issue.title, body = issue.content.getOrElse(""), user = user diff --git a/src/main/scala/gitbucket/core/controller/ApiController.scala b/src/main/scala/gitbucket/core/controller/ApiController.scala index 1364526..ba32532 100644 --- a/src/main/scala/gitbucket/core/controller/ApiController.scala +++ b/src/main/scala/gitbucket/core/controller/ApiController.scala @@ -102,7 +102,7 @@ defaultBranch = repository.repository.defaultBranch, origin = repository.repository.originUserName.isEmpty ).map { br => - ApiBranchForList(br.name, ApiBranchCommit(br.commitId)) + ApiBranchForList(br.name, ApiBranchCommit(br.commitId)) }) }) @@ -254,7 +254,7 @@ patch("/api/v3/repos/:owner/:repo/branches/:branch")(ownerOnly { repository => import gitbucket.core.api._ (for{ - branch <- params.get("branch") if repository.branchList.find(_ == branch).isDefined + branch <- params.get("branch") if repository.branchList.find(_ == branch).isDefined protection <- extractFromJsonBody[ApiBranchProtection.EnablingAndDisabling].map(_.protection) } yield { if(protection.enabled){ @@ -281,8 +281,8 @@ */ get("/api/v3/repos/:owner/:repository/issues/:id/comments")(referrersOnly { repository => (for{ - issueId <- params("id").toIntOpt - comments = getCommentsForApi(repository.owner, repository.name, issueId.toInt) + issueId <- params("id").toIntOpt + comments = getCommentsForApi(repository.owner, repository.name, issueId.toInt) } yield { JsonFormat(comments.map{ case (issueComment, user, issue) => ApiComment(issueComment, RepositoryName(repository), issueId, ApiUser(user), issue.isPullRequest) }) }) getOrElse NotFound() @@ -363,12 +363,14 @@ updateLabel(repository.owner, repository.name, label.labelId, data.name, data.color) JsonFormat(ApiLabel( getLabel(repository.owner, repository.name, label.labelId).get, - RepositoryName(repository))) + RepositoryName(repository) + )) } else { // TODO ApiError should support errors field to enhance compatibility of GitHub API UnprocessableEntity(ApiError( "Validation Failed", - Some("https://developer.github.com/v3/issues/labels/#create-a-label"))) + Some("https://developer.github.com/v3/issues/labels/#create-a-label") + )) } } getOrElse NotFound() } @@ -405,19 +407,14 @@ repos = repository.owner -> repository.name ) - JsonFormat(issues.map { case (issue, issueUser, commentCount, pullRequest, headRepo, headOwner) => - val mergedComment = getMergedComment(getCommentsForApi(repository.owner, repository.name, issue.issueId)) - ApiPullRequest( - issue = issue, - pullRequest = pullRequest, - headRepo = ApiRepository(headRepo, ApiUser(headOwner)), - baseRepo = ApiRepository(repository, ApiUser(baseOwner)), - user = ApiUser(issueUser), - merged = mergedComment.isDefined, - mergedAt = mergedComment.map { case (comment, _) => comment.registeredDate }, - mergedBy = mergedComment.map { case (_, account) => ApiUser(account) } + issue = issue, + pullRequest = pullRequest, + headRepo = ApiRepository(headRepo, ApiUser(headOwner)), + baseRepo = ApiRepository(repository, ApiUser(baseOwner)), + user = ApiUser(issueUser), + mergedComment = getMergedComment(repository.owner, repository.name, issue.issueId) ) }) }) @@ -427,25 +424,21 @@ */ get("/api/v3/repos/:owner/:repository/pulls/:id")(referrersOnly { repository => (for{ - issueId <- params("id").toIntOpt + issueId <- params("id").toIntOpt (issue, pullRequest) <- getPullRequest(repository.owner, repository.name, issueId) - users = getAccountsByUserNames(Set(repository.owner, pullRequest.requestUserName, issue.openedUserName), Set()) + users = getAccountsByUserNames(Set(repository.owner, pullRequest.requestUserName, issue.openedUserName), Set.empty) baseOwner <- users.get(repository.owner) headOwner <- users.get(pullRequest.requestUserName) issueUser <- users.get(issue.openedUserName) headRepo <- getRepository(pullRequest.requestUserName, pullRequest.requestRepositoryName) } yield { - val mergedComment = getMergedComment(getCommentsForApi(repository.owner, repository.name, issue.issueId)) - JsonFormat(ApiPullRequest( - issue = issue, - pullRequest = pullRequest, - headRepo = ApiRepository(headRepo, ApiUser(headOwner)), - baseRepo = ApiRepository(repository, ApiUser(baseOwner)), - user = ApiUser(issueUser), - merged = mergedComment.isDefined, - mergedAt = mergedComment.map { case (comment, _) => comment.registeredDate }, - mergedBy = mergedComment.map { case (_, account) => ApiUser(account) } + issue = issue, + pullRequest = pullRequest, + headRepo = ApiRepository(headRepo, ApiUser(headOwner)), + baseRepo = ApiRepository(repository, ApiUser(baseOwner)), + user = ApiUser(issueUser), + mergedComment = getMergedComment(repository.owner, repository.name, issue.issueId) )) }) getOrElse NotFound() }) @@ -462,7 +455,7 @@ val oldId = git.getRepository.resolve(pullreq.commitIdFrom) val newId = git.getRepository.resolve(pullreq.commitIdTo) val repoFullName = RepositoryName(repository) - val commits = git.log.addRange(oldId, newId).call.iterator.asScala.map(c => ApiCommitListItem(new CommitInfo(c), repoFullName)).toList + val commits = git.log.addRange(oldId, newId).call.iterator.asScala.map { c => ApiCommitListItem(new CommitInfo(c), repoFullName) }.toList JsonFormat(commits) } } @@ -481,14 +474,14 @@ */ post("/api/v3/repos/:owner/:repo/statuses/:sha")(writableUsersOnly { repository => (for{ - ref <- params.get("sha") - sha <- JGitUtil.getShaByRef(repository.owner, repository.name, ref) - data <- extractFromJsonBody[CreateAStatus] if data.isValid - creator <- context.loginAccount - state <- CommitState.valueOf(data.state) - statusId = createCommitStatus(repository.owner, repository.name, sha, data.context.getOrElse("default"), - state, data.target_url, data.description, new java.util.Date(), creator) - status <- getCommitStatus(repository.owner, repository.name, statusId) + ref <- params.get("sha") + sha <- JGitUtil.getShaByRef(repository.owner, repository.name, ref) + data <- extractFromJsonBody[CreateAStatus] if data.isValid + creator <- context.loginAccount + state <- CommitState.valueOf(data.state) + statusId = createCommitStatus(repository.owner, repository.name, sha, data.context.getOrElse("default"), + state, data.target_url, data.description, new java.util.Date(), creator) + status <- getCommitStatus(repository.owner, repository.name, statusId) } yield { JsonFormat(ApiCommitStatus(status, ApiUser(creator))) }) getOrElse NotFound() @@ -526,9 +519,9 @@ */ get("/api/v3/repos/:owner/:repo/commits/:ref/status")(referrersOnly { repository => (for{ - ref <- params.get("ref") + ref <- params.get("ref") owner <- getAccountByUserName(repository.owner) - sha <- JGitUtil.getShaByRef(repository.owner, repository.name, ref) + sha <- JGitUtil.getShaByRef(repository.owner, repository.name, ref) } yield { val statuses = getCommitStatuesWithCreator(repository.owner, repository.name, sha) JsonFormat(ApiCombinedCommitStatus(sha, statuses, ApiRepository(repository, owner))) diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala index 29eb86f..23c3b9d 100644 --- a/src/main/scala/gitbucket/core/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -13,6 +13,7 @@ import Q.interpolation + trait IssuesService { self: AccountService with RepositoryService => import IssuesService._ @@ -34,8 +35,8 @@ .map{ case ((t1, t2), t3) => (t1, t2, t3) } .list - def getMergedComment(comments: List[(IssueComment, Account, Issue)]): Option[(IssueComment, Account)] = { - comments.collectFirst { case (comment, account, _) if comment.action == "merged" => (comment, account) } + def getMergedComment(owner: String, repository: String, issueId: Int)(implicit s: Session): Option[(IssueComment, Account)] = { + getCommentsForApi(owner, repository, issueId).collectFirst { case (comment, account, _) if comment.action == "merged" => (comment, account) } } def getComment(owner: String, repository: String, commentId: String)(implicit s: Session) = diff --git a/src/main/scala/gitbucket/core/service/WebHookService.scala b/src/main/scala/gitbucket/core/service/WebHookService.scala index 4d9e516..1fb181c 100644 --- a/src/main/scala/gitbucket/core/service/WebHookService.scala +++ b/src/main/scala/gitbucket/core/service/WebHookService.scala @@ -36,15 +36,15 @@ def getWebHooks(owner: String, repository: String)(implicit s: Session): List[(WebHook, Set[WebHook.Event])] = WebHooks.filter(_.byRepository(owner, repository)) .innerJoin(WebHookEvents).on { (w, t) => t.byWebHook(w) } - .map{ case (w,t) => w -> t.event } + .map { case (w,t) => w -> t.event } .list.groupBy(_._1).mapValues(_.map(_._2).toSet).toList.sortBy(_._1.url) /** get All WebHook informations of repository event */ def getWebHooksByEvent(owner: String, repository: String, event: WebHook.Event)(implicit s: Session): List[WebHook] = WebHooks.filter(_.byRepository(owner, repository)) .innerJoin(WebHookEvents).on { (wh, whe) => whe.byWebHook(wh) } - .filter{ case (wh, whe) => whe.event === event.bind} - .map{ case (wh, whe) => wh } + .filter { case (wh, whe) => whe.event === event.bind} + .map { case (wh, whe) => wh } .list.distinct /** get All WebHook information from repository to url */ @@ -52,12 +52,12 @@ WebHooks .filter(_.byPrimaryKey(owner, repository, url)) .innerJoin(WebHookEvents).on { (w, t) => t.byWebHook(w) } - .map{ case (w,t) => w -> t.event } + .map { case (w,t) => w -> t.event } .list.groupBy(_._1).mapValues(_.map(_._2).toSet).headOption - def addWebHook(owner: String, repository: String, url :String, events: Set[WebHook.Event], ctype: WebHookContentType, token: Option[String])(implicit s: Session): Unit = { + def addWebHook(owner: String, repository: String, url :String, events: Set[WebHook.Event], ctype: WebHookContentType, token: Option[String])(implicit s: Session): Unit = { WebHooks insert WebHook(owner, repository, url, ctype, token) - events.toSet.map{ event: WebHook.Event => + events.map { event: WebHook.Event => WebHookEvents insert WebHookEvent(owner, repository, url, event) } } @@ -65,7 +65,7 @@ def updateWebHook(owner: String, repository: String, url :String, events: Set[WebHook.Event], ctype: WebHookContentType, token: Option[String])(implicit s: Session): Unit = { WebHooks.filter(_.byPrimaryKey(owner, repository, url)).map(w => (w.ctype, w.token)).update((ctype, token)) WebHookEvents.filter(_.byWebHook(owner, repository, url)).delete - events.toSet.map{ event: WebHook.Event => + events.map { event: WebHook.Event => WebHookEvents insert WebHookEvent(owner, repository, url, event) } } @@ -84,7 +84,7 @@ def callWebHook(event: WebHook.Event, webHooks: List[WebHook], payload: WebHookPayload) (implicit c: JsonFormat.Context): List[(WebHook, String, Future[HttpRequest], Future[HttpResponse])] = { import org.apache.http.impl.client.HttpClientBuilder - import ExecutionContext.Implicits.global + import ExecutionContext.Implicits.global // TODO Shouldn't use the default execution context import org.apache.http.protocol.HttpContext import org.apache.http.client.methods.HttpPost @@ -94,7 +94,7 @@ webHooks.map { webHook => val reqPromise = Promise[HttpRequest] val f = Future { - val itcp = new org.apache.http.HttpRequestInterceptor{ + val itcp = new org.apache.http.HttpRequestInterceptor { def process(res: HttpRequest, ctx: HttpContext): Unit = { reqPromise.success(res) } @@ -132,8 +132,8 @@ httpPost.releaseConnection() logger.debug(s"end web hook invocation for ${webHook}") res - }catch{ - case e:Throwable => { + } catch { + case e: Throwable => { if(!reqPromise.isCompleted){ reqPromise.failure(e) } @@ -171,11 +171,11 @@ issueUser <- users.get(issue.openedUserName) } yield { WebHookIssuesPayload( - action = action, - number = issue.issueId, - repository = ApiRepository(repository, ApiUser(repoOwner)), - issue = ApiIssue(issue, RepositoryName(repository), ApiUser(issueUser)), - sender = ApiUser(sender)) + action = action, + number = issue.issueId, + repository = ApiRepository(repository, ApiUser(repoOwner)), + issue = ApiIssue(issue, RepositoryName(repository), ApiUser(issueUser)), + sender = ApiUser(sender)) } } } @@ -192,8 +192,6 @@ issueUser <- users.get(issue.openedUserName) headRepo <- getRepository(pullRequest.requestUserName, pullRequest.requestRepositoryName) } yield { - val mergedComment = getMergedComment(getCommentsForApi(repository.owner, repository.name, issueId)) - WebHookPullRequestPayload( action = action, issue = issue, @@ -204,9 +202,7 @@ baseRepository = repository, baseOwner = baseOwner, sender = sender, - merged = mergedComment.isDefined, - mergedAt = mergedComment.map { case (comment, _) => comment.registeredDate }, - mergedBy = mergedComment.map { case (_, account) => ApiUser(account) } + mergedComment = getMergedComment(repository.owner, repository.name, issueId) ) } } @@ -237,8 +233,6 @@ ((issue, issueUser, pullRequest, baseOwner, headOwner), webHooks) <- getPullRequestsByRequestForWebhook(requestRepository.owner, requestRepository.name, requestBranch) baseRepo <- getRepository(pullRequest.userName, pullRequest.repositoryName) } yield { - val mergedComment = getMergedComment(getCommentsForApi(baseRepo.owner, baseRepo.name, issue.issueId)) - val payload = WebHookPullRequestPayload( action = action, issue = issue, @@ -249,9 +243,7 @@ baseRepository = baseRepo, baseOwner = baseOwner, sender = sender, - merged = mergedComment.isDefined, - mergedAt = mergedComment.map { case (comment, _) => comment.registeredDate }, - mergedBy = mergedComment.map { case (_, account) => ApiUser(account) } + mergedComment = getMergedComment(baseRepo.owner, baseRepo.name, issue.issueId) ) callWebHook(WebHook.PullRequest, webHooks, payload) @@ -273,8 +265,6 @@ issueUser <- users.get(issue.openedUserName) headRepo <- getRepository(pullRequest.requestUserName, pullRequest.requestRepositoryName) } yield { - val mergedComment = getMergedComment(getCommentsForApi(repository.owner, repository.name, issue.issueId)) - WebHookPullRequestReviewCommentPayload( action = action, comment = comment, @@ -286,9 +276,7 @@ baseRepository = repository, baseOwner = baseOwner, sender = sender, - merged = mergedComment.isDefined, - mergedAt = mergedComment.map { case (comment, _) => comment.registeredDate }, - mergedBy = mergedComment.map { case (_, account) => ApiUser(account) } + mergedComment = getMergedComment(repository.owner, repository.name, issue.issueId) ) } } @@ -388,22 +376,18 @@ baseRepository: RepositoryInfo, baseOwner: Account, sender: Account, - merged: Boolean, - mergedAt: Option[Date], - mergedBy: Option[ApiUser]): WebHookPullRequestPayload = { + mergedComment: Option[(IssueComment, Account)]): WebHookPullRequestPayload = { val headRepoPayload = ApiRepository(headRepository, headOwner) val baseRepoPayload = ApiRepository(baseRepository, baseOwner) val senderPayload = ApiUser(sender) val pr = ApiPullRequest( - issue = issue, - pullRequest = pullRequest, - headRepo = headRepoPayload, - baseRepo = baseRepoPayload, - user = ApiUser(issueUser), - merged = merged, - mergedAt = mergedAt, - mergedBy = mergedBy + issue = issue, + pullRequest = pullRequest, + headRepo = headRepoPayload, + baseRepo = baseRepoPayload, + user = ApiUser(issueUser), + mergedComment = mergedComment ) WebHookPullRequestPayload( @@ -463,9 +447,7 @@ baseRepository: RepositoryInfo, baseOwner: Account, sender: Account, - merged: Boolean, - mergedAt: Option[Date], - mergedBy: Option[ApiUser] + mergedComment: Option[(IssueComment, Account)] ) : WebHookPullRequestReviewCommentPayload = { val headRepoPayload = ApiRepository(headRepository, headOwner) val baseRepoPayload = ApiRepository(baseRepository, baseOwner) @@ -480,14 +462,12 @@ issueId = issue.issueId ), pull_request = ApiPullRequest( - issue = issue, - pullRequest = pullRequest, - headRepo = headRepoPayload, - baseRepo = baseRepoPayload, - user = ApiUser(issueUser), - merged = merged, - mergedAt = mergedAt, - mergedBy = mergedBy + issue = issue, + pullRequest = pullRequest, + headRepo = headRepoPayload, + baseRepo = baseRepoPayload, + user = ApiUser(issueUser), + mergedComment = mergedComment ), repository = baseRepoPayload, sender = senderPayload)