Skip to content

Orgs login migration #2238

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
Apr 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
ecbbae8
Refactor CreateUserHandlerImpl: remove login normalization and update…
raikbitters Apr 24, 2025
5b6d115
Remove dependency on updateApiSubmodule from compileJava task
raikbitters Apr 24, 2025
be8a346
Enhance email validation in user request classes and clean up unused …
raikbitters Apr 24, 2025
3dc1ca6
Update default user email in FlushingDataJob and adjust user creation…
raikbitters Apr 24, 2025
13307ae
Update EmailService to use email for login normalization
raikbitters Apr 24, 2025
14dd9dd
Add conversion function to create user response resource from User en…
raikbitters Apr 24, 2025
751bb13
Refactor UserBuilder to streamline user creation logic and normalize …
raikbitters Apr 24, 2025
4fff0c2
Refactor RestorePasswordRQ and UserActivityResource to use Lombok ann…
raikbitters Apr 24, 2025
f713e4f
Add email normalization function to EmailRulesValidator for improved …
raikbitters Apr 24, 2025
6cf6005
Refactor EmailRulesValidator to improve code organization and add val…
raikbitters Apr 24, 2025
653abb8
Refactor RestorePasswordRQ and UserBuilder to remove unused imports
raikbitters Apr 24, 2025
37afa6c
Refactor CreateUserHandlerImpl to normalize email handling and stream…
raikbitters Apr 24, 2025
1bf879c
Fix comment formatting in CreateUserHandlerImpl for consistency
raikbitters Apr 24, 2025
edf0c3c
Refactor EditUserHandlerImpl to improve email and full name update logic
raikbitters Apr 24, 2025
4247a2f
Refactor EditUserHandlerImpl to remove unused imports
raikbitters Apr 24, 2025
05852eb
Refactor InvitationController and UserInvitationHandler for improved …
raikbitters Apr 25, 2025
b303678
Refactor CreateInvitationLinkEvent to remove unused projectId parameter
raikbitters Apr 25, 2025
8e694c3
Refactor CreateUserHandlerImpl to remove unused project assignment code
raikbitters Apr 25, 2025
bbb55a8
Refactor CreateUserHandler to remove unused import for CreateUserRQCo…
raikbitters Apr 25, 2025
78d3d01
Refactor UserInvitationHandler to remove unused imports and improve c…
raikbitters Apr 25, 2025
7e65f58
Refactor EmailRulesValidator to improve error message for invalid email
raikbitters Apr 25, 2025
36f4aee
Refactor user-related tests to replace login with email and improve c…
raikbitters Apr 25, 2025
acd3bbf
Refactor CreateUserRQ to improve code formatting and consistency
raikbitters Apr 25, 2025
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
3 changes: 1 addition & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ plugins {
id "org.openapi.generator" version "7.11.0"
}

import org.openapitools.generator.gradle.plugin.tasks.GenerateTask

import org.owasp.dependencycheck.reporting.ReportGenerator

apply from: 'project-properties.gradle'
Expand Down Expand Up @@ -234,7 +234,6 @@ test {
}
}

compileJava.dependsOn tasks.named('updateApiSubmodule')
compileJava.dependsOn tasks.named('openApiGenerate')
compileJava.dependsOn tasks.named('downloadManifestSchema')
publish.dependsOn build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,8 @@ public class CreateInvitationLinkEvent extends AbstractEvent implements Activity

private static final String EVENT_NAME = "createInvitationLink";

private final Long projectId;

