Skip to content

Commit

Permalink
EPMRPP-92350 fix organization projects for member (#2017)
Browse files Browse the repository at this point in the history
  • Loading branch information
grabsefx committed Jul 16, 2024
1 parent e87b4b1 commit 0de44ea
Show file tree
Hide file tree
Showing 8 changed files with 117 additions and 51 deletions.
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ dependencies {
implementation 'com.epam.reportportal:commons'
implementation 'com.epam.reportportal:plugin-api:5.11.1'
} else {
implementation 'com.github.reportportal:commons-dao:eed07e1'
implementation 'com.github.reportportal:commons:a6b1156'
implementation 'com.github.reportportal:commons-dao:c47066c'
implementation 'com.github.reportportal:commons:c9999b9'
implementation 'com.github.reportportal:plugin-api:d1c0f0e'
}
swaggerCodegen 'io.swagger.codegen.v3:swagger-codegen-cli:3.0.57'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,13 @@
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.OrganizationDetails;
import com.epam.ta.reportportal.dao.organization.OrganizationRepositoryCustom;
import com.epam.ta.reportportal.dao.organization.OrganizationUserRepository;
import com.epam.ta.reportportal.entity.organization.Organization;
import com.epam.ta.reportportal.entity.user.OrganizationUser;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
Expand Down Expand Up @@ -55,12 +60,31 @@ public boolean isAllowed(Authentication authentication, Object orgId) {
ReportPortalUser rpUser = (ReportPortalUser) oauth.getUserAuthentication().getPrincipal();
BusinessRule.expect(rpUser, Objects::nonNull).verify(ErrorType.ACCESS_DENIED);

organizationRepositoryCustom.findById((Long) orgId).orElseThrow(() -> new ReportPortalException(ErrorType.ORGANIZATION_NOT_FOUND, orgId));
var org = organizationRepositoryCustom.findById((Long) orgId)
.orElseThrow(() -> new ReportPortalException(ErrorType.ORGANIZATION_NOT_FOUND, orgId));

var ou = organizationUserRepository.findByUserIdAndOrganization_Id(rpUser.getUserId(), (Long) orgId);
var organizationUser = organizationUserRepository.findByUserIdAndOrganization_Id(
rpUser.getUserId(), (Long) orgId);
organizationUser.ifPresent(orgUser -> fillOrganizationDetails(rpUser, org, orgUser));

return ou.isPresent();
return organizationUser.isPresent();

}


private void fillOrganizationDetails(ReportPortalUser rpUser, Organization organization,
OrganizationUser orgUser) {
final Map<String, OrganizationDetails> organizationDetailsMap = HashMap.newHashMap(2);

var orgDetails = new OrganizationDetails(
organization.getId(),
organization.getName(),
orgUser.getOrganizationRole(),
new HashMap<>()
);
organizationDetailsMap.put(organization.getId().toString(), orgDetails);

rpUser.setOrganizationDetails(organizationDetailsMap);
}

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

package com.epam.ta.reportportal.core.organization.impl;

import static com.epam.ta.reportportal.util.OffsetUtils.withOffsetData;
import static com.epam.ta.reportportal.util.OffsetUtils.responseWithPageParameters;

import com.epam.reportportal.api.model.OrganizationProfile;
import com.epam.reportportal.api.model.OrganizationProfilesList;
Expand Down Expand Up @@ -67,7 +67,8 @@ public OrganizationProfilesList getOrganizations(Queryable filter, Pageable page
new OrganizationProfilesList()
.items(organizationProfilesPage.getContent());

return withOffsetData(organizationProfilesList, organizationProfilesPage);
return responseWithPageParameters(organizationProfilesList, pageable,
organizationProfilesPage.getTotalElements());
}

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

package com.epam.ta.reportportal.core.organization.impl;

import static com.epam.ta.reportportal.util.OffsetUtils.withOffsetData;
import static com.epam.ta.reportportal.util.OffsetUtils.responseWithPageParameters;

import com.epam.reportportal.api.model.OrganizationUsersPage;
import com.epam.ta.reportportal.commons.querygen.Queryable;
Expand Down Expand Up @@ -44,6 +44,7 @@ public OrganizationUsersPage getOrganizationUsers(Queryable filter, Pageable pag
new OrganizationUsersPage()
.items(organizationUserProfiles.getContent());

return withOffsetData(organizationUsersPage, organizationUserProfiles);
return responseWithPageParameters(organizationUsersPage, pageable,
organizationUserProfiles.getTotalElements());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@

public interface OrganizationProjectHandler {

/**
* Returns a page of projects for organization based on the provided filter and pagination.
*
* @param user the {@link ReportPortalUser} whose details are used to apply the additional
* filters
* @param orgId the id of the organization whose projects are queried
* @param filter the {@link Filter} with condition(s) to be applied on the project querying
* @param pageable the {@link Pageable} to define the pagination details for the result
* @return an {@link OrganizationProjectsPage} represents a page of projects for the organization
*/
OrganizationProjectsPage getOrganizationProjectsList(ReportPortalUser user, Long orgId,
Filter filter,
Pageable pageable);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,76 +16,67 @@

package com.epam.ta.reportportal.core.project.impl;

import static com.epam.ta.reportportal.util.OffsetUtils.withOffsetData;
import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_PROJECT_ID;
import static com.epam.ta.reportportal.util.OffsetUtils.responseWithPageParameters;

import com.epam.reportportal.api.model.OrganizationProjectsPage;
import com.epam.reportportal.api.model.ProjectProfile;
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.querygen.Condition;
import com.epam.ta.reportportal.commons.querygen.Filter;
import com.epam.ta.reportportal.commons.querygen.FilterCondition;
import com.epam.ta.reportportal.core.project.OrganizationProjectHandler;
import com.epam.ta.reportportal.dao.organization.OrganizationUserRepository;
import com.epam.ta.reportportal.dao.ProjectUserRepository;
import com.epam.ta.reportportal.dao.project.OrganizationProjectRepository;
import com.epam.ta.reportportal.entity.organization.OrganizationRole;
import com.epam.ta.reportportal.entity.user.UserRole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.stream.Collectors;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
public class OrganizationProjectHandlerImpl implements OrganizationProjectHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(
OrganizationProjectHandlerImpl.class);

private final OrganizationUserRepository organizationUserRepository;
private final OrganizationProjectRepository organizationProjectRepository;
private final ProjectUserRepository projectUserRepository;

public OrganizationProjectHandlerImpl(OrganizationUserRepository organizationUserRepository,
OrganizationProjectRepository organizationProjectRepository) {
this.organizationUserRepository = organizationUserRepository;
public OrganizationProjectHandlerImpl(OrganizationProjectRepository organizationProjectRepository,
ProjectUserRepository projectUserRepository) {
this.organizationProjectRepository = organizationProjectRepository;
this.projectUserRepository = projectUserRepository;
}

@Override
public OrganizationProjectsPage getOrganizationProjectsList(ReportPortalUser user, Long orgId,
Filter filter,
Pageable pageable) {
Page<ProjectProfile> projectProfileList = getProjectProfileList(user, orgId, filter, pageable);

OrganizationProjectsPage organizationProjectsPage =
new OrganizationProjectsPage()
.items(projectProfileList.getContent());

return withOffsetData(organizationProjectsPage, projectProfileList);
}
Filter filter, Pageable pageable) {
OrganizationProjectsPage organizationProjectsPage = new OrganizationProjectsPage();

Page<ProjectProfile> getProjectProfileList(ReportPortalUser user, Long orgId, Filter filter,
Pageable pageable) {
if (!user.getUserRole().equals(UserRole.ADMINISTRATOR)
&& user.getOrganizationDetails().get(orgId.toString()).getOrgRole()
.equals(OrganizationRole.MEMBER)) {

if (!user.getUserRole().equals(UserRole.ADMINISTRATOR)) {
LOGGER.debug("Checking if the user '{}' is affiliated with organization '{}'",
user.getUserId(),
orgId);
var projectIds = projectUserRepository.findProjectIdsByUserId(user.getUserId())
.stream()
.map(Object::toString)
.collect(Collectors.joining(","));

organizationUserRepository.findByUserIdAndOrganization_Id(user.getUserId(), orgId)
.map(orgUser -> {
if (orgUser.getOrganizationRole().equals(OrganizationRole.MEMBER)) {
filter.withCondition(
new FilterCondition(Condition.EQUALS, false, user.getUserId().toString(),
"user_id"));
}
return filter;
})
.orElseThrow(() -> new ReportPortalException(ErrorType.ACCESS_DENIED,
"The user does not belong to the organization."));
if (projectIds.isEmpty()) {
// return empty response
return responseWithPageParameters(organizationProjectsPage, pageable, 0);
} else {
filter.withCondition(
new FilterCondition(Condition.IN, false, projectIds, CRITERIA_PROJECT_ID));
}
}
return organizationProjectRepository.getProjectProfileListByFilter(filter, pageable);

Page<ProjectProfile> projectProfilePagedList =
organizationProjectRepository.getProjectProfileListByFilter(filter, pageable);
organizationProjectsPage.items(projectProfilePagedList.getContent());

return responseWithPageParameters(organizationProjectsPage, pageable,
projectProfilePagedList.getTotalElements());
}


}
39 changes: 39 additions & 0 deletions src/main/java/com/epam/ta/reportportal/util/OffsetUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.epam.ta.reportportal.util;

import com.epam.reportportal.api.model.Offset;
import com.epam.reportportal.api.model.Offset.OrderEnum;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;

public class OffsetUtils {

private OffsetUtils() {
}

public static <T extends Offset> T responseWithPageParameters(T offsetObject, Pageable pageable,
long totalElements) {
return (T) offsetObject
.offset((int) pageable.getOffset())
.limit(pageable.getPageSize())
.totalCount((int) totalElements)
.sort(getSortFields(pageable))
.order(getOrderEnum(pageable));
}

private static String getSortFields(Pageable pageable) {
return pageable.getSort().stream()
.map(Order::getProperty)
.reduce((s1, s2) -> s1 + ", " + s2)
.orElse("");
}

private static OrderEnum getOrderEnum(Pageable pageable) {
return pageable.getSort().stream()
.map(Order::getDirection)
.findFirst()
.map(direction -> direction.equals(Direction.ASC) ? OrderEnum.ASC : OrderEnum.DESC)
.orElse(OrderEnum.ASC);
}

}

0 comments on commit 0de44ea

Please sign in to comment.