Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ plugins {
id 'com.gradleup.shadow' version '9.3.1'
id "com.github.spotbugs" version "6.4.8"
id 'maven-publish'
id("io.freefair.lombok") version "9.2.0"
id("io.freefair.lombok") version "9.5.0"
}

apply from: 'project-properties.gradle'
Expand Down Expand Up @@ -35,8 +35,8 @@ dependencies {
exclude group: 'org.springframework.modulith', module: 'spring-modulith-apt'
}
} else {
implementation 'com.github.reportportal:service-api:2550296'
annotationProcessor('com.github.reportportal:service-api:2550296') {
implementation 'com.github.reportportal:service-api:336be2c'
annotationProcessor('com.github.reportportal:service-api:336be2c') {
exclude group: 'org.springframework.modulith', module: 'spring-modulith-apt'
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,14 @@
import com.epam.reportportal.base.infrastructure.persistence.dao.IntegrationTypeRepository;
import com.epam.reportportal.base.infrastructure.persistence.dao.ProjectRepository;
import com.epam.reportportal.base.infrastructure.persistence.dao.UserRepository;
import com.epam.reportportal.base.infrastructure.persistence.dao.organization.OrganizationRepositoryCustom;
import com.epam.reportportal.base.infrastructure.persistence.entity.enums.IntegrationAuthFlowEnum;
import com.epam.reportportal.base.infrastructure.persistence.util.PersonalProjectService;
import com.epam.reportportal.extension.AuthExtension;
import com.epam.reportportal.extension.CommonPluginCommand;
import com.epam.reportportal.extension.IntegrationGroupEnum;
import com.epam.reportportal.extension.PluginCommand;
import com.epam.reportportal.extension.command.ExtensionCommand;
import com.epam.reportportal.extension.github.command.SynchronizeGithubUserCommand;
import com.epam.reportportal.extension.github.event.listener.PluginLoadedEventListener;
import com.epam.reportportal.extension.github.oauth.GitHubOAuthProvider;
Expand Down Expand Up @@ -119,6 +121,9 @@ public boolean supports(Class<?> authentication) {
@Autowired
private IntegrationDuplicateValidator integrationDuplicateValidator;

@Autowired
private OrganizationRepositoryCustom organizationRepository;

@Autowired
private BasicTextEncryptor encryptor;

Expand All @@ -127,7 +132,7 @@ public boolean supports(Class<?> authentication) {

private GitHubUserReplicator replicator;
private GitHubOAuthProvider oauthProvider;
private Map<String, CommonPluginCommand<?>> commonCommands;
private Map<String, ExtensionCommand<?>> commonCommands;

private Supplier<GitHubIntegrationStrategy> gitHubIntegrationStrategySupplier;
private Supplier<PluginLoadedEventListener> pluginLoadedListenerSupplier;
Expand All @@ -146,11 +151,10 @@ public void init() throws IOException {
integrationType -> integrationType, dataSource));

replicator = new GitHubUserReplicator(
userRepository, projectRepository, personalProjectService,
userBinaryDataService, contentTypeResolver, userEventPublisher
userRepository, userBinaryDataService, contentTypeResolver, userEventPublisher
);
oauthProvider = new GitHubOAuthProvider(replicator);
SynchronizeGithubUserCommand syncCommand = new SynchronizeGithubUserCommand(replicator);
SynchronizeGithubUserCommand syncCommand = new SynchronizeGithubUserCommand(replicator, projectRepository, organizationRepository);
commonCommands = Map.of(syncCommand.getName(), syncCommand);

initListeners();
Expand Down Expand Up @@ -211,7 +215,12 @@ public Optional<Map<String, Object>> getAuthProviderInfo() {

@Override
public CommonPluginCommand<?> getCommonCommand(String commandName) {
return commonCommands.get(commandName);
return null;
}

@Override
public Map<String, ExtensionCommand<?>> getCommonExtensionCommands() {
return commonCommands;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,21 @@
import com.epam.reportportal.base.infrastructure.commons.ContentTypeResolver;
import com.epam.reportportal.base.infrastructure.persistence.binary.UserBinaryDataService;
import com.epam.reportportal.base.infrastructure.persistence.commons.ReportPortalUser;
import com.epam.reportportal.base.infrastructure.persistence.dao.ProjectRepository;
import com.epam.reportportal.base.infrastructure.persistence.dao.UserRepository;
import com.epam.reportportal.base.infrastructure.persistence.entity.attachment.BinaryData;
import com.epam.reportportal.base.infrastructure.persistence.entity.user.User;
import com.epam.reportportal.base.infrastructure.persistence.entity.user.UserRole;
import com.epam.reportportal.base.infrastructure.persistence.entity.user.UserType;
import com.epam.reportportal.base.infrastructure.persistence.util.PersonalProjectService;
import com.epam.reportportal.base.infrastructure.rules.exception.ErrorType;
import com.epam.reportportal.base.infrastructure.rules.exception.ReportPortalException;
import com.epam.reportportal.extension.github.client.GitHubClient;
import com.epam.reportportal.extension.github.model.EmailResource;
import com.epam.reportportal.extension.github.model.UserResource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
Expand All @@ -50,15 +48,14 @@
/**
* Replicates GitHub account info with internal ReportPortal's database.
*/
@Slf4j
public class GitHubUserReplicator extends AbstractUserReplicator {

private final UserEventPublisher userEventPublisher;

public GitHubUserReplicator(UserRepository userRepository, ProjectRepository projectRepository,
PersonalProjectService personalProjectService, UserBinaryDataService userBinaryDataService,
public GitHubUserReplicator(UserRepository userRepository, UserBinaryDataService userBinaryDataService,
ContentTypeResolver contentTypeResolver, UserEventPublisher userEventPublisher) {
super(userRepository, projectRepository, personalProjectService, userBinaryDataService,
contentTypeResolver);
super(userRepository, contentTypeResolver, userBinaryDataService);
this.userEventPublisher = userEventPublisher;
}

Expand All @@ -68,7 +65,7 @@ public GitHubUserReplicator(UserRepository userRepository, ProjectRepository pro
* @param accessToken GitHub access token
*/
public void synchronizeUser(String accessToken) {
LOGGER.info("synchronizeUser");
log.info("synchronizeUser");
GitHubClient gitHubClient = GitHubClient.withAccessToken(accessToken);
UserResource userResource = gitHubClient.getUser();

Expand Down Expand Up @@ -97,7 +94,7 @@ public void synchronizeUser(String accessToken) {
*/
@Transactional
public ReportPortalUser replicateUser(UserResource userResource, GitHubClient gitHubClient) {
LOGGER.info("replicateUser: login={}", userResource.getLogin());
log.info("replicateUser: login={}", userResource.getLogin());
String email = resolveEmail(userResource, gitHubClient);

User user = userRepository.findByEmail(email).map(u -> {
Expand All @@ -119,15 +116,15 @@ public ReportPortalUser replicateUser(UserResource userResource, GitHubClient gi
}

private void updateUser(User user, UserResource userResource, GitHubClient gitHubClient) {
LOGGER.info("updateUser: login={}", user.getLogin());
log.info("updateUser: login={}", user.getLogin());
user.setFullName(
isNullOrEmpty(userResource.getName()) ? user.getLogin() : userResource.getName());
user.setMetadata(defaultMetaData());
uploadAvatar(gitHubClient, user, userResource.getAvatarUrl());
}

private User createUser(UserResource userResource, GitHubClient gitHubClient) {
LOGGER.info("createUser: login={}", userResource.getLogin());
log.info("createUser: login={}", userResource.getLogin());
String email = resolveEmail(userResource, gitHubClient);
User user = new User();
user.setLogin(email);
Expand All @@ -142,7 +139,7 @@ private User createUser(UserResource userResource, GitHubClient gitHubClient) {
}

private void uploadAvatar(GitHubClient gitHubClient, User user, String avatarUrl) {
LOGGER.info("uploadAvatar: login={}", user.getLogin());
log.info("uploadAvatar: login={}", user.getLogin());
if (avatarUrl == null) {
return;
}
Expand All @@ -157,12 +154,12 @@ private void uploadAvatar(GitHubClient gitHubClient, User user, String avatarUrl
uploadPhoto(user, photo);
}
} catch (Exception e) {
LOGGER.warn("Unable to load avatar for user '{}', skipping: {}", user.getLogin(), e.getMessage(), e);
log.warn("Unable to load avatar for user '{}', skipping: {}", user.getLogin(), e.getMessage(), e);
}
}

private Optional<String> retrievePrimaryEmail(GitHubClient gitHubClient) {
LOGGER.info("retrievePrimaryEmail");
log.info("retrievePrimaryEmail");
return gitHubClient.getUserEmails()
.stream()
.filter(EmailResource::isVerified)
Expand All @@ -172,14 +169,13 @@ private Optional<String> retrievePrimaryEmail(GitHubClient gitHubClient) {
}

private String resolveEmail(UserResource user, GitHubClient client) {
LOGGER.info("resolveEmail: login={}", user.getLogin());
log.info("resolveEmail: login={}", user.getLogin());
return Optional.ofNullable(user.getEmail())
.filter(StringUtils::isNotBlank)
.map(NORMALIZE_STRING)
.orElseGet(() -> retrievePrimaryEmail(client)
.map(NORMALIZE_STRING)
.filter(StringUtils::isNotBlank)
.orElseThrow(
() -> new UserSynchronizationException("User 'email' has not been provided")));
.orElseThrow(() -> new UserSynchronizationException("User 'email' has not been provided")));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,49 +17,37 @@
package com.epam.reportportal.extension.github.command;

import com.epam.reportportal.api.model.PluginCommandRQ;
import com.epam.reportportal.base.infrastructure.persistence.dao.ProjectRepository;
import com.epam.reportportal.base.infrastructure.persistence.dao.organization.OrganizationRepositoryCustom;
import com.epam.reportportal.base.infrastructure.persistence.entity.user.UserRole;
import com.epam.reportportal.base.infrastructure.rules.commons.validation.BusinessRule;
import com.epam.reportportal.base.infrastructure.rules.exception.ErrorType;
import com.epam.reportportal.base.reporting.OperationCompletionRS;
import com.epam.reportportal.extension.command.AbstractExtensionCommand;
import com.epam.reportportal.extension.github.GitHubUserReplicator;
import com.epam.reportportal.extension.role.AuthenticatedUserContextCommand;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;

/**
* Command to synchronize GitHub user information.
*
* @author <a href="mailto:andrei_varabyeu@epam.com">Andrei Varabyeu</a>
*/
@Slf4j
public class SynchronizeGithubUserCommand extends AuthenticatedUserContextCommand {
public class SynchronizeGithubUserCommand extends AbstractExtensionCommand<OperationCompletionRS> {

private static final String COMMAND_NAME = "synchronize";
private static final String ACCESS_TOKEN_PARAM = "access_token";

private final GitHubUserReplicator replicator;

/**
* Instantiates a new Synchronize GitHub user command.
*
* @param replicator the replicator
*/
public SynchronizeGithubUserCommand(GitHubUserReplicator replicator) {
public SynchronizeGithubUserCommand(GitHubUserReplicator replicator,
ProjectRepository projectRepository, OrganizationRepositoryCustom organizationRepository) {
super(projectRepository, organizationRepository);
this.replicator = replicator;
this.minUserRole = UserRole.USER;
}

@Override
public String getName() {
return COMMAND_NAME;
}

/**
* {@inheritDoc}
* <p>
* Synchronizes GitHub user information using the provided access token.
*
* @param pluginCommandRq the plugin command rq
* @return the operation completion rs
*/
@Override
protected OperationCompletionRS invokeCommand(PluginCommandRQ pluginCommandRq) {
String accessToken = (String) pluginCommandRq.getArguments().get(ACCESS_TOKEN_PARAM);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import com.epam.reportportal.extension.github.client.GitHubClient;
import com.epam.reportportal.extension.github.model.OrganizationResource;
import com.epam.reportportal.extension.github.model.UserResource;
import com.google.common.base.Splitter;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -74,8 +73,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic

private List<String> parseAllowedOrganizations(OAuthRegistrationResource registration) {
return Optional.ofNullable(registration.getRestrictions())
.map(restrictions -> restrictions.get("organizations"))
.map(orgs -> Splitter.on(',').omitEmptyStrings().splitToList(orgs))
.map(restrictions -> (List<String>) (Object) restrictions.get("organizations"))
.orElse(Collections.emptyList());
}

Expand Down
Loading