Skip to content

Commit b0a9ae1

Browse files
authored
Merge pull request #1024 from hmrc/BDOG-3374
BDOG-3374 Only show requested curation status on vulnerabilities serv…
2 parents 0dab05c + 613f87a commit b0a9ae1

File tree

7 files changed

+72
-41
lines changed

7 files changed

+72
-41
lines changed

app/uk/gov/hmrc/cataloguefrontend/view/partials/code.scala.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
}
5858
@if(repo.repoType == RepoType.Service) {
5959
<li>
60-
<a id="link-to-vulnerabilities" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesList(None, curationStatus = Some(CurationStatus.ActionRequired.asString), Some(s"\"${repo.name}\""), None)">
60+
<a id="link-to-vulnerabilities" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesList(None, curationStatus = Some(CurationStatus.ActionRequired), Some(s"\"${repo.name}\""), None)">
6161
Vulnerabilities
6262
</a>
6363
</li>

app/uk/gov/hmrc/cataloguefrontend/view/standard_layout.scala.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,9 @@
182182
<li><a id="link-to-leak-detection-rules" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.leakdetection.routes.LeakDetectionController.ruleSummaries">Leak Detection - Rules</a></li>
183183
<li><a id="link-to-leak-detection-repositories" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.leakdetection.routes.LeakDetectionController.repoSummaries(includeWarnings = false, includeExemptions = false, includeViolations = true)">Leak Detection - Repositories</a></li>
184184
<li><hr class="dropdown-divider"></li>
185-
<li><a id="link-to-vulnerabilities" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesList(None, curationStatus = Some(CurationStatus.ActionRequired.asString), None, None)">Vulnerabilities</a></li>
185+
<li><a id="link-to-vulnerabilities" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesList(None, curationStatus = Some(CurationStatus.ActionRequired), None, None)">Vulnerabilities</a></li>
186186
<li><a id="link-to-vulnerabilities-services" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesForServices()">Vulnerabilities - Services</a></li>
187-
<li><a id="link-to-vulnerabilities-timeline" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesTimeline(None, None, None, curationStatus = Some(CurationStatus.ActionRequired.asString))">Vulnerabilities - Timeline</a></li>
187+
<li><a id="link-to-vulnerabilities-timeline" class="dropdown-item" href="@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesTimeline(None, None, None, curationStatus = Some(CurationStatus.ActionRequired))">Vulnerabilities - Timeline</a></li>
188188
<li><hr class="dropdown-divider"></li>
189189
<li><a id="link-to-pr-commenter-recommendations" class="dropdown-item" href="@prcommenterRoutes.PrCommenterController.recommendations()">PR-Commenter Recommendations</a></li>
190190
</ul>

app/uk/gov/hmrc/cataloguefrontend/vulnerabilities/CurationStatus.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package uk.gov.hmrc.cataloguefrontend.vulnerabilities
1818

1919
import play.api.libs.json.Reads
20+
import play.api.mvc.QueryStringBindable
2021
import uk.gov.hmrc.cataloguefrontend.util.{FormFormat, FromString, FromStringEnum, Parser}
2122

2223
import FromStringEnum._
@@ -27,7 +28,7 @@ enum CurationStatus(
2728
override val asString: String,
2829
val displayString : String
2930
) extends FromString
30-
derives Ordering, Reads, FormFormat:
31+
derives Ordering, Reads, FormFormat, QueryStringBindable:
3132
case InvestigationOngoing extends CurationStatus(asString = "INVESTIGATION_ONGOING", displayString = "Investigation ongoing")
3233
case NoActionRequired extends CurationStatus(asString = "NO_ACTION_REQUIRED" , displayString = "No action required" )
3334
case ActionRequired extends CurationStatus(asString = "ACTION_REQUIRED" , displayString = "Action required" )

app/uk/gov/hmrc/cataloguefrontend/vulnerabilities/VulnerabilitiesController.scala

+15-12
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class VulnerabilitiesController @Inject() (
5353
*/
5454
def vulnerabilitiesList(
5555
vulnerability : Option[String]
56-
, curationStatus: Option[String]
56+
, curationStatus: Option[CurationStatus]
5757
, service : Option[String]
5858
, team : Option[TeamName]
5959
, flag : Option[String]
@@ -82,16 +82,17 @@ class VulnerabilitiesController @Inject() (
8282
* @param flag for reverse routing
8383
*/
8484
def vulnerabilitiesForServices(
85-
team: Option[TeamName]
86-
, flag: Option[String]
85+
curationStatus: Option[CurationStatus]
86+
, team : Option[TeamName]
87+
, flag : Option[String]
8788
): Action[AnyContent] =
8889
BasicAuthAction.async: request =>
8990
given MessagesRequest[AnyContent] = request
9091
import VulnerabilitiesCountFilter.form
9192
form
9293
.bindFromRequest()
9394
.fold(
94-
formWithErrors => Future.successful(BadRequest(vulnerabilitiesForServicesPage(Seq.empty, Seq.empty, formWithErrors))),
95+
formWithErrors => Future.successful(BadRequest(vulnerabilitiesForServicesPage(curationStatus.getOrElse(CurationStatus.ActionRequired), Seq.empty, Seq.empty, formWithErrors))),
9596
validForm =>
9697
for
9798
teams <- teamsAndRepositoriesConnector.allTeams().map(_.sortBy(_.name.asString.toLowerCase))
@@ -100,7 +101,7 @@ class VulnerabilitiesController @Inject() (
100101
, serviceName = None // Use listJS filters
101102
, team = validForm.team
102103
)
103-
yield Ok(vulnerabilitiesForServicesPage(counts, teams, form.fill(validForm)))
104+
yield Ok(vulnerabilitiesForServicesPage(validForm.curationStatus, counts, teams, form.fill(validForm)))
104105
)
105106

106107
/**
@@ -115,7 +116,7 @@ class VulnerabilitiesController @Inject() (
115116
service : Option[ServiceName]
116117
, team : Option[TeamName]
117118
, vulnerability : Option[String]
118-
, curationStatus: Option[String]
119+
, curationStatus: Option[CurationStatus]
119120
, from : LocalDate
120121
, to : LocalDate
121122
): Action[AnyContent] =
@@ -167,18 +168,20 @@ object VulnerabilitiesExplorerFilter:
167168
)
168169

169170
case class VulnerabilitiesCountFilter(
170-
flag : SlugInfoFlag = SlugInfoFlag.Latest,
171-
service: Option[ServiceName] = None,
172-
team : Option[TeamName] = None,
171+
flag : SlugInfoFlag = SlugInfoFlag.Latest,
172+
service : Option[ServiceName] = None,
173+
team : Option[TeamName] = None,
174+
curationStatus: CurationStatus
173175
)
174176

175177
object VulnerabilitiesCountFilter:
176178
lazy val form: Form[VulnerabilitiesCountFilter] =
177179
Form(
178180
Forms.mapping(
179-
"flag" -> Forms.optional(Forms.of[SlugInfoFlag]).transform(_.getOrElse(SlugInfoFlag.Latest), Some.apply),
180-
"service" -> Forms.optional(Forms.of[ServiceName]),
181-
"team" -> Forms.optional(Forms.of[TeamName]),
181+
"flag" -> Forms.optional(Forms.of[SlugInfoFlag]).transform(_.getOrElse(SlugInfoFlag.Latest), Some.apply),
182+
"service" -> Forms.optional(Forms.of[ServiceName]),
183+
"team" -> Forms.optional(Forms.of[TeamName]),
184+
"curationStatus" -> Forms.optional(Forms.of[CurationStatus]).transform(_.getOrElse(CurationStatus.ActionRequired), Some.apply)
182185
)(VulnerabilitiesCountFilter.apply)(f => Some(Tuple.fromProductTyped(f)))
183186
)
184187

app/uk/gov/hmrc/cataloguefrontend/vulnerabilities/view/VulnerabilitiesForServicesPage.scala.html

+45-19
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
@this()
2222

2323

24-
@(vulnerabilities: Seq[TotalVulnerabilityCount],
25-
teams : Seq[GitHubTeam],
26-
form : Form[VulnerabilitiesCountFilter]
24+
@(curationStatus : CurationStatus,
25+
vulnerabilityCounts: Seq[TotalVulnerabilityCount],
26+
teams : Seq[GitHubTeam],
27+
form : Form[VulnerabilitiesCountFilter]
2728
)(implicit
28-
messages : Messages,
29-
request : RequestHeader
29+
messages : Messages,
30+
request : RequestHeader
3031
)
3132

3233
@implicitField: FieldConstructor = @{ FieldConstructor(catalogueFieldConstructor.f) }
@@ -38,7 +39,7 @@ <h1 class="page-heading mt-4">Service Vulnerabilities</h1>
3839
<div id="service-list">
3940
<form id="form" method="get">
4041
<div class="row">
41-
<div class="col-md-6">
42+
<div class="col-md-5">
4243
<dl>
4344
<dt>
4445
<label for="search" class="form-label">Service</label>
@@ -59,7 +60,7 @@ <h1 class="page-heading mt-4">Service Vulnerabilities</h1>
5960
Symbol("class") -> "form-select"
6061
)
6162
</div>
62-
<div class="col-md-3">
63+
<div class="col-md-2">
6364
@select(
6465
field = form("flag"),
6566
options = SlugInfoFlag.values.toSeq.filterNot(_ == SlugInfoFlag.ForEnvironment(Environment.Integration)).map(env => env.asString -> env.displayString),
@@ -69,20 +70,36 @@ <h1 class="page-heading mt-4">Service Vulnerabilities</h1>
6970
Symbol("class") -> "form-select"
7071
)
7172
</div>
73+
<div class="col-md-2">
74+
@select(
75+
field = form("curationStatus"),
76+
options = CurationStatus.values.toSeq.map(cs => cs.asString -> cs.displayString),
77+
Symbol("_label") -> "Curation status:",
78+
Symbol("_labelClass") -> "form-label",
79+
Symbol("id") -> "curation-status-filter",
80+
Symbol("class") -> "form-select"
81+
)
82+
</div>
7283
</div>
7384
</form>
7485
<table class="table table-striped sticky-header">
7586
<thead>
7687
<tr>
7788
<th class="col-6"><button class="sort no-border fw-bold" data-sort="service">Service</button></th>
78-
<th class="col-2 text-center"><button class="sort no-border fw-bold" data-sort="action-required">Action Required</button></th>
79-
<th class="col-2 text-center"><button class="sort no-border fw-bold" data-sort="investigation-ongoing">Investigation Ongoing</button></th>
80-
<th class="col-2 text-center"><button class="sort no-border fw-bold" data-sort="no-action-required">No Action Required</button></th>
81-
<th class="col-2 text-center"><button class="sort no-border fw-bold" data-sort="uncurated">Uncurated</button></th>
89+
<th class="col-2 text-center">
90+
<button class="sort no-border fw-bold" data-sort="count">
91+
@curationStatus match {
92+
case CurationStatus.ActionRequired => { Action Required }
93+
case CurationStatus.InvestigationOngoing => { Investigation Ongoing }
94+
case CurationStatus.NoActionRequired => { No Action Required }
95+
case CurationStatus.Uncurated => { Uncurated }
96+
}
97+
</button>
98+
</th>
8299
</tr>
83100
</thead>
84101
<tbody class="list">
85-
@vulnerabilities.map(vulnerabilitiesCountForService)
102+
@vulnerabilityCounts.map(vulnerabilitiesCountForService)
86103
</tbody>
87104
</table>
88105
</div>
@@ -92,17 +109,24 @@ <h1 class="page-heading mt-4">Service Vulnerabilities</h1>
92109
@vulnerabilitiesCountForService(tvc: TotalVulnerabilityCount) = {
93110
<tr>
94111
<td><a class="service" id="[email protected]" href="@uk.gov.hmrc.cataloguefrontend.routes.CatalogueController.service(tvc.service)">@tvc.service.asString</a></td>
95-
<td class="text-center"><a class="action-required" id="@tvc.service-action-required-vulnerabilities" href="@vulnerabilitiesListHref(tvc.service, CurationStatus.ActionRequired)">@tvc.actionRequired</a></td>
96-
<td class="text-center"><a class="investigation-ongoing" id="@tvc.service-investigation-ongoing-vulnerabilities" href="@vulnerabilitiesListHref(tvc.service, CurationStatus.InvestigationOngoing)">@tvc.investigationOngoing</a></td>
97-
<td class="text-center"><a class="no-action-required" id="@tvc.service-no-action-required-vulnerabilities" href="@vulnerabilitiesListHref(tvc.service, CurationStatus.NoActionRequired)">@tvc.noActionRequired</a></td>
98-
<td class="text-center"><a class="uncurated" id="@tvc.service-uncurated-required-vulnerabilities" href="@vulnerabilitiesListHref(tvc.service, CurationStatus.Uncurated)">@tvc.uncurated</a></td>
112+
<td class="text-center">
113+
<a class="count" id="@tvc.service-count" href="@vulnerabilitiesListHref(tvc.service, curationStatus)">
114+
@curationStatus match {
115+
case CurationStatus.ActionRequired => { @tvc.actionRequired }
116+
case CurationStatus.InvestigationOngoing => { @tvc.investigationOngoing }
117+
case CurationStatus.NoActionRequired => { @tvc.noActionRequired }
118+
case CurationStatus.Uncurated => { @tvc.uncurated }
119+
}
120+
</a>
121+
</td>
122+
99123
</tr>
100124
}
101125

102126
@vulnerabilitiesListHref(service: ServiceName, curationStatus: CurationStatus) = {
103127
@uk.gov.hmrc.cataloguefrontend.vulnerabilities.routes.VulnerabilitiesController.vulnerabilitiesList(
104128
vulnerability = None,
105-
curationStatus = Some(curationStatus.asString),
129+
curationStatus = Some(curationStatus),
106130
service = Some(s"\"${service.asString}\""),
107131
team = form("team").value.map(TeamName.apply),
108132
flag = form("flag").value
@@ -113,12 +137,14 @@ <h1 class="page-heading mt-4">Service Vulnerabilities</h1>
113137
<!-- listjs configuration -->
114138
<script @CSPNonce.attr>
115139
let options = {
116-
valueNames: [ 'service', 'action-required', 'investigation-ongoing', 'no-action-required', 'uncurated' ],
140+
valueNames: [ 'service', 'count' ],
117141
searchColumns: ['service'],
118142
searchDelay: 350
119143
};
120144

121145
let serviceList = new List('service-list', options);
146+
serviceList.sort('service', { order: "asc" });
147+
serviceList.sort('count' , { order: "desc" });
122148

123149
let searchBox = document.getElementById("search");
124150
// set autofocus cursor to right of text in search box
@@ -129,7 +155,7 @@ <h1 class="page-heading mt-4">Service Vulnerabilities</h1>
129155
serviceList.search(searchBox.value);
130156
</script>
131157
<script @CSPNonce.attr>
132-
["team-filter", "flag-filter"]
158+
["team-filter", "flag-filter", "curation-status-filter"]
133159
.forEach(function(id) {
134160
document.getElementById(id).addEventListener("change", function() {
135161
document.getElementById("form").submit();

build.sbt

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ lazy val microservice = Project("catalogue-frontend", file("."))
1717
"uk.gov.hmrc.play.bootstrap.binders.RedirectUrl",
1818
"uk.gov.hmrc.cataloguefrontend.connector.BuildDeployApiConnector.PrototypeStatus",
1919
"uk.gov.hmrc.cataloguefrontend.createrepository.RepoType",
20-
"uk.gov.hmrc.cataloguefrontend.servicemetrics.LogMetricId"
20+
"uk.gov.hmrc.cataloguefrontend.servicemetrics.LogMetricId",
21+
"uk.gov.hmrc.cataloguefrontend.vulnerabilities.CurationStatus"
2122
),
2223
TwirlKeys.templateImports ++= Seq(
2324
"uk.gov.hmrc.cataloguefrontend.model._",
@@ -38,8 +39,8 @@ lazy val microservice = Project("catalogue-frontend", file("."))
3839
pipelineStages := Seq(digest)
3940
)
4041

41-
val bootstrapPlayVersion = "9.7.0"
42-
val hmrcMongoVersion = "2.3.0"
42+
val bootstrapPlayVersion = "9.8.0"
43+
val hmrcMongoVersion = "2.5.0"
4344

4445
val compile = Seq(
4546
caffeine,

conf/app.routes

+3-3
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ GET /deployment-timeline-select/:serviceName uk.go
132132
+nocsrf
133133
POST /audit uk.gov.hmrc.cataloguefrontend.auditing.BrowserSideAuditingController.sendAudit()
134134

135-
GET /vulnerabilities uk.gov.hmrc.cataloguefrontend.vulnerabilities.VulnerabilitiesController.vulnerabilitiesList(vulnerability: Option[String] ?= None, curationStatus: Option[String] ?= None, service: Option[String] ?= None, team: Option[TeamName] ?= None, flag: Option[String] ?= None)
136-
GET /vulnerabilities/services uk.gov.hmrc.cataloguefrontend.vulnerabilities.VulnerabilitiesController.vulnerabilitiesForServices(team: Option[TeamName] ?= None, flag: Option[String] ?= None)
137-
GET /vulnerabilities/timeline uk.gov.hmrc.cataloguefrontend.vulnerabilities.VulnerabilitiesController.vulnerabilitiesTimeline(service: Option[ServiceName] ?= None, team: Option[TeamName] ?= None, vulnerability: Option[String] ?= None, curationStatus: Option[String] ?= None, from: java.time.LocalDate ?= java.time.LocalDate.now().minusMonths(6), to: java.time.LocalDate ?= java.time.LocalDate.now())
135+
GET /vulnerabilities uk.gov.hmrc.cataloguefrontend.vulnerabilities.VulnerabilitiesController.vulnerabilitiesList(vulnerability: Option[String] ?= None, curationStatus: Option[CurationStatus] ?= None, service: Option[String] ?= None, team: Option[TeamName] ?= None, flag: Option[String] ?= None)
136+
GET /vulnerabilities/services uk.gov.hmrc.cataloguefrontend.vulnerabilities.VulnerabilitiesController.vulnerabilitiesForServices(curationStatus: Option[CurationStatus] ?= None, team: Option[TeamName] ?= None, flag: Option[String] ?= None)
137+
GET /vulnerabilities/timeline uk.gov.hmrc.cataloguefrontend.vulnerabilities.VulnerabilitiesController.vulnerabilitiesTimeline(service: Option[ServiceName] ?= None, team: Option[TeamName] ?= None, vulnerability: Option[String] ?= None, curationStatus: Option[CurationStatus] ?= None, from: java.time.LocalDate ?= java.time.LocalDate.now().minusMonths(6), to: java.time.LocalDate ?= java.time.LocalDate.now())
138138

139139
GET /users uk.gov.hmrc.cataloguefrontend.users.UsersController.users
140140
GET /users-search uk.gov.hmrc.cataloguefrontend.users.UsersController.userSearch(query: String, includeDeleted: Boolean ?= false, includeNonHuman: Boolean ?= false)

0 commit comments

Comments
 (0)