mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-12-23 00:39:53 +01:00
Add list-milestones and get-a-milestone API (#2546)
This commit is contained in:
51
src/main/scala/gitbucket/core/api/ApiMilestone.scala
Normal file
51
src/main/scala/gitbucket/core/api/ApiMilestone.scala
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package gitbucket.core.api
|
||||||
|
|
||||||
|
import gitbucket.core.model.{Milestone, Repository}
|
||||||
|
import gitbucket.core.util.RepositoryName
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://docs.github.com/en/rest/reference/issues#milestones
|
||||||
|
*/
|
||||||
|
case class ApiMilestone(
|
||||||
|
url: ApiPath,
|
||||||
|
html_url: ApiPath,
|
||||||
|
// label_url: ApiPath,
|
||||||
|
id: Int,
|
||||||
|
number: Int,
|
||||||
|
state: String,
|
||||||
|
title: String,
|
||||||
|
description: String,
|
||||||
|
creator: ApiUser,
|
||||||
|
open_issues: Int,
|
||||||
|
closed_issues: Int,
|
||||||
|
// created_at: Option[Date],
|
||||||
|
// updated_at: Option[Date],
|
||||||
|
closed_at: Option[Date],
|
||||||
|
due_on: Option[Date]
|
||||||
|
)
|
||||||
|
|
||||||
|
object ApiMilestone {
|
||||||
|
def apply(
|
||||||
|
repository: Repository,
|
||||||
|
milestone: Milestone,
|
||||||
|
user: ApiUser,
|
||||||
|
open_issue_count: Int = 0,
|
||||||
|
closed_issue_count: Int = 0
|
||||||
|
): ApiMilestone =
|
||||||
|
ApiMilestone(
|
||||||
|
url = ApiPath(s"/api/v3/repos/${RepositoryName(repository).fullName}/milestones/${milestone.milestoneId}"),
|
||||||
|
html_url = ApiPath(s"/${RepositoryName(repository).fullName}/issues?milestone=${milestone.title}&state=open"),
|
||||||
|
// label_url = ApiPath(s"/api/v3/repos/${RepositoryName(repository).fullName}/milestones/${milestone_number}/labels"),
|
||||||
|
id = milestone.milestoneId,
|
||||||
|
number = milestone.milestoneId, // use milestoneId as number
|
||||||
|
state = if (milestone.closedDate.isDefined) "closed" else "open",
|
||||||
|
title = milestone.title,
|
||||||
|
description = milestone.description.getOrElse(""),
|
||||||
|
creator = user,
|
||||||
|
open_issues = open_issue_count,
|
||||||
|
closed_issues = closed_issue_count,
|
||||||
|
closed_at = milestone.closedDate,
|
||||||
|
due_on = milestone.dueDate
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ class ApiController
|
|||||||
with ApiIssueCommentControllerBase
|
with ApiIssueCommentControllerBase
|
||||||
with ApiIssueControllerBase
|
with ApiIssueControllerBase
|
||||||
with ApiIssueLabelControllerBase
|
with ApiIssueLabelControllerBase
|
||||||
|
with ApiIssueMilestoneControllerBase
|
||||||
with ApiOrganizationControllerBase
|
with ApiOrganizationControllerBase
|
||||||
with ApiPullRequestControllerBase
|
with ApiPullRequestControllerBase
|
||||||
with ApiReleaseControllerBase
|
with ApiReleaseControllerBase
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package gitbucket.core.controller.api
|
||||||
|
import gitbucket.core.api._
|
||||||
|
import gitbucket.core.controller.ControllerBase
|
||||||
|
import gitbucket.core.service.MilestonesService
|
||||||
|
import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator}
|
||||||
|
import gitbucket.core.util.Implicits._
|
||||||
|
import org.scalatra.NoContent
|
||||||
|
|
||||||
|
trait ApiIssueMilestoneControllerBase extends ControllerBase {
|
||||||
|
self: MilestonesService with WritableUsersAuthenticator with ReferrerAuthenticator =>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* i. List milestones
|
||||||
|
* https://docs.github.com/en/rest/reference/issues#list-milestones
|
||||||
|
*/
|
||||||
|
get("/api/v3/repos/:owner/:repository/milestones")(referrersOnly { repository =>
|
||||||
|
val state = params.getOrElse("state", "all")
|
||||||
|
// TODO "sort", "direction" params should be implemented.
|
||||||
|
val apiMilestones = (for (milestoneWithIssue <- getMilestonesWithIssueCount(repository.owner, repository.name)
|
||||||
|
.sortBy(p => p._1.milestoneId))
|
||||||
|
yield {
|
||||||
|
ApiMilestone(
|
||||||
|
repository.repository,
|
||||||
|
milestoneWithIssue._1,
|
||||||
|
ApiUser(context.loginAccount.get),
|
||||||
|
milestoneWithIssue._2,
|
||||||
|
milestoneWithIssue._3
|
||||||
|
)
|
||||||
|
}).reverse
|
||||||
|
state match {
|
||||||
|
case "all" => JsonFormat(apiMilestones)
|
||||||
|
case "open" | "closed" =>
|
||||||
|
JsonFormat(
|
||||||
|
apiMilestones.filter(p => p.state == state)
|
||||||
|
)
|
||||||
|
case _ => NotFound()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ii. Create a milestone
|
||||||
|
* https://docs.github.com/en/rest/reference/issues#create-a-milestone
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* iii. Get a milestone
|
||||||
|
* https://docs.github.com/en/rest/reference/issues#get-a-milestone
|
||||||
|
*/
|
||||||
|
get("/api/v3/repos/:owner/:repository/milestones/:number")(referrersOnly { repository =>
|
||||||
|
val milestoneId = params("number").toInt // use milestoneId as number
|
||||||
|
getMilestonesWithIssueCount(repository.owner, repository.name)
|
||||||
|
.find(p => p._1.milestoneId == milestoneId) match {
|
||||||
|
case Some(milestoneWithIssue) =>
|
||||||
|
JsonFormat(
|
||||||
|
ApiMilestone(
|
||||||
|
repository.repository,
|
||||||
|
milestoneWithIssue._1,
|
||||||
|
ApiUser(context.loginAccount.get),
|
||||||
|
milestoneWithIssue._2,
|
||||||
|
milestoneWithIssue._3
|
||||||
|
)
|
||||||
|
)
|
||||||
|
case _ => NotFound()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* iv.Update a milestone
|
||||||
|
* https://docs.github.com/en/rest/reference/issues#update-a-milestone
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* v. Delete a milestone
|
||||||
|
* https://docs.github.com/en/rest/reference/issues#delete-a-milestone
|
||||||
|
*/
|
||||||
|
delete("/api/v3/repos/:owner/:repository/milestones/:number")(writableUsersOnly { repository =>
|
||||||
|
val milestoneId = params("number").toInt // use milestoneId as number
|
||||||
|
deleteMilestone(repository.owner, repository.name, milestoneId)
|
||||||
|
NoContent()
|
||||||
|
})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user