From 47052d9ae39c90e8ebba06dbce299d713db4ba09 Mon Sep 17 00:00:00 2001 From: Pavel Bortnik Date: Mon, 20 Jan 2025 15:00:35 +0300 Subject: [PATCH 1/9] EPMRPP-98548 || Add a new endpoint to get dashboard widgets configuration --- .../core/dashboard/GetDashboardHandler.java | 50 +++++++++------ .../impl/GetDashboardHandlerImpl.java | 62 +++++++++++-------- .../widget/WidgetConfigurationService.java | 40 ++++++++++++ .../demodata/DemoDataController.java | 2 +- .../dashboard/DashboardConfigResource.java | 16 +++++ .../model/widget/WidgetConfigResource.java | 14 +++++ .../ws/controller/DashboardController.java | 12 ++++ 7 files changed, 150 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java create mode 100644 src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java create mode 100644 src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java index 793237548b..4897a095ba 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java @@ -18,6 +18,7 @@ import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.ta.reportportal.commons.querygen.Filter; +import com.epam.ta.reportportal.model.dashboard.DashboardConfigResource; import com.epam.ta.reportportal.model.dashboard.DashboardResource; import org.springframework.data.domain.Pageable; @@ -28,25 +29,36 @@ */ public interface GetDashboardHandler { - /** - * Get dashboard resource by provided id - * - * @param id Provided id - * @param projectDetails Project detail - * @return {@link DashboardResource} - */ - DashboardResource getDashboard(Long id, ReportPortalUser.ProjectDetails projectDetails); + /** + * Get dashboard resource by provided id + * + * @param id Provided id + * @param projectDetails Project detail + * @return {@link DashboardResource} + */ + DashboardResource getDashboard(Long id, ReportPortalUser.ProjectDetails projectDetails); - /** - * Get permitted projects for concrete user for concrete project - * - * @param projectDetails Project details - * @param user User - * @param pageable Page Details - * @param filter {@link Filter} - * @return Page of permitted dashboard resources - */ - Iterable getDashboards(ReportPortalUser.ProjectDetails projectDetails, Pageable pageable, Filter filter, - ReportPortalUser user); + /** + * Get permitted projects for concrete user for concrete project + * + * @param projectDetails Project details + * @param user User + * @param pageable Page Details + * @param filter {@link Filter} + * @return Page of permitted dashboard resources + */ + Iterable getDashboards(ReportPortalUser.ProjectDetails projectDetails, + Pageable pageable, Filter filter, + ReportPortalUser user); + + /** + * Get Dashboard configuration including its widgets and filters if any + * + * @param id Dashboard id + * @param projectDetails Project details + * @return Dashboard configuration + */ + DashboardConfigResource getDashboardConfig(Long id, + ReportPortalUser.ProjectDetails projectDetails); } \ No newline at end of file diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java index 2ef774f9f0..ccebf7ca6d 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java @@ -16,19 +16,21 @@ package com.epam.ta.reportportal.core.dashboard.impl; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.commons.ReportPortalUser; +import com.epam.ta.reportportal.commons.ReportPortalUser.ProjectDetails; import com.epam.ta.reportportal.commons.querygen.Filter; import com.epam.ta.reportportal.commons.querygen.ProjectFilter; import com.epam.ta.reportportal.core.dashboard.GetDashboardHandler; +import com.epam.ta.reportportal.core.widget.WidgetConfigurationService; import com.epam.ta.reportportal.dao.DashboardRepository; import com.epam.ta.reportportal.entity.dashboard.Dashboard; -import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.model.dashboard.DashboardConfigResource; import com.epam.ta.reportportal.model.dashboard.DashboardResource; import com.epam.ta.reportportal.ws.converter.PagedResourcesAssembler; import com.epam.ta.reportportal.ws.converter.converters.DashboardConverter; -import com.epam.reportportal.rules.exception.ErrorType; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; +import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -36,31 +38,39 @@ * @author Pavel Bortnik */ @Service +@RequiredArgsConstructor public class GetDashboardHandlerImpl implements GetDashboardHandler { - private DashboardRepository dashboardRepository; + private final DashboardRepository dashboardRepository; + private final WidgetConfigurationService widgetConfigurationService; + + @Override + public Iterable getDashboards(ReportPortalUser.ProjectDetails projectDetails, + Pageable pageable, Filter filter, ReportPortalUser user) { + var dashboards = dashboardRepository.findByFilter( + ProjectFilter.of(filter, projectDetails.getProjectId()), pageable); + return PagedResourcesAssembler.pageConverter(DashboardConverter.TO_RESOURCE).apply(dashboards); + } - @Autowired - public void setDashboardRepository(DashboardRepository dashboardRepository) { - this.dashboardRepository = dashboardRepository; - } + @Override + public DashboardResource getDashboard(Long id, ReportPortalUser.ProjectDetails projectDetails) { + var dashboard = getDashboardById(id, projectDetails); + return DashboardConverter.TO_RESOURCE.apply(dashboard); + } - @Override - public Iterable getDashboards(ReportPortalUser.ProjectDetails projectDetails, Pageable pageable, Filter filter, - ReportPortalUser user) { - final Page dashboards = dashboardRepository.findByFilter(ProjectFilter.of(filter, projectDetails.getProjectId()), - pageable - ); - return PagedResourcesAssembler.pageConverter(DashboardConverter.TO_RESOURCE).apply(dashboards); - } + @Override + public DashboardConfigResource getDashboardConfig(Long id, + ReportPortalUser.ProjectDetails projectDetails) { + var dashboard = getDashboardById(id, projectDetails); + var widgetsConfiguration = widgetConfigurationService.getWidgetsConfiguration( + dashboard, projectDetails); + return DashboardConfigResource.builder().widgets(widgetsConfiguration).build(); + } - @Override - public DashboardResource getDashboard(Long id, ReportPortalUser.ProjectDetails projectDetails) { - final Dashboard dashboard = dashboardRepository.findByIdAndProjectId(id, projectDetails.getProjectId()) - .orElseThrow(() -> new ReportPortalException(ErrorType.DASHBOARD_NOT_FOUND_IN_PROJECT, - id, - projectDetails.getProjectName() - )); - return DashboardConverter.TO_RESOURCE.apply(dashboard); - } + private Dashboard getDashboardById(Long id, ProjectDetails projectDetails) { + return dashboardRepository.findByIdAndProjectId(id, projectDetails.getProjectId()) + .orElseThrow(() -> new ReportPortalException(ErrorType.DASHBOARD_NOT_FOUND_IN_PROJECT, id, + projectDetails.getProjectName() + )); + } } \ No newline at end of file diff --git a/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java b/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java new file mode 100644 index 0000000000..8753d31999 --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java @@ -0,0 +1,40 @@ +package com.epam.ta.reportportal.core.widget; + +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.commons.ReportPortalUser.ProjectDetails; +import com.epam.ta.reportportal.dao.WidgetRepository; +import com.epam.ta.reportportal.entity.dashboard.Dashboard; +import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; +import com.epam.ta.reportportal.model.widget.WidgetConfigResource; +import com.epam.ta.reportportal.ws.converter.converters.WidgetConverter; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class WidgetConfigurationService { + + private final WidgetRepository widgetRepository; + + public List getWidgetsConfiguration(Dashboard dashboard, + ProjectDetails projectDetails) { + return dashboard.getDashboardWidgets().stream().map(WidgetConverter.TO_OBJECT_MODEL) + .map(widget -> getWidgetConfig(widget, projectDetails)).collect(Collectors.toList()); + } + + private WidgetConfigResource getWidgetConfig(WidgetObjectModel widgetObject, + ProjectDetails projectDetails) { + var widget = widgetRepository.findByIdAndProjectId(widgetObject.getWidgetId(), + projectDetails.getProjectId()).orElseThrow( + () -> new ReportPortalException(ErrorType.WIDGET_NOT_FOUND_IN_PROJECT, + widgetObject.getWidgetId(), + projectDetails.getProjectName() + )); + return WidgetConfigResource.builder().widgetObject(widgetObject) + .widgetResource(WidgetConverter.TO_WIDGET_RESOURCE.apply(widget)).build(); + } + +} diff --git a/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java b/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java index 437e0a86f6..3bcc5a1faa 100644 --- a/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java +++ b/src/main/java/com/epam/ta/reportportal/demodata/DemoDataController.java @@ -36,7 +36,7 @@ @RestController @RequestMapping("/v1/demo/{projectName}") @PreAuthorize(PROJECT_MANAGER) -@Tag(name = "demo-data-controller", description = "Demo Data Controller") +@Tag(name = "Demo Data", description = "Demo data API collection") class DemoDataController { private final DemoDataService demoDataService; diff --git a/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java new file mode 100644 index 0000000000..f39e2a0ded --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java @@ -0,0 +1,16 @@ +package com.epam.ta.reportportal.model.dashboard; + +import com.epam.ta.reportportal.model.widget.WidgetConfigResource; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class DashboardConfigResource { + + @JsonProperty(value = "widgets") + private List widgets; + +} diff --git a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java new file mode 100644 index 0000000000..9fa18c210b --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java @@ -0,0 +1,14 @@ +package com.epam.ta.reportportal.model.widget; + +import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class WidgetConfigResource { + + private WidgetObjectModel widgetObject; + private WidgetResource widgetResource; + +} diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java index 336285913f..7b9c4f8a85 100644 --- a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java +++ b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java @@ -30,6 +30,7 @@ import com.epam.ta.reportportal.model.EntryCreatedRS; import com.epam.ta.reportportal.model.dashboard.AddWidgetRq; import com.epam.ta.reportportal.model.dashboard.CreateDashboardRQ; +import com.epam.ta.reportportal.model.dashboard.DashboardConfigResource; import com.epam.ta.reportportal.model.dashboard.DashboardResource; import com.epam.ta.reportportal.model.dashboard.UpdateDashboardRQ; import com.epam.ta.reportportal.util.ProjectExtractor; @@ -154,4 +155,15 @@ public DashboardResource getDashboard(@PathVariable String projectName, return getDashboardHandler.getDashboard( dashboardId, projectExtractor.extractProjectDetails(user, projectName)); } + + + @Transactional + @GetMapping(value = "/copy/{dashboardId}") + @ResponseStatus(OK) + @Operation(summary = "Get Dashboard configuration including its widgets and filters if any") + public DashboardConfigResource getDashboardConfig(@PathVariable String projectName, + @PathVariable Long dashboardId, @AuthenticationPrincipal ReportPortalUser user) { + return getDashboardHandler.getDashboardConfig( + dashboardId, projectExtractor.extractProjectDetails(user, projectName)); + } } From c07ce3437b7e7427508471d270bc5b6cebd5b856 Mon Sep 17 00:00:00 2001 From: Pavel Bortnik Date: Mon, 20 Jan 2025 16:45:53 +0300 Subject: [PATCH 2/9] EPMRPP-98548 || Add headers and docs --- .../widget/WidgetConfigurationService.java | 18 ++++++++++++++++++ .../dashboard/DashboardConfigResource.java | 18 ++++++++++++++++++ .../model/widget/WidgetConfigResource.java | 18 ++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java b/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java index 8753d31999..49c4850901 100644 --- a/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java +++ b/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java @@ -1,3 +1,18 @@ +/* + * Copyright 2025 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.epam.ta.reportportal.core.widget; import com.epam.reportportal.rules.exception.ErrorType; @@ -13,6 +28,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +/** + * @author Pavel Bortnik + */ @Service @RequiredArgsConstructor public class WidgetConfigurationService { diff --git a/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java index f39e2a0ded..3f7b4b0642 100644 --- a/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java @@ -1,3 +1,18 @@ +/* + * Copyright 2025 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.epam.ta.reportportal.model.dashboard; import com.epam.ta.reportportal.model.widget.WidgetConfigResource; @@ -6,6 +21,9 @@ import lombok.Builder; import lombok.Data; +/** + * @author Pavel Bortnik + */ @Data @Builder public class DashboardConfigResource { diff --git a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java index 9fa18c210b..3459d6c099 100644 --- a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java @@ -1,9 +1,27 @@ +/* + * Copyright 2025 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.epam.ta.reportportal.model.widget; import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; import lombok.Builder; import lombok.Data; +/** + * @author Pavel Bortnik + */ @Data @Builder public class WidgetConfigResource { From 32aa5fcef7c0bf8b87788181136af8f58fff803f Mon Sep 17 00:00:00 2001 From: Pavel Bortnik Date: Mon, 27 Jan 2025 01:05:14 +0300 Subject: [PATCH 3/9] EPMRPP-98549 || Implement endpoint for creating dashboard based on previously copied configuration --- .../core/dashboard/GetDashboardHandler.java | 2 +- .../impl/CreateDashboardHandlerImpl.java | 14 +-- .../impl/DashboardPreconfiguredService.java | 112 ++++++++++++++++++ .../impl/GetDashboardHandlerImpl.java | 4 +- .../core/filter/UpdateUserFilterHandler.java | 11 ++ .../impl/UpdateUserFilterHandlerImpl.java | 49 ++++++-- .../widget/WidgetConfigurationService.java | 15 +-- .../widget/impl/CreateWidgetHandlerImpl.java | 17 +-- .../model/dashboard/AddWidgetRq.java | 14 +-- .../model/dashboard/CreateDashboardRQ.java | 18 +-- .../dashboard/DashboardConfigResource.java | 6 +- .../dashboard/DashboardPreconfiguredRq.java | 41 +++++++ .../model/filter/UserFilterResource.java | 2 + .../model/widget/WidgetConfigResource.java | 5 + .../ws/controller/DashboardController.java | 30 +++-- src/main/resources/demo/demo_widgets.json | 2 +- 16 files changed, 269 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/epam/ta/reportportal/core/dashboard/impl/DashboardPreconfiguredService.java create mode 100644 src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardPreconfiguredRq.java diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java index 4897a095ba..119b5db955 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/GetDashboardHandler.java @@ -54,7 +54,7 @@ Iterable getDashboards(ReportPortalUser.ProjectDetails projec /** * Get Dashboard configuration including its widgets and filters if any * - * @param id Dashboard id + * @param id Dashboard id * @param projectDetails Project details * @return Dashboard configuration */ diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java index b11f2e517d..a02b0cc0ee 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java @@ -18,9 +18,10 @@ import static com.epam.ta.reportportal.ws.converter.converters.DashboardConverter.TO_ACTIVITY_RESOURCE; -import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.reportportal.rules.commons.validation.BusinessRule; import com.epam.reportportal.rules.commons.validation.Suppliers; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.ta.reportportal.core.dashboard.CreateDashboardHandler; import com.epam.ta.reportportal.core.events.MessageBus; import com.epam.ta.reportportal.core.events.activity.DashboardCreatedEvent; @@ -29,15 +30,15 @@ import com.epam.ta.reportportal.model.EntryCreatedRS; import com.epam.ta.reportportal.model.dashboard.CreateDashboardRQ; import com.epam.ta.reportportal.ws.converter.builders.DashboardBuilder; -import com.epam.reportportal.rules.exception.ErrorType; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.BooleanUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author Pavel Bortnik */ @Service +@RequiredArgsConstructor public class CreateDashboardHandlerImpl implements CreateDashboardHandler { private final DashboardRepository dashboardRepository; @@ -45,13 +46,6 @@ public class CreateDashboardHandlerImpl implements CreateDashboardHandler { private final static int DASHBOARD_LIMIT = 3000; - @Autowired - public CreateDashboardHandlerImpl(DashboardRepository dashboardRepository, - MessageBus messageBus) { - this.dashboardRepository = dashboardRepository; - this.messageBus = messageBus; - } - @Override public EntryCreatedRS createDashboard(ReportPortalUser.ProjectDetails projectDetails, CreateDashboardRQ rq, ReportPortalUser user) { diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/DashboardPreconfiguredService.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/DashboardPreconfiguredService.java new file mode 100644 index 0000000000..d94f8f4d4f --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/DashboardPreconfiguredService.java @@ -0,0 +1,112 @@ +/* + * Copyright 2025 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.epam.ta.reportportal.core.dashboard.impl; + +import com.epam.ta.reportportal.commons.ReportPortalUser; +import com.epam.ta.reportportal.commons.ReportPortalUser.ProjectDetails; +import com.epam.ta.reportportal.core.dashboard.CreateDashboardHandler; +import com.epam.ta.reportportal.core.dashboard.UpdateDashboardHandler; +import com.epam.ta.reportportal.core.filter.UpdateUserFilterHandler; +import com.epam.ta.reportportal.core.widget.CreateWidgetHandler; +import com.epam.ta.reportportal.model.EntryCreatedRS; +import com.epam.ta.reportportal.model.dashboard.AddWidgetRq; +import com.epam.ta.reportportal.model.dashboard.DashboardPreconfiguredRq; +import com.epam.ta.reportportal.model.filter.UpdateUserFilterRQ; +import com.epam.ta.reportportal.model.filter.UserFilterResource; +import com.epam.ta.reportportal.model.widget.WidgetConfigResource; +import com.epam.ta.reportportal.model.widget.WidgetRQ; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * @author Pavel Bortnik + */ +@Service +@RequiredArgsConstructor +public class DashboardPreconfiguredService { + + private final CreateDashboardHandler createDashboardHandler; + private final UpdateDashboardHandler updateDashboardHandler; + private final CreateWidgetHandler createWidgetHandler; + private final UpdateUserFilterHandler userFilterHandler; + + public EntryCreatedRS createDashboard(ProjectDetails projectDetails, + DashboardPreconfiguredRq rq, ReportPortalUser user) { + var dashboard = createDashboardHandler.createDashboard(projectDetails, rq, user); + createAndAddWidgets(dashboard.getId(), rq.getDashboardConfig().getWidgetsConfig(), + projectDetails, user); + return dashboard; + } + + private void createAndAddWidgets(Long dashboardId, List widgetsConfigs, + ProjectDetails projectDetails, ReportPortalUser user) { + var filterIdMapping = createUniqueFilters(widgetsConfigs, projectDetails, user); + widgetsConfigs.forEach(widgetConfig -> { + var widget = createWidgetByConfig(projectDetails, user, + getNewFilterIds(filterIdMapping, widgetConfig), widgetConfig); + widgetConfig.getWidgetObject().setWidgetId(widget.getId()); + updateDashboardHandler.addWidget(dashboardId, projectDetails, + new AddWidgetRq(widgetConfig.getWidgetObject()), user); + }); + } + + private EntryCreatedRS createWidgetByConfig(ProjectDetails projectDetails, ReportPortalUser user, + List filterIds, WidgetConfigResource config) { + var widgetRQ = new WidgetRQ(); + widgetRQ.setName(config.getWidgetResource().getName()); + widgetRQ.setDescription(config.getWidgetResource().getDescription()); + widgetRQ.setWidgetType(config.getWidgetResource().getWidgetType()); + widgetRQ.setContentParameters(config.getWidgetResource().getContentParameters()); + widgetRQ.setFilterIds(filterIds); + return createWidgetHandler.createWidget(widgetRQ, projectDetails, user); + } + + private List getNewFilterIds(HashMap filterIdMapping, + WidgetConfigResource config) { + return config.getWidgetResource().getAppliedFilters().stream() + .map(it -> filterIdMapping.get(it.getFilterId())).collect( + Collectors.toList()); + } + + private HashMap createUniqueFilters(List widgetsConfigs, + ProjectDetails projectDetails, ReportPortalUser user) { + + var filtersMapping = new HashMap(); + + var uniqueFilters = widgetsConfigs.stream() + .flatMap(it -> it.getWidgetResource().getAppliedFilters().stream()) + .collect(Collectors.toMap(UserFilterResource::getFilterId, f -> f, + (existing, current) -> existing)); + + uniqueFilters.forEach((id, filter) -> { + var updateUserFilterRQ = new UpdateUserFilterRQ(); + updateUserFilterRQ.setName(filter.getName()); + updateUserFilterRQ.setConditions(filter.getConditions()); + updateUserFilterRQ.setOrders(filter.getOrders()); + updateUserFilterRQ.setObjectType(filter.getObjectType()); + updateUserFilterRQ.setDescription(filter.getDescription()); + var createdFilter = userFilterHandler.createFilterCopyOnDuplicate(updateUserFilterRQ, + projectDetails.getProjectName(), user); + filtersMapping.put(id, createdFilter.getId()); + }); + return filtersMapping; + } + + +} diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java index ccebf7ca6d..613a111a09 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/GetDashboardHandlerImpl.java @@ -62,9 +62,9 @@ public DashboardResource getDashboard(Long id, ReportPortalUser.ProjectDetails p public DashboardConfigResource getDashboardConfig(Long id, ReportPortalUser.ProjectDetails projectDetails) { var dashboard = getDashboardById(id, projectDetails); - var widgetsConfiguration = widgetConfigurationService.getWidgetsConfiguration( + var widgets = widgetConfigurationService.getWidgetsConfiguration( dashboard, projectDetails); - return DashboardConfigResource.builder().widgets(widgetsConfiguration).build(); + return DashboardConfigResource.builder().widgetsConfig(widgets).build(); } private Dashboard getDashboardById(Long id, ProjectDetails projectDetails) { diff --git a/src/main/java/com/epam/ta/reportportal/core/filter/UpdateUserFilterHandler.java b/src/main/java/com/epam/ta/reportportal/core/filter/UpdateUserFilterHandler.java index be378c31b1..aa51837198 100644 --- a/src/main/java/com/epam/ta/reportportal/core/filter/UpdateUserFilterHandler.java +++ b/src/main/java/com/epam/ta/reportportal/core/filter/UpdateUserFilterHandler.java @@ -42,6 +42,17 @@ public interface UpdateUserFilterHandler { EntryCreatedRS createFilter(UpdateUserFilterRQ createFilterRQ, String projectName, ReportPortalUser user); + /** + * Creates new filter for a specific project and user and creates copy on duplicate name. + * + * @param createFilterRQ The request containing the filter creation data + * @param projectName The name of the project where the filter will be created + * @param user The {@link ReportPortalUser} who is creating the filter + * @return An {@link EntryCreatedRS} instance containing the created filter's ID + */ + EntryCreatedRS createFilterCopyOnDuplicate(UpdateUserFilterRQ createFilterRQ, String projectName, + ReportPortalUser user); + /** * Update user filter with specified id * diff --git a/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java index dc37dbdfd0..72d17872ac 100644 --- a/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java @@ -16,17 +16,21 @@ package com.epam.ta.reportportal.core.filter.impl; -import static com.epam.ta.reportportal.commons.Preconditions.NOT_EMPTY_COLLECTION; import static com.epam.reportportal.rules.commons.validation.BusinessRule.expect; -import static com.epam.ta.reportportal.ws.converter.converters.UserFilterConverter.TO_ACTIVITY_RESOURCE; import static com.epam.reportportal.rules.exception.ErrorType.USER_FILTER_NOT_FOUND; +import static com.epam.ta.reportportal.commons.Preconditions.NOT_EMPTY_COLLECTION; +import static com.epam.ta.reportportal.ws.converter.converters.UserFilterConverter.TO_ACTIVITY_RESOURCE; +import com.epam.reportportal.model.ValidationConstraints; +import com.epam.reportportal.rules.commons.validation.BusinessRule; +import com.epam.reportportal.rules.commons.validation.Suppliers; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.commons.ReportPortalUser; +import com.epam.ta.reportportal.commons.ReportPortalUser.ProjectDetails; import com.epam.ta.reportportal.commons.querygen.Condition; import com.epam.ta.reportportal.commons.querygen.CriteriaHolder; import com.epam.ta.reportportal.commons.querygen.FilterTarget; -import com.epam.reportportal.rules.commons.validation.BusinessRule; -import com.epam.reportportal.rules.commons.validation.Suppliers; import com.epam.ta.reportportal.core.events.MessageBus; import com.epam.ta.reportportal.core.events.activity.FilterCreatedEvent; import com.epam.ta.reportportal.core.events.activity.FilterUpdatedEvent; @@ -34,7 +38,6 @@ import com.epam.ta.reportportal.dao.UserFilterRepository; import com.epam.ta.reportportal.entity.filter.ObjectType; import com.epam.ta.reportportal.entity.filter.UserFilter; -import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.model.CollectionsRQ; import com.epam.ta.reportportal.model.EntryCreatedRS; import com.epam.ta.reportportal.model.activity.UserFilterActivityResource; @@ -42,9 +45,7 @@ import com.epam.ta.reportportal.model.filter.UpdateUserFilterRQ; import com.epam.ta.reportportal.util.ProjectExtractor; import com.epam.ta.reportportal.ws.converter.builders.UserFilterBuilder; -import com.epam.reportportal.rules.exception.ErrorType; import com.epam.ta.reportportal.ws.reporting.OperationCompletionRS; -import com.epam.reportportal.model.ValidationConstraints; import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -99,6 +100,28 @@ public EntryCreatedRS createFilter(UpdateUserFilterRQ createFilterRQ, String pro return new EntryCreatedRS(filter.getId()); } + + @Override + public EntryCreatedRS createFilterCopyOnDuplicate(UpdateUserFilterRQ createFilterRQ, + String projectName, + ReportPortalUser user) { + ReportPortalUser.ProjectDetails projectDetails = + projectExtractor.extractProjectDetails(user, projectName); + + validateFilterRq(createFilterRQ); + validateFilterName(createFilterRQ, user, projectDetails); + + UserFilter filter = new UserFilterBuilder().addFilterRq(createFilterRQ) + .addProject(projectDetails.getProjectId()).addOwner(user.getUsername()).get(); + + userFilterRepository.save(filter); + messageBus.publishActivity( + new FilterCreatedEvent(TO_ACTIVITY_RESOURCE.apply(filter), user.getUserId(), + user.getUsername() + )); + return new EntryCreatedRS(filter.getId()); + } + @Override public OperationCompletionRS updateUserFilter(Long userFilterId, UpdateUserFilterRQ updateRQ, ReportPortalUser.ProjectDetails projectDetails, ReportPortalUser user) { @@ -186,6 +209,18 @@ private void validateFilterRq(UpdateUserFilterRQ updateFilerRq) { )); } + + private void validateFilterName(UpdateUserFilterRQ createFilterRQ, + ReportPortalUser user, ProjectDetails projectDetails) { + int maxIterations = 100; + int count = 0; + while (userFilterRepository.existsByNameAndOwnerAndProjectId(createFilterRQ.getName(), + user.getUsername(), projectDetails.getProjectId()) && count < maxIterations) { + createFilterRQ.setName(createFilterRQ.getName() + "_copy"); + count++; + } + } + private String cutAttributesToMaxLength(String keyAndValue) { if (keyAndValue == null || keyAndValue.isEmpty()) { return keyAndValue; diff --git a/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java b/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java index 49c4850901..b02de04597 100644 --- a/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java +++ b/src/main/java/com/epam/ta/reportportal/core/widget/WidgetConfigurationService.java @@ -20,7 +20,7 @@ import com.epam.ta.reportportal.commons.ReportPortalUser.ProjectDetails; import com.epam.ta.reportportal.dao.WidgetRepository; import com.epam.ta.reportportal.entity.dashboard.Dashboard; -import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; +import com.epam.ta.reportportal.entity.dashboard.DashboardWidget; import com.epam.ta.reportportal.model.widget.WidgetConfigResource; import com.epam.ta.reportportal.ws.converter.converters.WidgetConverter; import java.util.List; @@ -39,19 +39,20 @@ public class WidgetConfigurationService { public List getWidgetsConfiguration(Dashboard dashboard, ProjectDetails projectDetails) { - return dashboard.getDashboardWidgets().stream().map(WidgetConverter.TO_OBJECT_MODEL) + return dashboard.getDashboardWidgets().stream() .map(widget -> getWidgetConfig(widget, projectDetails)).collect(Collectors.toList()); } - private WidgetConfigResource getWidgetConfig(WidgetObjectModel widgetObject, + private WidgetConfigResource getWidgetConfig(DashboardWidget dashboardWidget, ProjectDetails projectDetails) { - var widget = widgetRepository.findByIdAndProjectId(widgetObject.getWidgetId(), + var widgetId = dashboardWidget.getWidget().getId(); + var widget = widgetRepository.findByIdAndProjectId(widgetId, projectDetails.getProjectId()).orElseThrow( - () -> new ReportPortalException(ErrorType.WIDGET_NOT_FOUND_IN_PROJECT, - widgetObject.getWidgetId(), + () -> new ReportPortalException(ErrorType.WIDGET_NOT_FOUND_IN_PROJECT, widgetId, projectDetails.getProjectName() )); - return WidgetConfigResource.builder().widgetObject(widgetObject) + return WidgetConfigResource.builder() + .widgetObject(WidgetConverter.TO_OBJECT_MODEL.apply(dashboardWidget)) .widgetResource(WidgetConverter.TO_WIDGET_RESOURCE.apply(widget)).build(); } diff --git a/src/main/java/com/epam/ta/reportportal/core/widget/impl/CreateWidgetHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/widget/impl/CreateWidgetHandlerImpl.java index e33e56b7a8..f5ea83d51c 100644 --- a/src/main/java/com/epam/ta/reportportal/core/widget/impl/CreateWidgetHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/widget/impl/CreateWidgetHandlerImpl.java @@ -17,14 +17,11 @@ package com.epam.ta.reportportal.core.widget.impl; import static com.epam.ta.reportportal.commons.Predicates.not; -import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_ID; import static com.epam.ta.reportportal.ws.converter.converters.WidgetConverter.TO_ACTIVITY_RESOURCE; -import com.epam.ta.reportportal.commons.ReportPortalUser; -import com.epam.ta.reportportal.commons.querygen.Condition; -import com.epam.ta.reportportal.commons.querygen.Filter; -import com.epam.ta.reportportal.commons.querygen.ProjectFilter; import com.epam.reportportal.rules.commons.validation.BusinessRule; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.ta.reportportal.core.events.MessageBus; import com.epam.ta.reportportal.core.events.activity.WidgetCreatedEvent; import com.epam.ta.reportportal.core.filter.UpdateUserFilterHandler; @@ -38,13 +35,10 @@ import com.epam.ta.reportportal.model.EntryCreatedRS; import com.epam.ta.reportportal.model.widget.WidgetRQ; import com.epam.ta.reportportal.ws.converter.builders.WidgetBuilder; -import com.epam.reportportal.rules.exception.ErrorType; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; /** @@ -108,12 +102,7 @@ public EntryCreatedRS createWidget(WidgetRQ createWidgetRQ, private List getUserFilters(List filterIds, Long projectId, String username) { if (CollectionUtils.isNotEmpty(filterIds)) { - String ids = filterIds.stream().map(String::valueOf).collect(Collectors.joining(",")); - Filter defaultFilter = new Filter(UserFilter.class, Condition.IN, false, ids, CRITERIA_ID); - List userFilters = - filterRepository.findByFilter(ProjectFilter.of(defaultFilter, projectId), - Pageable.unpaged() - ).getContent(); + var userFilters = filterRepository.findAllByIdInAndProjectId(filterIds, projectId); BusinessRule.expect(userFilters, not(List::isEmpty)) .verify(ErrorType.USER_FILTER_NOT_FOUND, filterIds, projectId, username); return userFilters; diff --git a/src/main/java/com/epam/ta/reportportal/model/dashboard/AddWidgetRq.java b/src/main/java/com/epam/ta/reportportal/model/dashboard/AddWidgetRq.java index 8e563ae71b..6ea1b37dd0 100644 --- a/src/main/java/com/epam/ta/reportportal/model/dashboard/AddWidgetRq.java +++ b/src/main/java/com/epam/ta/reportportal/model/dashboard/AddWidgetRq.java @@ -20,23 +20,21 @@ import com.fasterxml.jackson.annotation.JsonProperty; import javax.validation.Valid; import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; /** * @author Pavel Bortnik */ @JsonInclude(JsonInclude.Include.NON_NULL) +@AllArgsConstructor +@NoArgsConstructor +@Data public class AddWidgetRq { @Valid @NotNull @JsonProperty(value = "addWidget") private DashboardResource.WidgetObjectModel addWidget; - - public DashboardResource.WidgetObjectModel getAddWidget() { - return addWidget; - } - - public void setAddWidget(DashboardResource.WidgetObjectModel addWidget) { - this.addWidget = addWidget; - } } diff --git a/src/main/java/com/epam/ta/reportportal/model/dashboard/CreateDashboardRQ.java b/src/main/java/com/epam/ta/reportportal/model/dashboard/CreateDashboardRQ.java index 0f871b3afc..9785539569 100644 --- a/src/main/java/com/epam/ta/reportportal/model/dashboard/CreateDashboardRQ.java +++ b/src/main/java/com/epam/ta/reportportal/model/dashboard/CreateDashboardRQ.java @@ -16,14 +16,22 @@ package com.epam.ta.reportportal.model.dashboard; +import static com.epam.reportportal.model.ValidationConstraints.MAX_ENTITY_DESCRIPTION; + +import com.epam.reportportal.model.ValidationConstraints; import com.epam.ta.reportportal.model.BaseEntityRQ; import com.epam.ta.reportportal.ws.annotations.NotBlankWithSize; -import com.epam.reportportal.model.ValidationConstraints; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import javax.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; /** * Domain object for creating dashboards. @@ -46,12 +54,4 @@ public String getName() { public void setName(String name) { this.name = name; } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("CreateDashboardRQ{"); - sb.append("name='").append(name).append('\''); - sb.append('}'); - return sb.toString(); - } } \ No newline at end of file diff --git a/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java index 3f7b4b0642..8a92355e37 100644 --- a/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardConfigResource.java @@ -18,17 +18,21 @@ import com.epam.ta.reportportal.model.widget.WidgetConfigResource; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * @author Pavel Bortnik */ @Data @Builder +@NoArgsConstructor +@AllArgsConstructor public class DashboardConfigResource { @JsonProperty(value = "widgets") - private List widgets; + private List widgetsConfig; } diff --git a/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardPreconfiguredRq.java b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardPreconfiguredRq.java new file mode 100644 index 0000000000..4ad0eea14b --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/model/dashboard/DashboardPreconfiguredRq.java @@ -0,0 +1,41 @@ +/* + * Copyright 2025 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.epam.ta.reportportal.model.dashboard; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Pavel Bortnik + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DashboardPreconfiguredRq extends CreateDashboardRQ { + + @NotNull + @JsonProperty(value = "config", required = true) + @Schema(requiredMode = RequiredMode.REQUIRED) + private DashboardConfigResource dashboardConfig; + +} diff --git a/src/main/java/com/epam/ta/reportportal/model/filter/UserFilterResource.java b/src/main/java/com/epam/ta/reportportal/model/filter/UserFilterResource.java index 3928282faa..e183e49ad0 100644 --- a/src/main/java/com/epam/ta/reportportal/model/filter/UserFilterResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/filter/UserFilterResource.java @@ -31,6 +31,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.EqualsAndHashCode; /** * JSON Representation of ReportPortal's UserFilter domain object @@ -38,6 +39,7 @@ * @author Aliaksei_Makayed */ +@EqualsAndHashCode(callSuper = true) @JsonInclude(Include.NON_NULL) public class UserFilterResource extends OwnedResource { diff --git a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java index 3459d6c099..4b763301b2 100644 --- a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java @@ -16,17 +16,22 @@ package com.epam.ta.reportportal.model.widget; import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * @author Pavel Bortnik */ @Data @Builder +@AllArgsConstructor +@NoArgsConstructor public class WidgetConfigResource { private WidgetObjectModel widgetObject; + private WidgetResource widgetResource; } diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java index 7b9c4f8a85..20dc8952b1 100644 --- a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java +++ b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java @@ -26,9 +26,11 @@ import com.epam.ta.reportportal.core.dashboard.DeleteDashboardHandler; import com.epam.ta.reportportal.core.dashboard.GetDashboardHandler; import com.epam.ta.reportportal.core.dashboard.UpdateDashboardHandler; +import com.epam.ta.reportportal.core.dashboard.impl.DashboardPreconfiguredService; import com.epam.ta.reportportal.entity.dashboard.Dashboard; import com.epam.ta.reportportal.model.EntryCreatedRS; import com.epam.ta.reportportal.model.dashboard.AddWidgetRq; +import com.epam.ta.reportportal.model.dashboard.DashboardPreconfiguredRq; import com.epam.ta.reportportal.model.dashboard.CreateDashboardRQ; import com.epam.ta.reportportal.model.dashboard.DashboardConfigResource; import com.epam.ta.reportportal.model.dashboard.DashboardResource; @@ -39,7 +41,7 @@ import com.epam.ta.reportportal.ws.resolver.SortFor; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -58,6 +60,7 @@ /** * @author Pavel Bortnik */ +@RequiredArgsConstructor @RestController @PreAuthorize(ASSIGNED_TO_PROJECT) @RequestMapping("/v1/{projectName}/dashboard") @@ -66,21 +69,11 @@ public class DashboardController { private final ProjectExtractor projectExtractor; private final CreateDashboardHandler createDashboardHandler; + private final DashboardPreconfiguredService dashboardPreconfiguredService; private final UpdateDashboardHandler updateDashboardHandler; private final GetDashboardHandler getDashboardHandler; private final DeleteDashboardHandler deleteDashboardHandler; - @Autowired - public DashboardController(ProjectExtractor projectExtractor, - CreateDashboardHandler createDashboardHandler, UpdateDashboardHandler updateDashboardHandler, - GetDashboardHandler getDashboardHandler, DeleteDashboardHandler deleteDashboardHandler) { - this.projectExtractor = projectExtractor; - this.createDashboardHandler = createDashboardHandler; - this.updateDashboardHandler = updateDashboardHandler; - this.getDashboardHandler = getDashboardHandler; - this.deleteDashboardHandler = deleteDashboardHandler; - } - @Transactional @PostMapping @ResponseStatus(CREATED) @@ -158,7 +151,7 @@ public DashboardResource getDashboard(@PathVariable String projectName, @Transactional - @GetMapping(value = "/copy/{dashboardId}") + @GetMapping(value = "/{dashboardId}/config") @ResponseStatus(OK) @Operation(summary = "Get Dashboard configuration including its widgets and filters if any") public DashboardConfigResource getDashboardConfig(@PathVariable String projectName, @@ -166,4 +159,15 @@ public DashboardConfigResource getDashboardConfig(@PathVariable String projectNa return getDashboardHandler.getDashboardConfig( dashboardId, projectExtractor.extractProjectDetails(user, projectName)); } + + @Transactional + @PostMapping(value = "/preconfigured") + @ResponseStatus(OK) + @Operation(summary = "Create Dashboard with provided configuration including its widgets and filters if any") + public EntryCreatedRS creatPreconfigured(@PathVariable String projectName, + @RequestBody @Validated DashboardPreconfiguredRq rq, + @AuthenticationPrincipal ReportPortalUser user) { + return dashboardPreconfiguredService.createDashboard( + projectExtractor.extractProjectDetails(user, projectName), rq, user); + } } diff --git a/src/main/resources/demo/demo_widgets.json b/src/main/resources/demo/demo_widgets.json index 0229bbf88d..c83944b8c3 100644 --- a/src/main/resources/demo/demo_widgets.json +++ b/src/main/resources/demo/demo_widgets.json @@ -122,7 +122,7 @@ "contentParameters": { "itemsCount": 50, "contentFields": [ - "statistics$executions$failed'" + "statistics$executions$failed" ], "widgetOptions": { } From 71ab3b50e7d7d159b8365bc5ff45800a0e408022 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Fri, 31 Jan 2025 12:18:52 +0300 Subject: [PATCH 4/9] EPMRPP-98549 || Add more validations --- .../reportportal/model/widget/WidgetConfigResource.java | 3 +++ .../reportportal/ws/controller/DashboardController.java | 2 +- .../ws/controller/DashboardControllerTest.java | 8 ++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java index 4b763301b2..6670255a97 100644 --- a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java @@ -16,6 +16,7 @@ package com.epam.ta.reportportal.model.widget; import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -30,8 +31,10 @@ @NoArgsConstructor public class WidgetConfigResource { + @NotNull private WidgetObjectModel widgetObject; + @NotNull private WidgetResource widgetResource; } diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java index 20dc8952b1..f985cb83aa 100644 --- a/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java +++ b/src/main/java/com/epam/ta/reportportal/ws/controller/DashboardController.java @@ -164,7 +164,7 @@ public DashboardConfigResource getDashboardConfig(@PathVariable String projectNa @PostMapping(value = "/preconfigured") @ResponseStatus(OK) @Operation(summary = "Create Dashboard with provided configuration including its widgets and filters if any") - public EntryCreatedRS creatPreconfigured(@PathVariable String projectName, + public EntryCreatedRS createPreconfigured(@PathVariable String projectName, @RequestBody @Validated DashboardPreconfiguredRq rq, @AuthenticationPrincipal ReportPortalUser user) { return dashboardPreconfiguredService.createDashboard( diff --git a/src/test/java/com/epam/ta/reportportal/ws/controller/DashboardControllerTest.java b/src/test/java/com/epam/ta/reportportal/ws/controller/DashboardControllerTest.java index c6db107b8a..8070e11089 100644 --- a/src/test/java/com/epam/ta/reportportal/ws/controller/DashboardControllerTest.java +++ b/src/test/java/com/epam/ta/reportportal/ws/controller/DashboardControllerTest.java @@ -86,6 +86,14 @@ void getDashboardPositive() throws Exception { .andExpect(status().isOk()); } + + @Test + void getDashboardConfig() throws Exception { + mockMvc.perform( + get(DEFAULT_PROJECT_BASE_URL + "/dashboard/17/config").with(token(oAuthHelper.getDefaultToken()))) + .andExpect(status().isOk()); + } + @Test void updateDashboardPositive() throws Exception { final UpdateDashboardRQ rq = new UpdateDashboardRQ(); From 2ab7b22705ce27cf0a208416bb0086a3e3042727 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Mon, 10 Feb 2025 21:52:51 +0300 Subject: [PATCH 5/9] EPMRPP-99229 || Create unique name validations --- build.gradle | 6 +- .../impl/CreateDashboardHandlerImpl.java | 9 ++- .../impl/UpdateDashboardHandlerImpl.java | 64 ++++++++++++------- .../impl/UpdateUserFilterHandlerImpl.java | 18 +++--- .../impl/CreateDashboardHandlerImplTest.java | 4 +- .../impl/UpdateUserFilterHandlerTest.java | 19 ++---- 6 files changed, 64 insertions(+), 56 deletions(-) diff --git a/build.gradle b/build.gradle index 561a0c7382..a7ab9d2ff0 100644 --- a/build.gradle +++ b/build.gradle @@ -72,9 +72,9 @@ dependencies { implementation 'com.epam.reportportal:commons' implementation 'com.epam.reportportal:plugin-api' } else { - implementation 'com.epam.reportportal:commons-dao' - implementation 'com.epam.reportportal:commons' - implementation 'com.epam.reportportal:plugin-api' + implementation 'com.github.reportportal:commons-dao:845ca634' + implementation 'com.github.reportportal:commons:0bd0667' + implementation 'com.github.reportportal:plugin-api:80b20c8' } implementation 'org.springframework.boot:spring-boot-starter-aop' diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java index a02b0cc0ee..ca92dfeb0d 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImpl.java @@ -41,11 +41,10 @@ @RequiredArgsConstructor public class CreateDashboardHandlerImpl implements CreateDashboardHandler { + private final static int DASHBOARD_LIMIT = 3000; private final DashboardRepository dashboardRepository; private final MessageBus messageBus; - private final static int DASHBOARD_LIMIT = 3000; - @Override public EntryCreatedRS createDashboard(ReportPortalUser.ProjectDetails projectDetails, CreateDashboardRQ rq, ReportPortalUser user) { @@ -56,10 +55,10 @@ public EntryCreatedRS createDashboard(ReportPortalUser.ProjectDetails projectDet "The limit of {} dashboards has been reached. To create a new one you need to delete at least one created previously.", DASHBOARD_LIMIT )); + BusinessRule.expect( - dashboardRepository.existsByNameAndOwnerAndProjectId(rq.getName(), user.getUsername(), - projectDetails.getProjectId() - ), BooleanUtils::isFalse).verify(ErrorType.RESOURCE_ALREADY_EXISTS, rq.getName()); + dashboardRepository.existsByNameAndProjectId(rq.getName(), projectDetails.getProjectId()), + BooleanUtils::isFalse).verify(ErrorType.RESOURCE_ALREADY_EXISTS, rq.getName()); Dashboard dashboard = new DashboardBuilder().addDashboardRq(rq).addProject(projectDetails.getProjectId()) diff --git a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/UpdateDashboardHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/UpdateDashboardHandlerImpl.java index 32ffbee46f..f068972f82 100644 --- a/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/UpdateDashboardHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/dashboard/impl/UpdateDashboardHandlerImpl.java @@ -18,9 +18,11 @@ import static com.epam.ta.reportportal.ws.converter.converters.DashboardConverter.TO_ACTIVITY_RESOURCE; -import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.reportportal.rules.commons.validation.BusinessRule; import com.epam.reportportal.rules.commons.validation.Suppliers; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.ta.reportportal.core.dashboard.UpdateDashboardHandler; import com.epam.ta.reportportal.core.events.MessageBus; import com.epam.ta.reportportal.core.events.activity.DashboardUpdatedEvent; @@ -32,13 +34,11 @@ import com.epam.ta.reportportal.entity.dashboard.Dashboard; import com.epam.ta.reportportal.entity.dashboard.DashboardWidget; import com.epam.ta.reportportal.entity.widget.Widget; -import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.model.activity.DashboardActivityResource; import com.epam.ta.reportportal.model.dashboard.AddWidgetRq; import com.epam.ta.reportportal.model.dashboard.UpdateDashboardRQ; import com.epam.ta.reportportal.ws.converter.builders.DashboardBuilder; import com.epam.ta.reportportal.ws.converter.converters.WidgetConverter; -import com.epam.reportportal.rules.exception.ErrorType; import com.epam.ta.reportportal.ws.reporting.OperationCompletionRS; import java.util.Set; import org.apache.commons.collections.CollectionUtils; @@ -64,7 +64,8 @@ public class UpdateDashboardHandlerImpl implements UpdateDashboardHandler { @Autowired public UpdateDashboardHandlerImpl(DashboardRepository dashboardRepository, - @Qualifier("delegatingStateContentRemover") WidgetContentRemover widgetContentRemover, MessageBus messageBus, + @Qualifier("delegatingStateContentRemover") WidgetContentRemover widgetContentRemover, + MessageBus messageBus, DashboardWidgetRepository dashboardWidgetRepository, WidgetRepository widgetRepository) { this.dashboardRepository = dashboardRepository; this.widgetContentRemover = widgetContentRemover; @@ -74,9 +75,11 @@ public UpdateDashboardHandlerImpl(DashboardRepository dashboardRepository, } @Override - public OperationCompletionRS updateDashboard(ReportPortalUser.ProjectDetails projectDetails, UpdateDashboardRQ rq, Long dashboardId, + public OperationCompletionRS updateDashboard(ReportPortalUser.ProjectDetails projectDetails, + UpdateDashboardRQ rq, Long dashboardId, ReportPortalUser user) { - Dashboard dashboard = dashboardRepository.findByIdAndProjectId(dashboardId, projectDetails.getProjectId()) + Dashboard dashboard = dashboardRepository.findByIdAndProjectId(dashboardId, + projectDetails.getProjectId()) .orElseThrow(() -> new ReportPortalException(ErrorType.DASHBOARD_NOT_FOUND_IN_PROJECT, dashboardId, projectDetails.getProjectName() @@ -84,8 +87,7 @@ public OperationCompletionRS updateDashboard(ReportPortalUser.ProjectDetails pro DashboardActivityResource before = TO_ACTIVITY_RESOURCE.apply(dashboard); if (!dashboard.getName().equals(rq.getName())) { - BusinessRule.expect(dashboardRepository.existsByNameAndOwnerAndProjectId(rq.getName(), - user.getUsername(), + BusinessRule.expect(dashboardRepository.existsByNameAndProjectId(rq.getName(), projectDetails.getProjectId() ), BooleanUtils::isFalse) .verify(ErrorType.RESOURCE_ALREADY_EXISTS, rq.getName()); @@ -99,13 +101,16 @@ public OperationCompletionRS updateDashboard(ReportPortalUser.ProjectDetails pro user.getUserId(), user.getUsername() )); - return new OperationCompletionRS("Dashboard with ID = '" + dashboard.getId() + "' successfully updated"); + return new OperationCompletionRS( + "Dashboard with ID = '" + dashboard.getId() + "' successfully updated"); } @Override - public OperationCompletionRS addWidget(Long dashboardId, ReportPortalUser.ProjectDetails projectDetails, AddWidgetRq rq, + public OperationCompletionRS addWidget(Long dashboardId, + ReportPortalUser.ProjectDetails projectDetails, AddWidgetRq rq, ReportPortalUser user) { - final Dashboard dashboard = dashboardRepository.findByIdAndProjectId(dashboardId, projectDetails.getProjectId()) + final Dashboard dashboard = dashboardRepository.findByIdAndProjectId(dashboardId, + projectDetails.getProjectId()) .orElseThrow(() -> new ReportPortalException(ErrorType.DASHBOARD_NOT_FOUND_IN_PROJECT, dashboardId, projectDetails.getProjectName() @@ -114,16 +119,19 @@ public OperationCompletionRS addWidget(Long dashboardId, ReportPortalUser.Projec validateWidgetBeforeAddingToDashboard(rq, dashboard, dashboardWidgets); - Widget widget = widgetRepository.findByIdAndProjectId(rq.getAddWidget().getWidgetId(), projectDetails.getProjectId()) + Widget widget = widgetRepository.findByIdAndProjectId(rq.getAddWidget().getWidgetId(), + projectDetails.getProjectId()) .orElseThrow(() -> new ReportPortalException(ErrorType.WIDGET_NOT_FOUND_IN_PROJECT, rq.getAddWidget().getWidgetId(), projectDetails.getProjectName() )); boolean isCreatedOnDashboard = CollectionUtils.isEmpty(widget.getDashboardWidgets()); - DashboardWidget dashboardWidget = WidgetConverter.toDashboardWidget(rq.getAddWidget(), dashboard, widget, isCreatedOnDashboard); + DashboardWidget dashboardWidget = WidgetConverter.toDashboardWidget(rq.getAddWidget(), + dashboard, widget, isCreatedOnDashboard); dashboardWidgetRepository.save(dashboardWidget); return new OperationCompletionRS( - "Widget with ID = '" + widget.getId() + "' was successfully added to the dashboard with ID = '" + dashboard.getId() + "'"); + "Widget with ID = '" + widget.getId() + + "' was successfully added to the dashboard with ID = '" + dashboard.getId() + "'"); } @@ -149,9 +157,11 @@ private void validateWidgetBeforeAddingToDashboard(AddWidgetRq rq, Dashboard das } @Override - public OperationCompletionRS removeWidget(Long widgetId, Long dashboardId, ReportPortalUser.ProjectDetails projectDetails, + public OperationCompletionRS removeWidget(Long widgetId, Long dashboardId, + ReportPortalUser.ProjectDetails projectDetails, ReportPortalUser user) { - Dashboard dashboard = dashboardRepository.findByIdAndProjectId(dashboardId, projectDetails.getProjectId()) + Dashboard dashboard = dashboardRepository.findByIdAndProjectId(dashboardId, + projectDetails.getProjectId()) .orElseThrow(() -> new ReportPortalException(ErrorType.DASHBOARD_NOT_FOUND_IN_PROJECT, dashboardId, projectDetails.getProjectName() @@ -164,10 +174,11 @@ public OperationCompletionRS removeWidget(Long widgetId, Long dashboardId, Repor if (shouldDelete(widget)) { OperationCompletionRS result = deleteWidget(widget); - messageBus.publishActivity(new WidgetDeletedEvent(WidgetConverter.TO_ACTIVITY_RESOURCE.apply(widget), - user.getUserId(), - user.getUsername() - )); + messageBus.publishActivity( + new WidgetDeletedEvent(WidgetConverter.TO_ACTIVITY_RESOURCE.apply(widget), + user.getUserId(), + user.getUsername() + )); return result; } @@ -175,17 +186,21 @@ public OperationCompletionRS removeWidget(Long widgetId, Long dashboardId, Repor .stream() .filter(dashboardWidget -> widget.getId().equals(dashboardWidget.getId().getWidgetId())) .findFirst() - .orElseThrow(() -> new ReportPortalException(ErrorType.WIDGET_NOT_FOUND_IN_DASHBOARD, widgetId, dashboardId)); + .orElseThrow( + () -> new ReportPortalException(ErrorType.WIDGET_NOT_FOUND_IN_DASHBOARD, widgetId, + dashboardId)); dashboardWidgetRepository.delete(toRemove); return new OperationCompletionRS( - "Widget with ID = '" + widget.getId() + "' was successfully removed from the dashboard with ID = '" + dashboard.getId() + "Widget with ID = '" + widget.getId() + + "' was successfully removed from the dashboard with ID = '" + dashboard.getId() + "'"); } private boolean shouldDelete(Widget widget) { - return dashboardWidgetRepository.countAllByWidgetId(widget.getId()) <= DELETE_WIDGET_COUNT_THRESHOLD; + return dashboardWidgetRepository.countAllByWidgetId(widget.getId()) + <= DELETE_WIDGET_COUNT_THRESHOLD; } /** @@ -198,7 +213,8 @@ private OperationCompletionRS deleteWidget(Widget widget) { widgetContentRemover.removeContent(widget); dashboardWidgetRepository.deleteAll(widget.getDashboardWidgets()); widgetRepository.delete(widget); - return new OperationCompletionRS("Widget with ID = '" + widget.getId() + "' was successfully deleted from the system."); + return new OperationCompletionRS( + "Widget with ID = '" + widget.getId() + "' was successfully deleted from the system."); } } diff --git a/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java index 72d17872ac..f0cf51c8fc 100644 --- a/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerImpl.java @@ -27,7 +27,6 @@ import com.epam.reportportal.rules.exception.ErrorType; import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.commons.ReportPortalUser; -import com.epam.ta.reportportal.commons.ReportPortalUser.ProjectDetails; import com.epam.ta.reportportal.commons.querygen.Condition; import com.epam.ta.reportportal.commons.querygen.CriteriaHolder; import com.epam.ta.reportportal.commons.querygen.FilterTarget; @@ -82,8 +81,8 @@ public EntryCreatedRS createFilter(UpdateUserFilterRQ createFilterRQ, String pro validateFilterRq(createFilterRQ); BusinessRule.expect( - userFilterRepository.existsByNameAndOwnerAndProjectId(createFilterRQ.getName(), - user.getUsername(), projectDetails.getProjectId() + userFilterRepository.existsByNameAndProjectId(createFilterRQ.getName(), + projectDetails.getProjectId() ), BooleanUtils::isFalse) .verify(ErrorType.USER_FILTER_ALREADY_EXISTS, createFilterRQ.getName(), user.getUsername(), projectName @@ -109,7 +108,7 @@ public EntryCreatedRS createFilterCopyOnDuplicate(UpdateUserFilterRQ createFilte projectExtractor.extractProjectDetails(user, projectName); validateFilterRq(createFilterRQ); - validateFilterName(createFilterRQ, user, projectDetails); + validateFilterName(createFilterRQ, projectDetails.getProjectId()); UserFilter filter = new UserFilterBuilder().addFilterRq(createFilterRQ) .addProject(projectDetails.getProjectId()).addOwner(user.getUsername()).get(); @@ -138,9 +137,8 @@ public OperationCompletionRS updateUserFilter(Long userFilterId, UpdateUserFilte if (!userFilter.getName().equals(updateRQ.getName())) { BusinessRule.expect( - userFilterRepository.existsByNameAndOwnerAndProjectId(updateRQ.getName(), - userFilter.getOwner(), projectDetails.getProjectId() - ), BooleanUtils::isFalse) + userFilterRepository.existsByNameAndProjectId(updateRQ.getName(), + projectDetails.getProjectId()), BooleanUtils::isFalse) .verify(ErrorType.USER_FILTER_ALREADY_EXISTS, updateRQ.getName(), userFilter.getOwner(), projectDetails.getProjectName() ); @@ -211,11 +209,11 @@ private void validateFilterRq(UpdateUserFilterRQ updateFilerRq) { private void validateFilterName(UpdateUserFilterRQ createFilterRQ, - ReportPortalUser user, ProjectDetails projectDetails) { + Long projectId) { int maxIterations = 100; int count = 0; - while (userFilterRepository.existsByNameAndOwnerAndProjectId(createFilterRQ.getName(), - user.getUsername(), projectDetails.getProjectId()) && count < maxIterations) { + while (userFilterRepository.existsByNameAndProjectId(createFilterRQ.getName(), projectId) + && count < maxIterations) { createFilterRQ.setName(createFilterRQ.getName() + "_copy"); count++; } diff --git a/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java b/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java index ffdd8430bd..0c9d0bfab0 100644 --- a/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java +++ b/src/test/java/com/epam/ta/reportportal/core/dashboard/impl/CreateDashboardHandlerImplTest.java @@ -22,11 +22,11 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; +import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.ta.reportportal.dao.DashboardRepository; import com.epam.ta.reportportal.entity.project.ProjectRole; import com.epam.ta.reportportal.entity.user.UserRole; -import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.model.dashboard.CreateDashboardRQ; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -53,7 +53,7 @@ void createAlreadyExistDashboard() { final ReportPortalUser rpUser = getRpUser("owner", UserRole.USER, ProjectRole.MEMBER, 1L); - when(dashboardRepository.existsByNameAndOwnerAndProjectId("exist", "owner", 1L)).thenReturn( + when(dashboardRepository.existsByNameAndProjectId("exist", 1L)).thenReturn( true); final ReportPortalException exception = assertThrows(ReportPortalException.class, () -> handler.createDashboard(extractProjectDetails(rpUser, "test_project"), diff --git a/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java b/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java index 52935d0fac..d2235e6ae5 100644 --- a/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java +++ b/src/test/java/com/epam/ta/reportportal/core/filter/impl/UpdateUserFilterHandlerTest.java @@ -26,8 +26,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.reportportal.rules.commons.validation.Suppliers; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.commons.ReportPortalUser; import com.epam.ta.reportportal.core.events.ActivityEvent; import com.epam.ta.reportportal.core.events.MessageBus; import com.epam.ta.reportportal.core.filter.UpdateUserFilterHandler; @@ -38,7 +39,6 @@ import com.epam.ta.reportportal.entity.project.Project; import com.epam.ta.reportportal.entity.project.ProjectRole; import com.epam.ta.reportportal.entity.user.UserRole; -import com.epam.reportportal.rules.exception.ReportPortalException; import com.epam.ta.reportportal.model.filter.Order; import com.epam.ta.reportportal.model.filter.UpdateUserFilterRQ; import com.epam.ta.reportportal.model.filter.UserFilterCondition; @@ -64,13 +64,9 @@ class UpdateUserFilterHandlerTest { private ProjectUserRepository projectUserRepository = mock(ProjectUserRepository.class); private ProjectExtractor projectExtractor = new ProjectExtractor(projectUserRepository); - private UserFilterRepository userFilterRepository = mock(UserFilterRepository.class); - private WidgetRepository widgetRepository = mock(WidgetRepository.class); - private MessageBus messageBus = mock(MessageBus.class); - private UpdateUserFilterHandler updateUserFilterHandler = new UpdateUserFilterHandlerImpl(projectExtractor, userFilterRepository, messageBus); @@ -119,9 +115,9 @@ void updateUserFilterWithAnotherNamePositive() { when(userFilter.getProject()).thenReturn(project); when(project.getId()).thenReturn(1L); - when(userFilterRepository.existsByNameAndOwnerAndProjectId(updateUserFilterRQ.getName(), "user", - 1L - )).thenReturn(Boolean.FALSE); + when( + userFilterRepository.existsByNameAndProjectId(updateUserFilterRQ.getName(), 1L)).thenReturn( + Boolean.FALSE); doNothing().when(messageBus).publishActivity(any(ActivityEvent.class)); @@ -152,9 +148,8 @@ void updateUserFilterWithAnotherNameNegative() { when(userFilter.getOwner()).thenReturn("user"); when(project.getId()).thenReturn(1L); - when(userFilterRepository.existsByNameAndOwnerAndProjectId(updateUserFilterRQ.getName(), - userFilter.getOwner(), projectDetails.getProjectId() - )).thenReturn(Boolean.TRUE); + when(userFilterRepository.existsByNameAndProjectId(updateUserFilterRQ.getName(), + projectDetails.getProjectId())).thenReturn(Boolean.TRUE); doNothing().when(messageBus).publishActivity(any(ActivityEvent.class)); From 03cbb2aead28d1fad1163b3dc064a3c6c78b2f09 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Thu, 13 Feb 2025 16:42:06 +0300 Subject: [PATCH 6/9] EPMRPP-99229 || Update deps --- build.gradle | 7 ++++--- .../ta/reportportal/model/widget/WidgetConfigResource.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index a7ab9d2ff0..216d45eb22 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,7 @@ repositories { if (!releaseMode) { maven { url 'https://jitpack.io' } } + maven { url 'https://jitpack.io' } maven { url "https://jaspersoft.jfrog.io/artifactory/third-party-ce-artifacts" } } @@ -72,9 +73,9 @@ dependencies { implementation 'com.epam.reportportal:commons' implementation 'com.epam.reportportal:plugin-api' } else { - implementation 'com.github.reportportal:commons-dao:845ca634' - implementation 'com.github.reportportal:commons:0bd0667' - implementation 'com.github.reportportal:plugin-api:80b20c8' + implementation 'com.github.reportportal:commons-dao:5c7b5a2' + implementation 'com.epam.reportportal:commons' + implementation 'com.epam.reportportal:plugin-api' } implementation 'org.springframework.boot:spring-boot-starter-aop' diff --git a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java index 6670255a97..3d16016df1 100644 --- a/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java +++ b/src/main/java/com/epam/ta/reportportal/model/widget/WidgetConfigResource.java @@ -16,7 +16,7 @@ package com.epam.ta.reportportal.model.widget; import com.epam.ta.reportportal.model.dashboard.DashboardResource.WidgetObjectModel; -import jakarta.validation.constraints.NotNull; +import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; From cf2a5f4ca058055256bb506d3b51ec355d795ba8 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Thu, 13 Feb 2025 16:47:57 +0300 Subject: [PATCH 7/9] EPMRPP-99229 || Update deps --- build.gradle | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 216d45eb22..b7c9164c7d 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,6 @@ repositories { if (!releaseMode) { maven { url 'https://jitpack.io' } } - maven { url 'https://jitpack.io' } maven { url "https://jaspersoft.jfrog.io/artifactory/third-party-ce-artifacts" } } @@ -74,8 +73,8 @@ dependencies { implementation 'com.epam.reportportal:plugin-api' } else { implementation 'com.github.reportportal:commons-dao:5c7b5a2' - implementation 'com.epam.reportportal:commons' - implementation 'com.epam.reportportal:plugin-api' + implementation 'com.github.reportportal:commons:0bd0667' + implementation 'com.github.reportportal:plugin-api:80b20c8' } implementation 'org.springframework.boot:spring-boot-starter-aop' From a64b5bbb1f895a0ed583e1280faad0fcd732e421 Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Thu, 13 Feb 2025 21:51:05 +0300 Subject: [PATCH 8/9] 5.13.3 || Update release version --- .github/workflows/release.yml | 2 +- build.gradle | 8 ++++---- gradle.properties | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c827934672..f75038325e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ on: env: GH_USER_NAME: github.actor - RELEASE_VERSION: 5.13.2 + RELEASE_VERSION: 5.13.3 REPOSITORY_URL: 'https://maven.pkg.github.com/' jobs: diff --git a/build.gradle b/build.gradle index b7c9164c7d..a7aedc5f24 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ ext['spring-boot.version'] = '2.5.15' dependencyManagement { imports { - mavenBom(releaseMode ? 'com.epam.reportportal:commons-bom:' + '5.13.1' : 'com.epam.reportportal:commons-bom:5.13.1') + mavenBom(releaseMode ? 'com.epam.reportportal:commons-bom:' + '5.13.2' : 'com.epam.reportportal:commons-bom:5.13.2') mavenBom('io.zonky.test.postgres:embedded-postgres-binaries-bom:16.2.0') } } @@ -72,9 +72,9 @@ dependencies { implementation 'com.epam.reportportal:commons' implementation 'com.epam.reportportal:plugin-api' } else { - implementation 'com.github.reportportal:commons-dao:5c7b5a2' - implementation 'com.github.reportportal:commons:0bd0667' - implementation 'com.github.reportportal:plugin-api:80b20c8' + implementation 'com.epam.reportportal:commons-dao' + implementation 'com.epam.reportportal:commons' + implementation 'com.epam.reportportal:plugin-api' } implementation 'org.springframework.boot:spring-boot-starter-aop' diff --git a/gradle.properties b/gradle.properties index be068a391b..301e06dddd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=5.13.2 +version=5.13.3 description=EPAM Report portal. Main API Service dockerPrepareEnvironment= dockerJavaOpts=-Xmx1g -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=70 -Djava.security.egd=file:/dev/./urandom From 50c756a4c2d53964f035871e7a4975e24d6d1e9e Mon Sep 17 00:00:00 2001 From: Pavel_Bortnik Date: Wed, 19 Feb 2025 13:52:50 +0300 Subject: [PATCH 9/9] Release 5.13.4 --- .github/workflows/release.yml | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f75038325e..055004858c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ on: env: GH_USER_NAME: github.actor - RELEASE_VERSION: 5.13.3 + RELEASE_VERSION: 5.13.4 REPOSITORY_URL: 'https://maven.pkg.github.com/' jobs: diff --git a/gradle.properties b/gradle.properties index 301e06dddd..00f3373abd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=5.13.3 +version=5.13.4 description=EPAM Report portal. Main API Service dockerPrepareEnvironment= dockerJavaOpts=-Xmx1g -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=70 -Djava.security.egd=file:/dev/./urandom