diff --git a/build.gradle b/build.gradle index 47e9f08..71dbc9f 100644 --- a/build.gradle +++ b/build.gradle @@ -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' @@ -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' } } diff --git a/src/main/java/com/epam/reportportal/extension/github/GitHubExtension.java b/src/main/java/com/epam/reportportal/extension/github/GitHubExtension.java index b43624b..f23b47b 100644 --- a/src/main/java/com/epam/reportportal/extension/github/GitHubExtension.java +++ b/src/main/java/com/epam/reportportal/extension/github/GitHubExtension.java @@ -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; @@ -119,6 +121,9 @@ public boolean supports(Class authentication) { @Autowired private IntegrationDuplicateValidator integrationDuplicateValidator; + @Autowired + private OrganizationRepositoryCustom organizationRepository; + @Autowired private BasicTextEncryptor encryptor; @@ -127,7 +132,7 @@ public boolean supports(Class authentication) { private GitHubUserReplicator replicator; private GitHubOAuthProvider oauthProvider; - private Map> commonCommands; + private Map> commonCommands; private Supplier gitHubIntegrationStrategySupplier; private Supplier pluginLoadedListenerSupplier; @@ -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(); @@ -211,7 +215,12 @@ public Optional> getAuthProviderInfo() { @Override public CommonPluginCommand getCommonCommand(String commandName) { - return commonCommands.get(commandName); + return null; + } + + @Override + public Map> getCommonExtensionCommands() { + return commonCommands; } @Override diff --git a/src/main/java/com/epam/reportportal/extension/github/GitHubUserReplicator.java b/src/main/java/com/epam/reportportal/extension/github/GitHubUserReplicator.java index 521469e..84ccf44 100644 --- a/src/main/java/com/epam/reportportal/extension/github/GitHubUserReplicator.java +++ b/src/main/java/com/epam/reportportal/extension/github/GitHubUserReplicator.java @@ -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; @@ -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; } @@ -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(); @@ -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 -> { @@ -119,7 +116,7 @@ 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()); @@ -127,7 +124,7 @@ private void updateUser(User user, UserResource userResource, GitHubClient gitHu } 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); @@ -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; } @@ -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 retrievePrimaryEmail(GitHubClient gitHubClient) { - LOGGER.info("retrievePrimaryEmail"); + log.info("retrievePrimaryEmail"); return gitHubClient.getUserEmails() .stream() .filter(EmailResource::isVerified) @@ -172,14 +169,13 @@ private Optional 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"))); } } diff --git a/src/main/java/com/epam/reportportal/extension/github/command/SynchronizeGithubUserCommand.java b/src/main/java/com/epam/reportportal/extension/github/command/SynchronizeGithubUserCommand.java index 13a7a3e..5b71060 100644 --- a/src/main/java/com/epam/reportportal/extension/github/command/SynchronizeGithubUserCommand.java +++ b/src/main/java/com/epam/reportportal/extension/github/command/SynchronizeGithubUserCommand.java @@ -17,34 +17,30 @@ 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 Andrei Varabyeu - */ @Slf4j -public class SynchronizeGithubUserCommand extends AuthenticatedUserContextCommand { +public class SynchronizeGithubUserCommand extends AbstractExtensionCommand { 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 @@ -52,14 +48,6 @@ public String getName() { return COMMAND_NAME; } - /** - * {@inheritDoc} - *

- * 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); diff --git a/src/main/java/com/epam/reportportal/extension/github/oauth/GitHubOAuth2UserService.java b/src/main/java/com/epam/reportportal/extension/github/oauth/GitHubOAuth2UserService.java index b6a54b1..a0151b0 100644 --- a/src/main/java/com/epam/reportportal/extension/github/oauth/GitHubOAuth2UserService.java +++ b/src/main/java/com/epam/reportportal/extension/github/oauth/GitHubOAuth2UserService.java @@ -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; @@ -74,8 +73,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic private List parseAllowedOrganizations(OAuthRegistrationResource registration) { return Optional.ofNullable(registration.getRestrictions()) - .map(restrictions -> restrictions.get("organizations")) - .map(orgs -> Splitter.on(',').omitEmptyStrings().splitToList(orgs)) + .map(restrictions -> (List) (Object) restrictions.get("organizations")) .orElse(Collections.emptyList()); }