diff --git a/src/main/scala/gitbucket/core/api/ApiIssue.scala b/src/main/scala/gitbucket/core/api/ApiIssue.scala index 8ab694e..a686cd4 100644 --- a/src/main/scala/gitbucket/core/api/ApiIssue.scala +++ b/src/main/scala/gitbucket/core/api/ApiIssue.scala @@ -17,7 +17,8 @@ state: String, created_at: Date, updated_at: Date, - body: String + body: String, + milestone: Option[ApiMilestone] )(repositoryName: RepositoryName, isPullRequest: Boolean) { val id = 0 // dummy id val assignees = List(assignee).flatten @@ -43,7 +44,8 @@ repositoryName: RepositoryName, user: ApiUser, assignee: Option[ApiUser], - labels: List[ApiLabel] + labels: List[ApiLabel], + milestone: Option[ApiMilestone] ): ApiIssue = ApiIssue( number = issue.issueId, @@ -51,6 +53,7 @@ user = user, assignee = assignee, labels = labels, + milestone = milestone, state = if (issue.closed) { "closed" } else { "open" }, body = issue.content.getOrElse(""), created_at = issue.registeredDate, diff --git a/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala index b1eaf5f..350ad44 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala @@ -47,7 +47,8 @@ user = ApiUser(issueUser), assignee = assignedUser.map(ApiUser(_)), labels = getIssueLabels(repository.owner, repository.name, issue.issueId) - .map(ApiLabel(_, RepositoryName(repository))) + .map(ApiLabel(_, RepositoryName(repository))), + issue.milestoneId.flatMap { getApiMilestone(repository, _) } ) }) }) @@ -69,7 +70,8 @@ RepositoryName(repository), ApiUser(openedUser), issue.assignedUserName.flatMap(users.get(_)).map(ApiUser(_)), - getIssueLabels(repository.owner, repository.name, issue.issueId).map(ApiLabel(_, RepositoryName(repository))) + getIssueLabels(repository.owner, repository.name, issue.issueId).map(ApiLabel(_, RepositoryName(repository))), + issue.milestoneId.flatMap { getApiMilestone(repository, _) } ) ) }) getOrElse NotFound() @@ -103,7 +105,8 @@ ApiUser(loginAccount), issue.assignedUserName.flatMap(getAccountByUserName(_)).map(ApiUser(_)), getIssueLabels(repository.owner, repository.name, issue.issueId) - .map(ApiLabel(_, RepositoryName(repository))) + .map(ApiLabel(_, RepositoryName(repository))), + issue.milestoneId.flatMap { getApiMilestone(repository, _) } ) ) }) getOrElse NotFound() diff --git a/src/main/scala/gitbucket/core/controller/api/ApiIssueMilestoneControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiIssueMilestoneControllerBase.scala index ec55ac0..246520f 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiIssueMilestoneControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiIssueMilestoneControllerBase.scala @@ -102,17 +102,4 @@ NoContent() }) - private def getApiMilestone(repository: RepositoryInfo, milestoneId: Int): Option[ApiMilestone] = { - getMilestonesWithIssueCount(repository.owner, repository.name) - .find(p => p._1.milestoneId == milestoneId) - .map( - milestoneWithIssue => - ApiMilestone( - repository.repository, - milestoneWithIssue._1, - milestoneWithIssue._2, - milestoneWithIssue._3 - ) - ) - } } diff --git a/src/main/scala/gitbucket/core/service/MilestonesService.scala b/src/main/scala/gitbucket/core/service/MilestonesService.scala index f5f9849..9bff3cc 100644 --- a/src/main/scala/gitbucket/core/service/MilestonesService.scala +++ b/src/main/scala/gitbucket/core/service/MilestonesService.scala @@ -1,9 +1,11 @@ package gitbucket.core.service +import gitbucket.core.api.ApiMilestone import gitbucket.core.model.Milestone import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.model.Profile.dateColumnType +import gitbucket.core.service.RepositoryService.RepositoryInfo trait MilestonesService { @@ -73,4 +75,17 @@ .sortBy(t => (t.dueDate.asc, t.closedDate.desc, t.milestoneId.desc)) .list + def getApiMilestone(repository: RepositoryInfo, milestoneId: Int)(implicit s: Session): Option[ApiMilestone] = { + getMilestonesWithIssueCount(repository.owner, repository.name) + .find(p => p._1.milestoneId == milestoneId) + .map( + milestoneWithIssue => + ApiMilestone( + repository.repository, + milestoneWithIssue._1, + milestoneWithIssue._2, + milestoneWithIssue._3 + ) + ) + } } diff --git a/src/main/scala/gitbucket/core/service/WebHookService.scala b/src/main/scala/gitbucket/core/service/WebHookService.scala index 0986fe8..f064597 100644 --- a/src/main/scala/gitbucket/core/service/WebHookService.scala +++ b/src/main/scala/gitbucket/core/service/WebHookService.scala @@ -35,6 +35,7 @@ import org.apache.http.HttpResponse import gitbucket.core.model.WebHookContentType import gitbucket.core.service.SystemSettingsService.SystemSettings +import gitbucket.core.view.helpers.getApiMilestone import org.apache.http.client.entity.EntityBuilder import org.apache.http.entity.ContentType @@ -394,7 +395,8 @@ ApiUser(issueUser), issue.assignedUserName.flatMap(users.get(_)).map(ApiUser(_)), getIssueLabels(repository.owner, repository.name, issue.issueId) - .map(ApiLabel(_, RepositoryName(repository))) + .map(ApiLabel(_, RepositoryName(repository))), + getApiMilestone(repository, issue.milestoneId getOrElse (0)) ), sender = ApiUser(sender) ) @@ -576,6 +578,7 @@ commenter <- users.get(issueComment.commentedUserName) assignedUser = issue.assignedUserName.flatMap(users.get(_)) labels = getIssueLabels(repository.owner, repository.name, issue.issueId) + milestone = getApiMilestone(repository, issue.milestoneId getOrElse (0)) } yield { WebHookIssueCommentPayload( issue = issue, @@ -586,7 +589,8 @@ repositoryUser = repoOwner, assignedUser = assignedUser, sender = sender, - labels = labels + labels = labels, + milestone = milestone ) } } @@ -760,7 +764,8 @@ repositoryUser: Account, assignedUser: Option[Account], sender: Account, - labels: List[Label] + labels: List[Label], + milestone: Option[ApiMilestone] ): WebHookIssueCommentPayload = WebHookIssueCommentPayload( action = "created", @@ -770,7 +775,8 @@ RepositoryName(repository), ApiUser(issueUser), assignedUser.map(ApiUser(_)), - labels.map(ApiLabel(_, RepositoryName(repository))) + labels.map(ApiLabel(_, RepositoryName(repository))), + milestone ), comment = ApiComment(comment, RepositoryName(repository), issue.issueId, ApiUser(commentUser), issue.isPullRequest), diff --git a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala index 781f34b..7511382 100644 --- a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala +++ b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala @@ -177,6 +177,16 @@ updatedDate = date1 ) + val milestone = Milestone( + userName = repo1Name.owner, + repositoryName = repo1Name.name, + milestoneId = 1, + title = "Test milestone", + description = Some("Milestone description"), + dueDate = Some(date1), + closedDate = Some(date1) + ) + // APIs val apiUser = ApiUser(account) @@ -193,12 +203,20 @@ repositoryName = repo1Name ) + val apiMilestone = ApiMilestone( + repository = repository, + milestone = milestone, + open_issue_count = 1, + closed_issue_count = 1 + ) + val apiIssue = ApiIssue( issue = issue, repositoryName = repo1Name, user = apiUser, assignee = Some(apiUser), - labels = List(apiLabel) + labels = List(apiLabel), + milestone = Some(apiMilestone) ) val apiNotAssignedIssue = ApiIssue( @@ -206,7 +224,8 @@ repositoryName = repo1Name, user = apiUser, assignee = None, - labels = List(apiLabel) + labels = List(apiLabel), + milestone = Some(apiMilestone) ) val apiIssuePR = ApiIssue( @@ -214,7 +233,8 @@ repositoryName = repo1Name, user = apiUser, assignee = Some(apiUser), - labels = List(apiLabel) + labels = List(apiLabel), + milestone = Some(apiMilestone) ) val apiComment = ApiComment( @@ -471,6 +491,19 @@ val jsonLabel = """{"name":"bug","color":"f29513","url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/labels/bug"}""" + val jsonMilestone = """{ + |"url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/milestones/1", + |"html_url":"http://gitbucket.exmple.com/octocat/Hello-World/milestone/1", + |"id":1, + |"number":1, + |"state":"closed", + |"title":"Test milestone", + |"description":"Milestone description", + |"open_issues":1,"closed_issues":1, + |"closed_at":"2011-04-14T16:00:49Z", + |"due_on":"2011-04-14T16:00:49Z" + |}""".stripMargin + val jsonIssue = s"""{ |"number":1347, |"title":"Found a bug", @@ -481,6 +514,7 @@ |"created_at":"2011-04-14T16:00:49Z", |"updated_at":"2011-04-14T16:00:49Z", |"body":"I'm having a problem with this.", + |"milestone":$jsonMilestone, |"id":0, |"assignees":[$jsonUser], |"comments_url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/issues/1347/comments", @@ -496,6 +530,7 @@ |"created_at":"2011-04-14T16:00:49Z", |"updated_at":"2011-04-14T16:00:49Z", |"body":"I'm having a problem with this.", + |"milestone":$jsonMilestone, |"id":0, |"assignees":[], |"comments_url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/issues/1347/comments", @@ -512,6 +547,7 @@ |"created_at":"2011-04-14T16:00:49Z", |"updated_at":"2011-04-14T16:00:49Z", |"body":"Please pull these awesome changes", + |"milestone":$jsonMilestone, |"id":0, |"assignees":[$jsonUser], |"comments_url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/issues/1347/comments", diff --git a/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala b/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala index a3b75d0..11deadc 100644 --- a/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala +++ b/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala @@ -121,7 +121,8 @@ repositoryUser = account, assignedUser = Some(account), sender = account, - labels = List(label) + labels = List(label), + milestone = Some(apiMilestone) ) val expected = s"""{ |"action":"created",