Skip to content

Commit

Permalink
Merge pull request #2177 from reportportal/rc/5.13.4
Browse files Browse the repository at this point in the history
Release 5.13.4
  • Loading branch information
pbortnik authored Feb 26, 2025
2 parents 986177d + 50c756a commit f31e25b
Show file tree
Hide file tree
Showing 24 changed files with 531 additions and 158 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:

env:
GH_USER_NAME: github.actor
RELEASE_VERSION: 5.13.2
RELEASE_VERSION: 5.13.4
REPOSITORY_URL: 'https://maven.pkg.github.com/'

jobs:
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
}
}
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version=5.13.2
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<DashboardResource> 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<DashboardResource> 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);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -29,29 +30,21 @@
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 static int DASHBOARD_LIMIT = 3000;
private final DashboardRepository dashboardRepository;
private final MessageBus messageBus;

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) {
Expand All @@ -62,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())
Expand Down
Original file line number Diff line number Diff line change
@@ -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<WidgetConfigResource> 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<Long> 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<Long> getNewFilterIds(HashMap<Long, Long> filterIdMapping,
WidgetConfigResource config) {
return config.getWidgetResource().getAppliedFilters().stream()
.map(it -> filterIdMapping.get(it.getFilterId())).collect(
Collectors.toList());
}

private HashMap<Long, Long> createUniqueFilters(List<WidgetConfigResource> widgetsConfigs,
ProjectDetails projectDetails, ReportPortalUser user) {

var filtersMapping = new HashMap<Long, Long>();

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;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -16,51 +16,61 @@

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;

/**
* @author Pavel Bortnik
*/
@Service
@RequiredArgsConstructor
public class GetDashboardHandlerImpl implements GetDashboardHandler {

private DashboardRepository dashboardRepository;
private final DashboardRepository dashboardRepository;
private final WidgetConfigurationService widgetConfigurationService;

@Override
public Iterable<DashboardResource> 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<DashboardResource> getDashboards(ReportPortalUser.ProjectDetails projectDetails, Pageable pageable, Filter filter,
ReportPortalUser user) {
final Page<Dashboard> 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 widgets = widgetConfigurationService.getWidgetsConfiguration(
dashboard, projectDetails);
return DashboardConfigResource.builder().widgetsConfig(widgets).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()
));
}
}
Loading

0 comments on commit f31e25b

Please sign in to comment.