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) {