Skip to content

Commit

Permalink
Merge pull request #59 from reportportal/EPMRPP-89744-update-plugin-api
Browse files Browse the repository at this point in the history
EPMRPP-89744 || Update plugin api
  • Loading branch information
IvanKustau authored Mar 13, 2024
2 parents 7f56587 + 7be487a commit bc0fbfe
Show file tree
Hide file tree
Showing 38 changed files with 1,170 additions and 1,237 deletions.
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,16 @@ dependencies {
implementation 'com.epam.reportportal:plugin-api'
annotationProcessor 'com.epam.reportportal:plugin-api'
} else {
implementation 'com.github.reportportal:plugin-api:0ccfed8'
annotationProcessor 'com.github.reportportal:plugin-api:0ccfed8'
implementation 'com.github.reportportal:plugin-api:cc3c5c8e'
annotationProcessor 'com.github.reportportal:plugin-api:cc3c5c8e'
}

compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'com.squareup.okhttp:logging-interceptor:2.7.5'
compile 'io.gsonfire:gson-fire:1.8.0'
compile 'org.threeten:threetenbp:1.3.5'

implementation 'org.springdoc:springdoc-openapi-ui:1.7.0'
implementation group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
implementation group: 'org.glassfish', name: 'javax.el', version: '3.0.0'
implementation group: 'javax.el', name: 'javax.el-api', version: '3.0.0'
Expand Down
1,357 changes: 680 additions & 677 deletions src/main/java/com/epam/reportportal/extension/azure/AzureExtension.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.epam.reportportal.extension.azure.command.connection;

import static com.epam.reportportal.extension.azure.AzureExtension.PROJECT;
import static com.epam.reportportal.extension.azure.AzureExtension.URL;
import static com.epam.ta.reportportal.ws.reporting.ErrorType.UNABLE_INTERACT_WITH_INTEGRATION;

import com.epam.reportportal.extension.PluginCommand;
import com.epam.reportportal.extension.azure.rest.client.ApiClient;
import com.epam.reportportal.extension.azure.rest.client.ApiException;
Expand All @@ -11,57 +15,58 @@
import com.epam.reportportal.extension.bugtracking.BtsConstants;
import com.epam.ta.reportportal.entity.integration.Integration;
import com.epam.ta.reportportal.exception.ReportPortalException;
import com.epam.ta.reportportal.ws.model.ErrorType;
import java.util.Map;
import org.jasypt.util.text.BasicTextEncryptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

import static com.epam.reportportal.extension.azure.AzureExtension.PROJECT;
import static com.epam.reportportal.extension.azure.AzureExtension.URL;
import static com.epam.ta.reportportal.ws.model.ErrorType.UNABLE_INTERACT_WITH_INTEGRATION;

