mirror of
https://github.com/ysoftdevs/odc-analyzer.git
synced 2026-03-20 08:15:19 +01:00
Minor JiraIssueTrackerService refactoring
This commit is contained in:
@@ -8,7 +8,7 @@ import controllers.{ReportInfo, Vulnerability, friendlyProjectNameString, routes
|
|||||||
import models.ExportedVulnerability
|
import models.ExportedVulnerability
|
||||||
import play.api.libs.json.Json.JsValueWrapper
|
import play.api.libs.json.Json.JsValueWrapper
|
||||||
import play.api.libs.json._
|
import play.api.libs.json._
|
||||||
import play.api.libs.ws.{WS, WSClient}
|
import play.api.libs.ws.{WS, WSClient, WSResponse}
|
||||||
import services.JiraIssueTrackerService.Fields
|
import services.JiraIssueTrackerService.Fields
|
||||||
|
|
||||||
import scala.concurrent.{ExecutionContext, Future}
|
import scala.concurrent.{ExecutionContext, Future}
|
||||||
@@ -59,6 +59,25 @@ class JiraIssueTrackerService @Inject()(absolutizer: Absolutizer, @Named("jira-s
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private implicit class RichFutureResponse(r: Future[WSResponse]){
|
||||||
|
def requireSuccess: Future[WSResponse] = {
|
||||||
|
r.map{ resp =>
|
||||||
|
if(resp.status != 200){
|
||||||
|
sys.error(s"Request expected to end with success, but it has failed with ${resp.status} / ${resp.statusText}.")
|
||||||
|
}
|
||||||
|
resp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
def requireStatus(expectedStatus: Int): Future[WSResponse] = {
|
||||||
|
r.map{ resp =>
|
||||||
|
if(resp.status != expectedStatus){
|
||||||
|
sys.error(s"Request expected to end with status $expectedStatus, but it has failed with ${resp.status} / ${resp.statusText}.")
|
||||||
|
}
|
||||||
|
resp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override def updateVulnerability(vuln: Vulnerability, diff: SetDiff[ReportInfo], ticket: String): Future[Unit] = {
|
override def updateVulnerability(vuln: Vulnerability, diff: SetDiff[ReportInfo], ticket: String): Future[Unit] = {
|
||||||
val requiredTransitionOption = diff.whichNonEmpty match {
|
val requiredTransitionOption = diff.whichNonEmpty match {
|
||||||
case SetDiff.Selection.Old => noRelevantProjectAffectedTransitionNameOption
|
case SetDiff.Selection.Old => noRelevantProjectAffectedTransitionNameOption
|
||||||
@@ -66,8 +85,7 @@ class JiraIssueTrackerService @Inject()(absolutizer: Absolutizer, @Named("jira-s
|
|||||||
case SetDiff.Selection.None => sys.error("this should not happpen")
|
case SetDiff.Selection.None => sys.error("this should not happpen")
|
||||||
}
|
}
|
||||||
val transitionOptionFuture = requiredTransitionOption.map{ requiredTransition =>
|
val transitionOptionFuture = requiredTransitionOption.map{ requiredTransition =>
|
||||||
api(s"issue/$ticket/transitions").get().map{resp =>
|
api(s"issue/$ticket/transitions").get().requireSuccess.map{resp =>
|
||||||
assert(resp.status == 200)
|
|
||||||
resp.json.validate[Transitions].recover{case e => sys.error(s"Bad JSON: "+e+"\n\n"+resp.json)}.get.transitions.filter(_.name == requiredTransition) match {
|
resp.json.validate[Transitions].recover{case e => sys.error(s"Bad JSON: "+e+"\n\n"+resp.json)}.get.transitions.filter(_.name == requiredTransition) match {
|
||||||
case Seq() => None
|
case Seq() => None
|
||||||
case Seq(i) => Some(i)
|
case Seq(i) => Some(i)
|
||||||
@@ -79,12 +97,7 @@ class JiraIssueTrackerService @Inject()(absolutizer: Absolutizer, @Named("jira-s
|
|||||||
val fieldsJson = Json.obj(
|
val fieldsJson = Json.obj(
|
||||||
"fields" -> extractManagedFields(vuln, diff.newSet)
|
"fields" -> extractManagedFields(vuln, diff.newSet)
|
||||||
)
|
)
|
||||||
api(s"issue/$ticket").put(transitionJson ++ fieldsJson).map{ resp =>
|
api(s"issue/$ticket").put(transitionJson ++ fieldsJson).requireStatus(204).map{ resp => () }
|
||||||
if(resp.status != 204){
|
|
||||||
sys.error("Update failed: "+resp.body)
|
|
||||||
}
|
|
||||||
()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user