diff --git a/pom.xml b/pom.xml
index 7caab9f7..e666acfd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
api
jar
${project.groupId}:${project.artifactId}
- 3.4.34
+ 3.4.35
Hygieia Rest API Layer
https://github.com/Hygieia/api
diff --git a/src/main/java/com/capitalone/dashboard/rest/DashboardController.java b/src/main/java/com/capitalone/dashboard/rest/DashboardController.java
index d6713924..fd0da8b5 100644
--- a/src/main/java/com/capitalone/dashboard/rest/DashboardController.java
+++ b/src/main/java/com/capitalone/dashboard/rest/DashboardController.java
@@ -481,4 +481,11 @@ public ResponseEntity> myDashboardByTitlePage(@RequestParam(valu
.headers(paginationHeaderUtility.buildPaginationHeaders(pageDashboardItems))
.body(pageDashboardItems.getContent());
}
+
+ @RequestMapping(value = "/dashboard/removeWidgetDuplicates", method = DELETE)
+ public ResponseEntity removeWidgetDuplicates(@RequestParam(value="title", required = false)String title,
+ @RequestParam(value="dryRun", required = true) boolean dryRun){
+ String message = dashboardService.removeWidgetDuplicates(title, dryRun);
+ return ResponseEntity.ok().body(message);
+ }
}
diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java
index 669d7a74..2e7c1e06 100644
--- a/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java
+++ b/src/main/java/com/capitalone/dashboard/service/DashboardRemoteServiceImpl.java
@@ -170,16 +170,12 @@ public Dashboard remoteCreate(DashboardRemoteRequest request, boolean isUpdate)
component = dashboardService.associateCollectorToComponent(dashboard.getApplication().getComponents().get(0).getId(), widgetRequest.getCollectorItemIds(),component,true);
Widget newWidget = widgetRequest.widget();
- if (isUpdate) {
- Widget oldWidget = existingWidgets.get(newWidget.getName());
- if (oldWidget == null) {
- dashboardService.addWidget(dashboard, newWidget);
- } else {
- Widget widget = widgetRequest.updateWidget(dashboardService.getWidget(dashboard, oldWidget.getId()));
- dashboardService.updateWidget(dashboard, widget);
- }
- } else {
+ Widget oldWidget = existingWidgets.get(newWidget.getName());
+ if (oldWidget == null) {
dashboardService.addWidget(dashboard, newWidget);
+ } else {
+ Widget widget = widgetRequest.updateWidget(dashboardService.getWidget(dashboard, oldWidget.getId()));
+ dashboardService.updateWidget(dashboard, widget);
}
}
diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardService.java b/src/main/java/com/capitalone/dashboard/service/DashboardService.java
index 034564a0..b3ce073a 100644
--- a/src/main/java/com/capitalone/dashboard/service/DashboardService.java
+++ b/src/main/java/com/capitalone/dashboard/service/DashboardService.java
@@ -243,6 +243,8 @@ public interface DashboardService {
Dashboard updateScoreSettings(ObjectId dashboardId, boolean scoreEnabled, ScoreDisplayType scoreDisplay);
Iterable allTemplate(String template);
+
+ String removeWidgetDuplicates(String title, boolean dryRun);
}
diff --git a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java
index 8c732955..770a28ea 100644
--- a/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java
+++ b/src/main/java/com/capitalone/dashboard/service/DashboardServiceImpl.java
@@ -1005,4 +1005,53 @@ public Dashboard updateScoreSettings(ObjectId dashboardId, boolean scoreEnabled,
return savedDashboard;
}
+ @Override
+ public String removeWidgetDuplicates(String title, boolean dryRun) {
+
+ List dashboards;
+ if (StringUtils.isEmpty(title)){
+ dashboards = (List) all();
+ }
+ else{
+ dashboards = dashboardRepository.findByTitle(title);
+ if (CollectionUtils.isEmpty(dashboards)){return "No dashboards with that title";}
+ }
+
+ for (Dashboard dashboard : dashboards) {
+ List nonDuplicates = new ArrayList();
+ List dashWidgets = dashboard.getWidgets();
+
+ // loop through existing widgets, if the widget is not in the nonDuplicates list add it
+ for (Widget widget : dashWidgets) {
+ if (nonDuplicates.stream().noneMatch(w -> w.getName().equalsIgnoreCase(widget.getName()))) {
+ nonDuplicates.add(widget);
+ }
+ }
+
+ if(!dryRun){
+ dashboard.setWidgets(nonDuplicates);
+ dashboard.setUpdatedAt(System.currentTimeMillis());
+ dashboardRepository.save(dashboard);
+ }
+
+ // Logs number of original widgets along with contents of new widget array
+ LOG.info("Removing duplicates from dashboard " + dashboard.getTitle() + ": " + dashWidgets.size() +
+ " widgets simplified to " + nonDuplicates.stream().map(Widget::getName).collect(Collectors.toList()));
+ }
+
+ if(StringUtils.isEmpty(title)){
+ if(dryRun){
+ return "DRY_RUN: All Dashboard widgets cleaned";
+ } else{
+ return "All Dashboard widgets cleaned";
+ }
+ }
+ else {
+ if(dryRun){
+ return "DRY_RUN: Cleaned widgets for dashboard " + title;
+ } else{
+ return "Cleaned widgets for dashboard " + title;
+ }
+ }
+ }
}
diff --git a/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java b/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java
index 28965c5f..158fd690 100644
--- a/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java
+++ b/src/test/java/com/capitalone/dashboard/rest/DashboardControllerTest.java
@@ -436,7 +436,6 @@ public void updateScoreSettings() throws Exception {
.andExpect(status().isOk());
}
-
private DashboardRequestTitle makeDashboardRequestTitle(String title) {
DashboardRequestTitle request = new DashboardRequestTitle();
request.setTitle(title);
diff --git a/src/test/java/com/capitalone/dashboard/service/DashboardRemoteServiceTest.java b/src/test/java/com/capitalone/dashboard/service/DashboardRemoteServiceTest.java
index d1e99593..78a3d087 100644
--- a/src/test/java/com/capitalone/dashboard/service/DashboardRemoteServiceTest.java
+++ b/src/test/java/com/capitalone/dashboard/service/DashboardRemoteServiceTest.java
@@ -8,6 +8,7 @@
import com.capitalone.dashboard.model.CollectorType;
import com.capitalone.dashboard.model.Owner;
import com.capitalone.dashboard.model.AuthType;
+import com.capitalone.dashboard.model.Widget;
import com.capitalone.dashboard.repository.CollectorItemRepository;
import com.capitalone.dashboard.repository.DashboardRepository;
import com.capitalone.dashboard.repository.UserInfoRepository;
@@ -301,6 +302,36 @@ public void remoteCreateBuild() throws HygieiaException, IOException {
assertEquals(1, component.getCollectorItems().get(CollectorType.Build).size());
assertEquals(2, dashboard.get(0).getOwners().size());
}
+
+ @Test
+ public void remoteCreateWithoutDuplicateWidgets() throws IOException, HygieiaException {
+
+ for(int i = 0; i < 2; i++){
+ // Creating codeRepoEntry to add to the request
+ List entries = new ArrayList<>();
+ DashboardRemoteRequest.CodeRepoEntry entry = new DashboardRemoteRequest.CodeRepoEntry();
+ entry.setToolName("GitHub");
+ Map options = new HashMap();
+ if (i==0) {
+ options.put("url", "http://git.test.com/capone/better.git");
+ options.put("branch", "master");
+ }else{
+ options.put("url", "http://git.test.com/captwo/best.git");
+ options.put("branch", "main");
+ }
+ entry.setOptions(options);
+ entries.add(entry);
+
+ // create remote request with repo and call remote create
+ DashboardRemoteRequest request = getRemoteRequest("./dashboardRemoteRequests/Remote-Request-Base.json");
+ request.getMetaData().setTitle("dupWidgetTest");
+ request.setCodeRepoEntries(entries);
+ Dashboard dash = dashboardRemoteService.remoteCreate(request, false);
+ assertEquals(1, dash.getWidgets().size());
+ assertEquals("repo", dash.getWidgets().get(0).getName());
+ }
+ }
+
@Test
public void remoteUpdateNonExisting() throws IOException {
DashboardRemoteRequest request = getRemoteRequest("./dashboardRemoteRequests/Remote-Request-Base.json");
diff --git a/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java b/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java
index 47a04919..3c921965 100644
--- a/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java
+++ b/src/test/java/com/capitalone/dashboard/service/DashboardServiceTest.java
@@ -941,6 +941,25 @@ public void compareMapsTest() {
Assert.assertTrue(result);
}
+ @Test
+ public void removeWidgetDuplicates(){
+ Dashboard dashboard = makeTeamDashboard("template", "title", "appName", "Test",configItemBusServName,configItemBusAppName, "comp1");
+ Widget widget = new Widget();
+ Widget widget2 = new Widget();
+
+ widget.setName("build");
+ dashboard.getWidgets().add(widget);
+ dashboard.getWidgets().add(widget);
+ widget2.setName("repo");
+ dashboard.getWidgets().add(widget2);
+ dashboard.getWidgets().add(widget2);
+ assertThat(dashboard.getWidgets().size(), is(4));
+
+ when(dashboardRepository.findByTitle(dashboard.getTitle())).thenReturn(Collections.singletonList(dashboard));
+ dashboardService.removeWidgetDuplicates(dashboard.getTitle(), false);
+ assertThat(dashboard.getWidgets().size(), is(2));
+ }
+
private Dashboard makeTeamDashboard(String template, String title, String appName, String owner,String configItemBusServName,String configItemBusAppName, String... compNames) {
Application app = new Application(appName);
for (String compName : compNames) {