SONAR-25784 Update the issue APIs to return internal tags

This commit is contained in:
Eric Giffon 2025-09-11 07:04:10 +02:00 committed by Matteo Mara
parent f93ec9c339
commit 4a3a86800b
9 changed files with 23 additions and 8 deletions

View File

@ -205,7 +205,8 @@ public class ListActionIT {
.replaceAllImpacts(List.of(new ImpactDto().setSoftwareQuality(MAINTAINABILITY).setSeverity(org.sonar.api.issue.impact.Severity.BLOCKER))) .replaceAllImpacts(List.of(new ImpactDto().setSoftwareQuality(MAINTAINABILITY).setSeverity(org.sonar.api.issue.impact.Severity.BLOCKER)))
.setAuthorLogin("John") .setAuthorLogin("John")
.setAssigneeUuid(simon.getUuid()) .setAssigneeUuid(simon.getUuid())
.setTags(asList("bug", "owasp")) .setTags(List.of("bug", "owasp"))
.setInternalTags(List.of("internal1", "internal2"))
.setIssueCreationDate(parseDate("2014-09-03")) .setIssueCreationDate(parseDate("2014-09-03"))
.setIssueUpdateDate(parseDate("2017-12-04")) .setIssueUpdateDate(parseDate("2017-12-04"))
.setCodeVariants(List.of("variant1", "variant2"))); .setCodeVariants(List.of("variant1", "variant2")));
@ -222,13 +223,13 @@ public class ListActionIT {
assertThat(response.getIssuesList()) assertThat(response.getIssuesList())
.extracting( .extracting(
Issue::getKey, Issue::getRule, Issue::getSeverity, Issue::getComponent, Issue::getResolution, Issue::getStatus, Issue::getMessage, Issue::getMessageFormattingsList, Issue::getKey, Issue::getRule, Issue::getSeverity, Issue::getComponent, Issue::getResolution, Issue::getStatus, Issue::getMessage, Issue::getMessageFormattingsList,
Issue::getEffort, Issue::getAssignee, Issue::getAuthor, Issue::getLine, Issue::getHash, Issue::getTagsList, Issue::getCreationDate, Issue::getUpdateDate, Issue::getEffort, Issue::getAssignee, Issue::getAuthor, Issue::getLine, Issue::getHash, Issue::getTagsList, Issue::getInternalTagsList, Issue::getCreationDate,
Issue::getQuickFixAvailable, Issue::getCodeVariantsList, Issue::getImpactsList) Issue::getUpdateDate, Issue::getQuickFixAvailable, Issue::getCodeVariantsList, Issue::getImpactsList)
.containsExactlyInAnyOrder( .containsExactlyInAnyOrder(
tuple(issue.getKey(), rule.getKey().toString(), Severity.BLOCKER, file.getKey(), "", STATUS_OPEN, "the message", tuple(issue.getKey(), rule.getKey().toString(), Severity.BLOCKER, file.getKey(), "", STATUS_OPEN, "the message",
MessageFormattingUtils.dbMessageFormattingListToWs(List.of(MESSAGE_FORMATTING)), "10min", MessageFormattingUtils.dbMessageFormattingListToWs(List.of(MESSAGE_FORMATTING)), "10min",
simon.getLogin(), "John", 42, "a227e508d6646b55a086ee11d63b21e9", asList("bug", "owasp"), formatDateTime(issue.getIssueCreationDate()), simon.getLogin(), "John", 42, "a227e508d6646b55a086ee11d63b21e9", List.of("bug", "owasp"), List.of("internal1", "internal2"),
formatDateTime(issue.getIssueUpdateDate()), false, List.of("variant1", "variant2"), formatDateTime(issue.getIssueCreationDate()), formatDateTime(issue.getIssueUpdateDate()), false, List.of("variant1", "variant2"),
List.of(newBuilder().setSoftwareQuality(Common.SoftwareQuality.MAINTAINABILITY).setSeverity(Common.ImpactSeverity.ImpactSeverity_BLOCKER).build()))); List.of(newBuilder().setSoftwareQuality(Common.SoftwareQuality.MAINTAINABILITY).setSeverity(Common.ImpactSeverity.ImpactSeverity_BLOCKER).build())));
assertThat(response.getComponentsList()) assertThat(response.getComponentsList())

View File

@ -230,7 +230,8 @@ class SearchActionIT {
.setSeverity("MAJOR") .setSeverity("MAJOR")
.setAuthorLogin("John") .setAuthorLogin("John")
.setAssigneeUuid(simon.getUuid()) .setAssigneeUuid(simon.getUuid())
.setTags(asList("bug", "owasp")) .setTags(List.of("bug", "owasp"))
.setInternalTags(List.of("internal1", "internal2"))
.setIssueCreationDate(parseDate("2014-09-03")) .setIssueCreationDate(parseDate("2014-09-03"))
.setIssueUpdateDate(parseDate("2017-12-04")) .setIssueUpdateDate(parseDate("2017-12-04"))
.setCodeVariants(List.of("variant1", "variant2"))); .setCodeVariants(List.of("variant1", "variant2")));
@ -242,13 +243,13 @@ class SearchActionIT {
assertThat(response.getIssuesList()) assertThat(response.getIssuesList())
.extracting( .extracting(
Issue::getKey, Issue::getRule, Issue::getSeverity, Issue::getComponent, Issue::getResolution, Issue::getStatus, Issue::getMessage, Issue::getMessageFormattingsList, Issue::getKey, Issue::getRule, Issue::getSeverity, Issue::getComponent, Issue::getResolution, Issue::getStatus, Issue::getMessage, Issue::getMessageFormattingsList,
Issue::getEffort, Issue::getAssignee, Issue::getAuthor, Issue::getLine, Issue::getHash, Issue::getTagsList, Issue::getEffort, Issue::getAssignee, Issue::getAuthor, Issue::getLine, Issue::getHash, Issue::getTagsList, Issue::getInternalTagsList,
Issue::getCreationDate, Issue::getUpdateDate, Issue::getCreationDate, Issue::getUpdateDate,
Issue::getQuickFixAvailable, Issue::getCodeVariantsList) Issue::getQuickFixAvailable, Issue::getCodeVariantsList)
.containsExactlyInAnyOrder( .containsExactlyInAnyOrder(
tuple(issue.getKey(), rule.getKey().toString(), Severity.MAJOR, file.getKey(), RESOLUTION_FIXED, STATUS_RESOLVED, "the message", tuple(issue.getKey(), rule.getKey().toString(), Severity.MAJOR, file.getKey(), RESOLUTION_FIXED, STATUS_RESOLVED, "the message",
MessageFormattingUtils.dbMessageFormattingListToWs(List.of(MESSAGE_FORMATTING)), "10min", MessageFormattingUtils.dbMessageFormattingListToWs(List.of(MESSAGE_FORMATTING)), "10min",
simon.getLogin(), "John", 42, "a227e508d6646b55a086ee11d63b21e9", asList("bug", "owasp"), simon.getLogin(), "John", 42, "a227e508d6646b55a086ee11d63b21e9", List.of("bug", "owasp"), List.of("internal1", "internal2"),
formatDateTime(issue.getIssueCreationDate()), formatDateTime(issue.getIssueCreationDate()),
formatDateTime(issue.getIssueUpdateDate()), false, List.of("variant1", "variant2"))); formatDateTime(issue.getIssueUpdateDate()), false, List.of("variant1", "variant2")));
} }

