diff --git a/src/main/scala/gitbucket/core/api/ApiIssue.scala b/src/main/scala/gitbucket/core/api/ApiIssue.scala index 5688ae0..8ab694e 100644 --- a/src/main/scala/gitbucket/core/api/ApiIssue.scala +++ b/src/main/scala/gitbucket/core/api/ApiIssue.scala @@ -12,6 +12,7 @@ number: Int, title: String, user: ApiUser, + assignee: Option[ApiUser], labels: List[ApiLabel], state: String, created_at: Date, @@ -19,6 +20,7 @@ body: String )(repositoryName: RepositoryName, isPullRequest: Boolean) { val id = 0 // dummy id + val assignees = List(assignee).flatten val comments_url = ApiPath(s"/api/v3/repos/${repositoryName.fullName}/issues/${number}/comments") val html_url = ApiPath(s"/${repositoryName.fullName}/${if (isPullRequest) { "pull" } else { "issues" }}/${number}") val pull_request = if (isPullRequest) { @@ -36,11 +38,18 @@ } object ApiIssue { - def apply(issue: Issue, repositoryName: RepositoryName, user: ApiUser, labels: List[ApiLabel]): ApiIssue = + def apply( + issue: Issue, + repositoryName: RepositoryName, + user: ApiUser, + assignee: Option[ApiUser], + labels: List[ApiLabel] + ): ApiIssue = ApiIssue( number = issue.issueId, title = issue.title, user = user, + assignee = assignee, labels = labels, state = if (issue.closed) { "closed" } else { "open" }, body = issue.content.getOrElse(""), diff --git a/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala index 12f44be..8d6b735 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiIssueControllerBase.scala @@ -31,7 +31,7 @@ val condition = IssueSearchCondition(request) val baseOwner = getAccountByUserName(repository.owner).get - val issues: List[(Issue, Account)] = + val issues: List[(Issue, Account, Option[Account])] = searchIssueByApi( condition = condition, offset = (page - 1) * PullRequestLimit, @@ -40,11 +40,12 @@ ) JsonFormat(issues.map { - case (issue, issueUser) => + case (issue, issueUser, assignedUser) => ApiIssue( issue = issue, repositoryName = RepositoryName(repository), user = ApiUser(issueUser), + assignee = assignedUser.map(ApiUser(_)), labels = getIssueLabels(repository.owner, repository.name, issue.issueId) .map(ApiLabel(_, RepositoryName(repository))) ) @@ -59,13 +60,15 @@ (for { issueId <- params("id").toIntOpt issue <- getIssue(repository.owner, repository.name, issueId.toString) - openedUser <- getAccountByUserName(issue.openedUserName) + users = getAccountsByUserNames(Set(issue.openedUserName) ++ issue.assignedUserName, Set()) + openedUser <- users.get(issue.openedUserName) } yield { JsonFormat( ApiIssue( issue, RepositoryName(repository), ApiUser(openedUser), + issue.assignedUserName.flatMap(users.get(_)).map(ApiUser(_)), getIssueLabels(repository.owner, repository.name, issue.issueId).map(ApiLabel(_, RepositoryName(repository))) ) ) @@ -98,6 +101,7 @@ issue, RepositoryName(repository), ApiUser(loginAccount), + issue.assignedUserName.flatMap(getAccountByUserName(_)).map(ApiUser(_)), getIssueLabels(repository.owner, repository.name, issue.issueId) .map(ApiLabel(_, RepositoryName(repository))) ) diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala index 9dbc344..2a128f9 100644 --- a/src/main/scala/gitbucket/core/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -265,17 +265,19 @@ } /** for api - * @return (issue, issueUser, commentCount) + * @return (issue, issueUser, assignedUser) */ def searchIssueByApi(condition: IssueSearchCondition, offset: Int, limit: Int, repos: (String, String)*)( implicit s: Session - ): List[(Issue, Account)] = { + ): List[(Issue, Account, Option[Account])] = { // get issues and comment count and labels searchIssueQueryBase(condition, false, offset, limit, repos) .join(Accounts) .on { case t1 ~ t2 ~ i ~ t3 => t3.userName === t1.openedUserName } - .sortBy { case t1 ~ t2 ~ i ~ t3 => i asc } - .map { case t1 ~ t2 ~ i ~ t3 => (t1, t3) } + .joinLeft(Accounts) + .on { case t1 ~ t2 ~ i ~ t3 ~ t4 => t4.userName === t1.assignedUserName } + .sortBy { case t1 ~ t2 ~ i ~ t3 ~ t4 => i asc } + .map { case t1 ~ t2 ~ i ~ t3 ~ t4 => (t1, t3, t4) } .list } diff --git a/src/main/scala/gitbucket/core/service/WebHookService.scala b/src/main/scala/gitbucket/core/service/WebHookService.scala index 4da84b0..7889c4d 100644 --- a/src/main/scala/gitbucket/core/service/WebHookService.scala +++ b/src/main/scala/gitbucket/core/service/WebHookService.scala @@ -318,7 +318,8 @@ sender: Account )(implicit s: Session, context: JsonFormat.Context): Unit = { callWebHookOf(repository.owner, repository.name, WebHook.Issues) { - val users = getAccountsByUserNames(Set(repository.owner, issue.openedUserName), Set(sender)) + val users = + getAccountsByUserNames(Set(repository.owner, issue.openedUserName) ++ issue.assignedUserName, Set(sender)) for { repoOwner <- users.get(repository.owner) issueUser <- users.get(issue.openedUserName) @@ -331,6 +332,7 @@ issue, RepositoryName(repository), ApiUser(issueUser), + issue.assignedUserName.flatMap(users.get(_)).map(ApiUser(_)), getIssueLabels(repository.owner, repository.name, issue.issueId) .map(ApiLabel(_, RepositoryName(repository))) ), @@ -502,12 +504,13 @@ for { issueComment <- getComment(repository.owner, repository.name, issueCommentId.toString()) users = getAccountsByUserNames( - Set(issue.openedUserName, repository.owner, issueComment.commentedUserName), + Set(issue.openedUserName, repository.owner, issueComment.commentedUserName) ++ issue.assignedUserName, Set(sender) ) issueUser <- users.get(issue.openedUserName) repoOwner <- users.get(repository.owner) commenter <- users.get(issueComment.commentedUserName) + assignedUser = issue.assignedUserName.flatMap(users.get(_)) labels = getIssueLabels(repository.owner, repository.name, issue.issueId) } yield { WebHookIssueCommentPayload( @@ -517,6 +520,7 @@ commentUser = commenter, repository = repository, repositoryUser = repoOwner, + assignedUser = assignedUser, sender = sender, labels = labels ) @@ -690,6 +694,7 @@ commentUser: Account, repository: RepositoryInfo, repositoryUser: Account, + assignedUser: Option[Account], sender: Account, labels: List[Label] ): WebHookIssueCommentPayload = @@ -700,6 +705,7 @@ issue, RepositoryName(repository), ApiUser(issueUser), + assignedUser.map(ApiUser(_)), labels.map(ApiLabel(_, RepositoryName(repository))) ), comment = diff --git a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala index 4ae63fb..2844e3c 100644 --- a/src/test/scala/gitbucket/core/api/ApiSpecModels.scala +++ b/src/test/scala/gitbucket/core/api/ApiSpecModels.scala @@ -195,6 +195,15 @@ issue = issue, repositoryName = repo1Name, user = apiUser, + assignee = Some(apiUser), + labels = List(apiLabel) + ) + + val apiNotAssignedIssue = ApiIssue( + issue = issue, + repositoryName = repo1Name, + user = apiUser, + assignee = None, labels = List(apiLabel) ) @@ -202,6 +211,7 @@ issue = issuePR, repositoryName = repo1Name, user = apiUser, + assignee = Some(apiUser), labels = List(apiLabel) ) @@ -449,12 +459,29 @@ |"number":1347, |"title":"Found a bug", |"user":$jsonUser, + |"assignee":$jsonUser, |"labels":[$jsonLabel], |"state":"open", |"created_at":"2011-04-14T16:00:49Z", |"updated_at":"2011-04-14T16:00:49Z", |"body":"I'm having a problem with this.", |"id":0, + |"assignees":[$jsonUser], + |"comments_url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/issues/1347/comments", + |"html_url":"http://gitbucket.exmple.com/octocat/Hello-World/issues/1347" + |}""".stripMargin + + val jsonNotAssignedIssue = s"""{ + |"number":1347, + |"title":"Found a bug", + |"user":$jsonUser, + |"labels":[$jsonLabel], + |"state":"open", + |"created_at":"2011-04-14T16:00:49Z", + |"updated_at":"2011-04-14T16:00:49Z", + |"body":"I'm having a problem with this.", + |"id":0, + |"assignees":[], |"comments_url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/issues/1347/comments", |"html_url":"http://gitbucket.exmple.com/octocat/Hello-World/issues/1347" |}""".stripMargin @@ -463,12 +490,14 @@ |"number":1347, |"title":"new-feature", |"user":$jsonUser, + |"assignee":$jsonUser, |"labels":[$jsonLabel], |"state":"closed", |"created_at":"2011-04-14T16:00:49Z", |"updated_at":"2011-04-14T16:00:49Z", |"body":"Please pull these awesome changes", |"id":0, + |"assignees":[$jsonUser], |"comments_url":"http://gitbucket.exmple.com/api/v3/repos/octocat/Hello-World/issues/1347/comments", |"html_url":"http://gitbucket.exmple.com/octocat/Hello-World/pull/1347", |"pull_request":{ diff --git a/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala b/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala index 6a6ee26..8db4e52 100644 --- a/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala +++ b/src/test/scala/gitbucket/core/api/JsonFormatSpec.scala @@ -34,6 +34,7 @@ } test("apiIssue") { assert(JsonFormat(apiIssue) == expected(jsonIssue)) + assert(JsonFormat(apiNotAssignedIssue) == expected(jsonNotAssignedIssue)) assert(JsonFormat(apiIssuePR) == expected(jsonIssuePR)) } test("apiPullRequest") { diff --git a/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala b/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala index 2a1deae..98f7916 100644 --- a/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala +++ b/src/test/scala/gitbucket/core/service/WebHookJsonFormatSpec.scala @@ -118,6 +118,7 @@ commentUser = account, repository = repositoryInfo, repositoryUser = account, + assignedUser = Some(account), sender = account, labels = List(label) )