add create a milestone and update a milestone api (#2561)

This commit is contained in:
onukura
2020-10-02 07:54:29 +09:00
committed by GitHub
parent cbddc34bfa
commit b5ee074075
3 changed files with 71 additions and 16 deletions

View File

@@ -0,0 +1,14 @@
package gitbucket.core.api
import java.util.Date
case class CreateAMilestone(
title: String,
state: String = "open",
description: Option[String],
due_on: Option[Date]
) {
def isValid: Boolean = {
title.length <= 100 && title.matches("[a-zA-Z0-9\\-\\+_.]+")
}
}

View File

@@ -1,7 +1,9 @@
package gitbucket.core.controller.api
import gitbucket.core.api._
import gitbucket.core.controller.ControllerBase
import gitbucket.core.model.Repository
import gitbucket.core.service.MilestonesService
import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator}
import gitbucket.core.util.Implicits._
import org.scalatra.NoContent
@@ -41,6 +43,21 @@ trait ApiIssueMilestoneControllerBase extends ControllerBase {
* ii. Create a milestone
* https://docs.github.com/en/rest/reference/issues#create-a-milestone
*/
post("/api/v3/repos/:owner/:repository/milestones")(writableUsersOnly { repository =>
(for {
data <- extractFromJsonBody[CreateAMilestone] if data.isValid
milestoneId = createMilestone(
repository.owner,
repository.name,
data.title,
data.description,
data.due_on
)
apiMilestone <- getApiMilestone(repository, milestoneId)
} yield {
JsonFormat(apiMilestone)
}) getOrElse NotFound()
})
/*
* iii. Get a milestone
@@ -48,26 +65,34 @@ trait ApiIssueMilestoneControllerBase extends ControllerBase {
*/
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()
}
(for (apiMilestone <- getApiMilestone(repository, milestoneId)) yield {
JsonFormat(apiMilestone)
}) getOrElse NotFound()
})
/*
* iv.Update a milestone
* https://docs.github.com/en/rest/reference/issues#update-a-milestone
*/
patch("/api/v3/repos/:owner/:repository/milestones/:number")(writableUsersOnly { repository =>
val milestoneId = params("number").toInt
(for {
data <- extractFromJsonBody[CreateAMilestone] if data.isValid
milestone <- getMilestone(repository.owner, repository.name, milestoneId)
_ = (data.state, milestone.closedDate) match {
case ("open", Some(_)) =>
openMilestone(milestone)
case ("closed", None) =>
closeMilestone(milestone)
case _ =>
}
milestone <- getMilestone(repository.owner, repository.name, milestoneId)
_ = updateMilestone(milestone.copy(title = data.title, description = data.description, dueDate = data.due_on))
apiMilestone <- getApiMilestone(repository, milestoneId)
} yield {
JsonFormat(apiMilestone)
}) getOrElse NotFound()
})
/*
* v. Delete a milestone
@@ -78,4 +103,19 @@ trait ApiIssueMilestoneControllerBase extends ControllerBase {
deleteMilestone(repository.owner, repository.name, milestoneId)
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,
ApiUser(context.loginAccount.get),
milestoneWithIssue._2,
milestoneWithIssue._3
)
)
}
}

View File

@@ -13,8 +13,8 @@ trait MilestonesService {
title: String,
description: Option[String],
dueDate: Option[java.util.Date]
)(implicit s: Session): Unit =
Milestones insert Milestone(
)(implicit s: Session): Int = {
Milestones returning Milestones.map(_.milestoneId) insert Milestone(
userName = owner,
repositoryName = repository,
title = title,
@@ -22,6 +22,7 @@ trait MilestonesService {
dueDate = dueDate,
closedDate = None
)
}
def updateMilestone(milestone: Milestone)(implicit s: Session): Unit =
Milestones