public class TestConnectionCommand implements PluginCommand<Boolean> {

private final BasicTextEncryptor basicTextEncryptor;
private final BasicTextEncryptor basicTextEncryptor;

private static final Logger LOGGER = LoggerFactory.getLogger(TestConnectionCommand.class);
private static final String API_VERSION = "6.0";
private static final Logger LOGGER = LoggerFactory.getLogger(TestConnectionCommand.class);
private static final String API_VERSION = "6.0";

public TestConnectionCommand(BasicTextEncryptor basicTextEncryptor) {
this.basicTextEncryptor = basicTextEncryptor;
}
public TestConnectionCommand(BasicTextEncryptor basicTextEncryptor) {
this.basicTextEncryptor = basicTextEncryptor;
}

@Override
public Boolean executeCommand(Integration integration, Map<String, Object> params) {
ApiClient defaultClient = Configuration.getDefaultApiClient();
@Override
public Boolean executeCommand(Integration integration, Map<String, Object> params) {
ApiClient defaultClient = Configuration.getDefaultApiClient();

String organizationUrl = params.get(URL).toString();
String organizationName = organizationUrl.replace(defaultClient.getBasePath(), "");
String projectName = params.get(PROJECT).toString();
String personalAccessToken = basicTextEncryptor.decrypt(BtsConstants.OAUTH_ACCESS_KEY.getParam(integration.getParams(), String.class)
.orElseThrow(() -> new ReportPortalException(UNABLE_INTERACT_WITH_INTEGRATION, "OAUTH key cannot be NULL")));
String organizationUrl = params.get(URL).toString();
String organizationName = organizationUrl.replace(defaultClient.getBasePath(), "");
String projectName = params.get(PROJECT).toString();
String personalAccessToken = basicTextEncryptor.decrypt(
BtsConstants.OAUTH_ACCESS_KEY.getParam(integration.getParams(), String.class).orElseThrow(
() -> new ReportPortalException(UNABLE_INTERACT_WITH_INTEGRATION,
"OAUTH key cannot be NULL"
)));

HttpBasicAuth basicAuth = (HttpBasicAuth) defaultClient.getAuthentication("accessToken");
basicAuth.setPassword(personalAccessToken);
HttpBasicAuth basicAuth = (HttpBasicAuth) defaultClient.getAuthentication("accessToken");
basicAuth.setPassword(personalAccessToken);

ProjectsApi projectsApi = new ProjectsApi(defaultClient);
ProjectsApi projectsApi = new ProjectsApi(defaultClient);

try {
ApiResponse<TeamProject> response = projectsApi.projectsGetWithHttpInfo(organizationName, projectName,
API_VERSION, false, false);
return response.getStatusCode() == 200;
} catch (ApiException e) {
LOGGER.error("Unable to connect to Azure DevOps: " + e.getMessage(), e);
throw new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION,
String.format("Unable to connect to Azure DevOps. Code: %s, Message: %s", e.getCode(),
e.getMessage()), e);
}
try {
ApiResponse<TeamProject> response =
projectsApi.projectsGetWithHttpInfo(organizationName, projectName, API_VERSION, false,
false
);
return response.getStatusCode() == 200;
} catch (ApiException e) {
LOGGER.error("Unable to connect to Azure DevOps: " + e.getMessage(), e);
throw new ReportPortalException(UNABLE_INTERACT_WITH_INTEGRATION,
String.format("Unable to connect to Azure DevOps. Code: %s, Message: %s", e.getCode(),
e.getMessage()
), e
);
}
}

@Override
public String getName() {
return "testConnection";
}
@Override
public String getName() {
return "testConnection";
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
package com.epam.reportportal.extension.azure.command.role;

import static java.util.Optional.ofNullable;

import com.epam.ta.reportportal.commons.ReportPortalUser;
import com.epam.ta.reportportal.commons.validation.BusinessRule;
import com.epam.ta.reportportal.dao.ProjectRepository;
import com.epam.ta.reportportal.entity.project.Project;
import com.epam.ta.reportportal.entity.project.ProjectRole;
import com.epam.ta.reportportal.exception.ReportPortalException;
import com.epam.ta.reportportal.ws.model.ErrorType;

import static java.util.Optional.ofNullable;
import com.epam.ta.reportportal.ws.reporting.ErrorType;

/**
* @author <a href="mailto:ivan_budayeu@epam.com">Ivan Budayeu</a>
*/
public abstract class ProjectManagerCommand<T> extends ProjectMemberCommand<T> {

protected ProjectManagerCommand(ProjectRepository projectRepository) {
super(projectRepository);
}
protected ProjectManagerCommand(ProjectRepository projectRepository) {
super(projectRepository);
}

@Override
protected void validatePermissions(ReportPortalUser user, Project project) {
ProjectRole projectRole = ofNullable(user.getProjectDetails()).flatMap(detailsMapping -> ofNullable(detailsMapping.get(project.getName())))
.map(ReportPortalUser.ProjectDetails::getProjectRole)
.orElseThrow(() -> new ReportPortalException(ErrorType.ACCESS_DENIED));
@Override
protected void validatePermissions(ReportPortalUser user, Project project) {
ProjectRole projectRole = ofNullable(user.getProjectDetails()).flatMap(
detailsMapping -> ofNullable(detailsMapping.get(project.getName())))
.map(ReportPortalUser.ProjectDetails::getProjectRole)
.orElseThrow(() -> new ReportPortalException(ErrorType.ACCESS_DENIED));

BusinessRule.expect(projectRole, ProjectRole.PROJECT_MANAGER::sameOrLowerThan).verify(ErrorType.ACCESS_DENIED);
}
BusinessRule.expect(projectRole, ProjectRole.PROJECT_MANAGER::sameOrLowerThan)
.verify(ErrorType.ACCESS_DENIED);
}
}
Original file line number Diff line number Diff line change
@@ -1,47 +1,49 @@
package com.epam.reportportal.extension.azure.command.role;

import static com.epam.reportportal.extension.azure.command.utils.CommandParamUtils.PROJECT_ID_PARAM;
import static com.epam.reportportal.extension.azure.command.utils.CommandParamUtils.retrieveLong;
import static java.util.Optional.ofNullable;

import com.epam.ta.reportportal.commons.ReportPortalUser;
import com.epam.ta.reportportal.commons.validation.BusinessRule;
import com.epam.ta.reportportal.dao.ProjectRepository;
import com.epam.ta.reportportal.entity.project.Project;
import com.epam.ta.reportportal.exception.ReportPortalException;
import com.epam.ta.reportportal.ws.model.ErrorType;
import org.springframework.security.core.context.SecurityContextHolder;

import com.epam.ta.reportportal.ws.reporting.ErrorType;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;

import static com.epam.reportportal.extension.azure.command.utils.CommandParamUtils.PROJECT_ID_PARAM;
import static com.epam.reportportal.extension.azure.command.utils.CommandParamUtils.retrieveLong;
import static java.util.Optional.ofNullable;
import org.springframework.security.core.context.SecurityContextHolder;

/**
* @author <a href="mailto:ivan_budayeu@epam.com">Ivan Budayeu</a>
*/
public abstract class ProjectMemberCommand<T> extends AbstractRoleBasedCommand<T> {

protected final ProjectRepository projectRepository;
protected final ProjectRepository projectRepository;

protected ProjectMemberCommand(ProjectRepository projectRepository) {
this.projectRepository = projectRepository;
}
protected ProjectMemberCommand(ProjectRepository projectRepository) {
this.projectRepository = projectRepository;
}

@Override
public void validateRole(Map<String, Object> params) {
Long projectId = retrieveLong(params, PROJECT_ID_PARAM);
Project project = projectRepository.findById(projectId)
.orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectId));
@Override
public void validateRole(Map<String, Object> params) {
Long projectId = retrieveLong(params, PROJECT_ID_PARAM);
Project project = projectRepository.findById(projectId)
.orElseThrow(() -> new ReportPortalException(ErrorType.PROJECT_NOT_FOUND, projectId));

ReportPortalUser user = (ReportPortalUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
BusinessRule.expect(user, Objects::nonNull).verify(ErrorType.ACCESS_DENIED);
ReportPortalUser user =
(ReportPortalUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
BusinessRule.expect(user, Objects::nonNull).verify(ErrorType.ACCESS_DENIED);

validatePermissions(user, project);
}
validatePermissions(user, project);
}

protected void validatePermissions(ReportPortalUser user, Project project) {
BusinessRule.expect(ofNullable(user.getProjectDetails()).flatMap(detailsMapping -> ofNullable(detailsMapping.get(project.getName()))),
Optional::isPresent
).verify(ErrorType.ACCESS_DENIED);
}
protected void validatePermissions(ReportPortalUser user, Project project) {
BusinessRule.expect(
ofNullable(user.getProjectDetails()).flatMap(
detailsMapping -> ofNullable(detailsMapping.get(project.getName()))),
Optional::isPresent
).verify(ErrorType.ACCESS_DENIED);
}
}
Original file line number Diff line number Diff line change
@@ -1,60 +1,59 @@
package com.epam.reportportal.extension.azure.command.utils;

import static java.util.Optional.ofNullable;

import com.epam.ta.reportportal.commons.validation.Suppliers;
import com.epam.ta.reportportal.exception.ReportPortalException;
import com.epam.ta.reportportal.ws.model.ErrorType;

import javax.validation.ConstraintViolation;
import javax.validation.Path;
import com.epam.ta.reportportal.ws.reporting.ErrorType;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import static java.util.Optional.ofNullable;
import javax.validation.ConstraintViolation;
import javax.validation.Path;

/**
* @author <a href="mailto:ivan_budayeu@epam.com">Ivan Budayeu</a>
*/
public final class CommandParamUtils {

public static final String ID_PARAM = "id";
public static final String PROJECT_ID_PARAM = "projectId";
public static final String ENTITY_PARAM = "entity";
public static final String URL_PARAM = "url";

private CommandParamUtils() {
//static only
}

public static Long retrieveLong(Map<String, Object> params, String param) {
return ofNullable(params.get(param)).map(String::valueOf)
.map(CommandParamUtils::safeParseLong)
.orElseThrow(() -> new ReportPortalException(ErrorType.BAD_REQUEST_ERROR,
Suppliers.formattedSupplier("Parameter '{}' was not provided", param).get()
));
}

public static Long safeParseLong(String param) {
try {
return Long.parseLong(param);
} catch (NumberFormatException ex) {
throw new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, ex.getMessage());
}
}

public static void handleValidatorConstraints(Set<ConstraintViolation<?>> constraintViolations) {
if (constraintViolations != null && !constraintViolations.isEmpty()) {
StringBuilder messageBuilder = new StringBuilder();
for (ConstraintViolation<?> constraintViolation : constraintViolations) {
messageBuilder.append("[");
messageBuilder.append("Incorrect value in request '");
messageBuilder.append(constraintViolation.getInvalidValue());
messageBuilder.append("' in field '");
Iterator<Path.Node> iterator = constraintViolation.getPropertyPath().iterator();
messageBuilder.append(iterator.hasNext() ? iterator.next().getName() : "");
messageBuilder.append("'.]");
}
throw new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, messageBuilder.toString());
}
}
public static final String ID_PARAM = "id";
public static final String PROJECT_ID_PARAM = "projectId";
public static final String ENTITY_PARAM = "entity";
public static final String URL_PARAM = "url";

private CommandParamUtils() {
//static only
}

public static Long retrieveLong(Map<String, Object> params, String param) {
return ofNullable(params.get(param)).map(String::valueOf).map(CommandParamUtils::safeParseLong)
.orElseThrow(() -> new ReportPortalException(
ErrorType.BAD_REQUEST_ERROR,
Suppliers.formattedSupplier("Parameter '{}' was not provided", param).get()
));
}

public static Long safeParseLong(String param) {
try {
return Long.parseLong(param);
} catch (NumberFormatException ex) {
throw new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, ex.getMessage());
}
}

public static void handleValidatorConstraints(Set<ConstraintViolation<?>> constraintViolations) {
if (constraintViolations != null && !constraintViolations.isEmpty()) {
StringBuilder messageBuilder = new StringBuilder();
for (ConstraintViolation<?> constraintViolation : constraintViolations) {
messageBuilder.append("[");
messageBuilder.append("Incorrect value in request '");
messageBuilder.append(constraintViolation.getInvalidValue());
messageBuilder.append("' in field '");
Iterator<Path.Node> iterator = constraintViolation.getPropertyPath().iterator();
messageBuilder.append(iterator.hasNext() ? iterator.next().getName() : "");
messageBuilder.append("'.]");
}
throw new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, messageBuilder.toString());
}
}
}
Loading

0 comments on commit bc0fbfe

Please sign in to comment.