diff --git a/src/main/scala/gitbucket/core/controller/ApiController.scala b/src/main/scala/gitbucket/core/controller/ApiController.scala index b48602f44..8a465d471 100644 --- a/src/main/scala/gitbucket/core/controller/ApiController.scala +++ b/src/main/scala/gitbucket/core/controller/ApiController.scala @@ -287,6 +287,32 @@ trait ApiControllerBase extends ControllerBase { org.scalatra.NotFound(ApiError("Rate limiting is not enabled.")) } + /** + * https://developer.github.com/v3/issues/#list-issues-for-a-repository + */ + get("/api/v3/repos/:owner/:repository/issues")(referrersOnly { repository => + val page = IssueSearchCondition.page(request) + // TODO: more api spec condition + val condition = IssueSearchCondition(request) + val baseOwner = getAccountByUserName(repository.owner).get + + val issues: List[(Issue, Account)] = + searchIssueByApi( + condition = condition, + offset = (page - 1) * PullRequestLimit, + limit = PullRequestLimit, + repos = repository.owner -> repository.name + ) + + JsonFormat(issues.map { case (issue, issueUser) => + ApiIssue( + issue = issue, + repositoryName = RepositoryName(repository), + user = ApiUser(issueUser) + ) + }) + }) + /** * https://developer.github.com/v3/issues/#get-a-single-issue */ diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala index 591fb11c0..6a9769da3 100644 --- a/src/main/scala/gitbucket/core/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -190,6 +190,19 @@ trait IssuesService { }} toList } + /** for api + * @return (issue, issueUser, commentCount) + */ + def searchIssueByApi(condition: IssueSearchCondition, offset: Int, limit: Int, repos: (String, String)*) + (implicit s: Session): List[(Issue, Account)] = { + // get issues and comment count and labels + searchIssueQueryBase(condition, false, offset, limit, repos) + .innerJoin(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) } + .list + } + /** for api * @return (issue, issueUser, commentCount, pullRequest, headRepo, headOwner) */