public CreateInvitationLinkEvent(Long userId, String userLogin, Long projectId) {
public CreateInvitationLinkEvent(Long userId, String userLogin) {
super(userId, userLogin);
this.projectId = projectId;
}

@Override
Expand All @@ -52,7 +49,6 @@ public Activity toActivity() {
.addSubjectId(getUserId())
.addSubjectName(getUserLogin())
.addSubjectType(EventSubject.USER)
.addProjectId(projectId)
.get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import com.epam.ta.reportportal.commons.ReportPortalUser;
import com.epam.ta.reportportal.model.YesNoRS;
import com.epam.ta.reportportal.model.user.CreateUserRQConfirm;
import com.epam.ta.reportportal.model.user.CreateUserRQFull;
import com.epam.ta.reportportal.model.user.CreateUserRS;
import com.epam.ta.reportportal.model.user.ResetPasswordRQ;
Expand All @@ -42,7 +41,6 @@ public interface CreateUserHandler {
*/
CreateUserRS createUserByAdmin(CreateUserRQFull request, ReportPortalUser user, String basicUrl);


/**
* Create restore password bid
*
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import static com.epam.reportportal.rules.exception.ErrorType.USER_ALREADY_EXISTS;
import static com.epam.ta.reportportal.commons.Predicates.equalTo;
import static com.epam.ta.reportportal.entity.user.UserType.INTERNAL;
import static com.epam.ta.reportportal.util.email.EmailRulesValidator.NORMALIZE_EMAIL;
import static java.util.Optional.ofNullable;

import com.epam.reportportal.rules.commons.validation.BusinessRule;
Expand All @@ -48,7 +49,6 @@
import com.epam.ta.reportportal.entity.user.UserType;
import com.epam.ta.reportportal.model.user.ChangePasswordRQ;
import com.epam.ta.reportportal.model.user.EditUserRQ;
import com.epam.ta.reportportal.util.UserUtils;
import com.epam.ta.reportportal.util.email.MailServiceFactory;
import com.epam.ta.reportportal.ws.reporting.OperationCompletionRS;
import java.awt.Dimension;
Expand All @@ -74,7 +74,7 @@
import org.springframework.web.multipart.MultipartFile;

/**
* Edit user handler
* Edit user handler.
*
* @author Aliaksandr_Kazantsau
* @author Andrei_Ramanchuk
Expand All @@ -98,6 +98,17 @@ public class EditUserHandlerImpl implements EditUserHandler {

private final ApplicationEventPublisher eventPublisher;

/**
* Constructor.
*
* @param passwordEncoder Password encoder
* @param userRepository User repository
* @param projectRepository Project repository
* @param userBinaryDataService User binary data service
* @param autoDetectParser Auto detect parser
* @param emailServiceFactory Email service factory
* @param eventPublisher Event publisher
*/
@Autowired
public EditUserHandlerImpl(PasswordEncoder passwordEncoder, UserRepository userRepository,
ProjectRepository projectRepository,
Expand All @@ -120,36 +131,13 @@ public OperationCompletionRS editUser(String username, EditUserRQ editUserRq,

updateRestrictedFields(editor, user, editUserRq);

if (null != editUserRq.getEmail() && !editUserRq.getEmail().equalsIgnoreCase(user.getEmail())) {
String updEmail = editUserRq.getEmail().toLowerCase().trim();
if (!editor.getUserRole().equals(UserRole.ADMINISTRATOR)) {
expect(user.getUserType(), equalTo(INTERNAL)).verify(ACCESS_DENIED,
"Unable to change email for external user");
}
expect(UserUtils.isEmailValid(updEmail), equalTo(true)).verify(BAD_REQUEST_ERROR,
" wrong email: " + updEmail);
final Optional<User> byEmail = userRepository.findByEmail(updEmail);

expect(byEmail, Predicates.not(Optional::isPresent)).verify(USER_ALREADY_EXISTS, updEmail);

List<Project> userProjects = projectRepository.findUserProjects(username);
userProjects.forEach(
project -> ProjectUtils.updateProjectRecipients(user.getEmail(), updEmail, project));
user.setEmail(updEmail);
try {
projectRepository.saveAll(userProjects);
} catch (Exception exp) {
throw new ReportPortalException("PROJECT update exception while USER editing.", exp);
}
}
ofNullable(editUserRq.getEmail())
.map(NORMALIZE_EMAIL)
.filter(email -> !email.equals(user.getEmail()))
.ifPresent(email -> updateEmail(email, user, editor));

if (null != editUserRq.getFullName()) {
if (!editor.getUserRole().equals(UserRole.ADMINISTRATOR)) {
expect(user.getUserType(), equalTo(INTERNAL)).verify(ACCESS_DENIED,
"Unable to change full name for external user");
}
user.setFullName(editUserRq.getFullName());
}
ofNullable(editUserRq.getFullName())
.ifPresent(fullName -> updateFullName(fullName, user, editor));

ofNullable(editUserRq.getExternalId()).ifPresent(user::setExternalId);

Expand All @@ -160,7 +148,10 @@ public OperationCompletionRS editUser(String username, EditUserRQ editUserRq,
}

return new OperationCompletionRS(
"User with login = '" + user.getLogin() + "' successfully updated");
"User with login = '"
+ user.getLogin()
+ "' successfully updated"
);
}

@Override
Expand Down Expand Up @@ -229,11 +220,43 @@ public OperationCompletionRS changePassword(ReportPortalUser loggedInUser,
return new OperationCompletionRS("Password has been changed successfully");
}

private void updateEmail(String email, User user, ReportPortalUser editor) {
if (!editor.getUserRole().equals(UserRole.ADMINISTRATOR)) {
expect(user.getUserType(), equalTo(INTERNAL))
.verify(ACCESS_DENIED, "Unable to change email for external user");
}

expect(userRepository.findByEmail(email), Predicates.not(Optional::isPresent))
.verify(USER_ALREADY_EXISTS, email);

List<Project> userProjects = projectRepository.findUserProjects(user.getLogin());

userProjects.forEach(
project -> ProjectUtils.updateProjectRecipients(user.getEmail(), email, project));

user.setEmail(email);
user.setLogin(email);

try {
projectRepository.saveAll(userProjects);
} catch (Exception exp) {
throw new ReportPortalException("PROJECT update exception while USER editing.", exp);
}
}

private void updateFullName(String fullName, User user, ReportPortalUser editor) {
if (!editor.getUserRole().equals(UserRole.ADMINISTRATOR)) {
expect(user.getUserType(), equalTo(INTERNAL)).verify(
ACCESS_DENIED, "Unable to change full name for external user");
}
user.setFullName(fullName);
}

private void updateRestrictedFields(ReportPortalUser editor, User user, EditUserRQ editUserRq) {
ofNullable(editUserRq.getRole()).ifPresent(role -> {
checkPossibilityToEdit(editor, user, "role");
UserRole newRole = UserRole.findByName(role)
.orElseThrow(() -> new ReportPortalException(BAD_REQUEST_ERROR,
UserRole newRole = UserRole.findByName(role).orElseThrow(
() -> new ReportPortalException(BAD_REQUEST_ERROR,
"Incorrect specified Account Role parameter."));
publishChangeUserTypeEvent(user, editor, newRole);
user.setRole(newRole);
Expand Down Expand Up @@ -309,8 +332,13 @@ private Optional<Dimension> getImageDimension(MediaType mediaType, InputStream i

private void publishChangeUserTypeEvent(User user, ReportPortalUser editor, UserRole newRole) {
eventPublisher.publishEvent(
new ChangeUserTypeEvent(user.getId(), user.getLogin(),
user.getRole(), newRole, editor.getUserId(), editor.getUsername()));
new ChangeUserTypeEvent(
user.getId(),
user.getLogin(),
user.getRole(),
newRole,
editor.getUserId(),
editor.getUsername()));
}

private void checkPossibilityToEdit(ReportPortalUser editor, User user, String fieldName) {
Expand Down
Loading