View File

@ -97,6 +97,7 @@ public class ListAction implements IssuesWsAction {
"<br>Requires the 'Browse' permission on the specified project. ") "<br>Requires the 'Browse' permission on the specified project. ")
.setSince("10.2") .setSince("10.2")
.setChangelog( .setChangelog(
new Change("2025.5", "Response field 'internalTags' has been added"),
new Change("10.8", format("The parameter '%s' are not deprecated anymore.", PARAM_TYPES)), new Change("10.8", format("The parameter '%s' are not deprecated anymore.", PARAM_TYPES)),
new Change("10.8", "The response fields 'severity' and 'type' are not deprecated anymore."), new Change("10.8", "The response fields 'severity' and 'type' are not deprecated anymore."),
new Change("10.4", format("Parameter '%s' is deprecated.", PARAM_TYPES)), new Change("10.4", format("Parameter '%s' is deprecated.", PARAM_TYPES)),

View File

@ -241,6 +241,7 @@ public class SearchAction implements IssuesWsAction {
+ "<br/>When issue indexing is in progress returns 503 service unavailable HTTP code.") + "<br/>When issue indexing is in progress returns 503 service unavailable HTTP code.")
.setSince("3.6") .setSince("3.6")
.setChangelog( .setChangelog(
new Change(V_2025_5, "Response field 'internalTags' has been added"),
new Change(V_2025_5, format(NEW_FACET_ADDED_MESSAGE, PARAM_FROM_SONAR_QUBE_UPDATE)), new Change(V_2025_5, format(NEW_FACET_ADDED_MESSAGE, PARAM_FROM_SONAR_QUBE_UPDATE)),
new Change(V_2025_5, format(NEW_PARAM_ADDED_MESSAGE, PARAM_FROM_SONAR_QUBE_UPDATE)), new Change(V_2025_5, format(NEW_PARAM_ADDED_MESSAGE, PARAM_FROM_SONAR_QUBE_UPDATE)),
new Change(V_2025_3, format(NEW_FACET_ADDED_MESSAGE, PARAM_OWASP_MOBILE_TOP_10_2024)), new Change(V_2025_3, format(NEW_FACET_ADDED_MESSAGE, PARAM_OWASP_MOBILE_TOP_10_2024)),

View File

@ -212,6 +212,7 @@ public class SearchResponseFormat {
issueBuilder.setMessage(nullToEmpty(dto.getMessage())); issueBuilder.setMessage(nullToEmpty(dto.getMessage()));
issueBuilder.addAllMessageFormattings(MessageFormattingUtils.dbMessageFormattingToWs(dto.parseMessageFormattings())); issueBuilder.addAllMessageFormattings(MessageFormattingUtils.dbMessageFormattingToWs(dto.parseMessageFormattings()));
issueBuilder.addAllTags(dto.getTags()); issueBuilder.addAllTags(dto.getTags());
issueBuilder.addAllInternalTags(dto.getInternalTags());
issueBuilder.addAllCodeVariants(dto.getCodeVariants()); issueBuilder.addAllCodeVariants(dto.getCodeVariants());
Long effort = dto.getEffort(); Long effort = dto.getEffort();
if (effort != null) { if (effort != null) {

View File

@ -99,6 +99,10 @@
"codeVariants": [ "codeVariants": [
"windows", "windows",
"linux" "linux"
],
"internalTags": [
"advanced",
"sast"
] ]
} }
], ],

View File

@ -100,6 +100,10 @@
"codeVariants": [ "codeVariants": [
"windows", "windows",
"linux" "linux"
],
"internalTags": [
"advanced",
"sast"
] ]
} }
], ],

View File

@ -142,6 +142,7 @@ class SearchResponseFormatFormatOperationTest {
assertThat(issue.getStatus()).isEqualTo(issueDto.getStatus()); assertThat(issue.getStatus()).isEqualTo(issueDto.getStatus());
assertThat(issue.getMessage()).isEqualTo(issueDto.getMessage()); assertThat(issue.getMessage()).isEqualTo(issueDto.getMessage());
assertThat(new ArrayList<>(issue.getTagsList())).containsExactlyInAnyOrderElementsOf(issueDto.getTags()); assertThat(new ArrayList<>(issue.getTagsList())).containsExactlyInAnyOrderElementsOf(issueDto.getTags());
assertThat(new ArrayList<>(issue.getInternalTagsList())).containsExactlyInAnyOrderElementsOf(issueDto.getInternalTags());
assertThat(issue.getLine()).isEqualTo(issueDto.getLine()); assertThat(issue.getLine()).isEqualTo(issueDto.getLine());
assertThat(issue.getHash()).isEqualTo(issueDto.getChecksum()); assertThat(issue.getHash()).isEqualTo(issueDto.getChecksum());
assertThat(issue.getAuthor()).isEqualTo(issueDto.getAuthorLogin()); assertThat(issue.getAuthor()).isEqualTo(issueDto.getAuthorLogin());

View File

@ -169,6 +169,7 @@ message Issue {
optional string issueStatus = 43; optional string issueStatus = 43;
optional bool prioritizedRule = 44; optional bool prioritizedRule = 44;
optional bool fromSonarQubeUpdate = 45; optional bool fromSonarQubeUpdate = 45;
repeated string internalTags = 46;
} }
message Transitions { message Transitions {