diff --git a/src/main/java/com/podzilla/auth/model/User.java b/src/main/java/com/podzilla/auth/model/User.java index d0b6ac5..ebe80ff 100644 --- a/src/main/java/com/podzilla/auth/model/User.java +++ b/src/main/java/com/podzilla/auth/model/User.java @@ -1,38 +1,35 @@ package com.podzilla.auth.model; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; +import jakarta.persistence.Id; import jakarta.persistence.Entity; +import jakarta.persistence.Table; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.JoinTable; +import jakarta.persistence.Column; import jakarta.persistence.ManyToMany; +import jakarta.persistence.JoinTable; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; import jakarta.persistence.FetchType; - -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - +import jakarta.persistence.JoinColumn; +import jakarta.persistence.CascadeType; import jakarta.validation.constraints.Email; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + @Entity @Table(name = "users") @Data -@Builder +@Getter @NoArgsConstructor @AllArgsConstructor -@Getter -public class User { +public final class User { @Id @GeneratedValue(strategy = GenerationType.UUID) private UUID id; @@ -52,28 +49,84 @@ public class User { orphanRemoval = true) private Address address; - @Builder.Default @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set roles = new HashSet<>(); - @Builder.Default @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private Set refreshTokens = new HashSet<>(); - @Builder.Default @Column(columnDefinition = "BOOLEAN DEFAULT TRUE") private Boolean enabled = true; + private User(final Builder builder) { + this.id = builder.id; + this.name = builder.name; + this.email = builder.email; + this.password = builder.password; + this.roles = builder.roles; + this.refreshTokens = builder.refreshTokens; + this.enabled = builder.enabled; + this.mobileNumber = builder.mobileNumber; + this.address = builder.address; + } + + public static class Builder { + private UUID id; + private String name; + private String email; + private String password; + private Set roles = new HashSet<>(); + private Set refreshTokens = new HashSet<>(); + private Boolean enabled = true; + private String mobileNumber; + private Address address; + + public Builder id(final UUID id) { + this.id = id; + return this; + } + + public Builder name(final String name) { + this.name = name; + return this; + } + + public Builder email(final String email) { + this.email = email; + return this; + } + + public Builder password(final String password) { + this.password = password; + return this; + } + + public Builder roles(final Set roles) { + this.roles = roles; + return this; + } + + public Builder enabled(final Boolean enabled) { + this.enabled = enabled; + return this; + } + + public Builder address(final Address address) { + this.address = address; + return this; + } + + public Builder mobileNumber(final String mobileNumber) { + this.mobileNumber = mobileNumber; + return this; + } - public User(final String name, final String email, - final String password) { - this.name = name; - this.email = email; - this.password = password; - this.enabled = true; + public User build() { + return new User(this); + } } } diff --git a/src/main/java/com/podzilla/auth/service/AuthenticationService.java b/src/main/java/com/podzilla/auth/service/AuthenticationService.java index f48c5a9..fd1cf04 100644 --- a/src/main/java/com/podzilla/auth/service/AuthenticationService.java +++ b/src/main/java/com/podzilla/auth/service/AuthenticationService.java @@ -83,6 +83,9 @@ public void registerAccount(final SignupRequest signupRequest) { throw new ValidationException("Email already in use."); } + Role role = roleRepository.findByErole(ERole.ROLE_USER).orElse(null); + + checkNotNullValidationException(role, "Role_USER not found."); if (userRepository.existsByMobileNumber( signupRequest.getMobileNumber())) { throw new ValidationException("Mobile number already in use."); @@ -97,22 +100,18 @@ public void registerAccount(final SignupRequest signupRequest) { .build(); User account = - User.builder() + new User.Builder() .name(signupRequest.getName()) .email(signupRequest.getEmail()) .password( passwordEncoder.encode( signupRequest.getPassword())) + .roles(Collections.singleton(role)) .mobileNumber(signupRequest.getMobileNumber()) .address(address) .build(); address.setUser(account); - Role role = roleRepository.findByErole(ERole.ROLE_USER).orElse(null); - - checkNotNullValidationException(role, "Role_USER not found."); - - account.setRoles(Collections.singleton(role)); account = userRepository.save(account); eventPublisher.publishEvent(EventsConstants.CUSTOMER_REGISTERED, diff --git a/src/test/java/com/podzilla/auth/service/AdminServiceTest.java b/src/test/java/com/podzilla/auth/service/AdminServiceTest.java index b7f85bc..5914970 100644 --- a/src/test/java/com/podzilla/auth/service/AdminServiceTest.java +++ b/src/test/java/com/podzilla/auth/service/AdminServiceTest.java @@ -34,8 +34,8 @@ class AdminServiceTest { @Test void getUsers_shouldReturnListOfUsers() { - User user1 = User.builder().id(UUID.randomUUID()).email("user1@example.com").name("User One").build(); - User user2 = User.builder().id(UUID.randomUUID()).email("user2@example.com").name("User Two").build(); + User user1 = new User.Builder().id(UUID.randomUUID()).email("user1@example.com").name("User One").build(); + User user2 = new User.Builder().id(UUID.randomUUID()).email("user2@example.com").name("User Two").build(); List expectedUsers = Arrays.asList(user1, user2); when(userRepository.findAll()).thenReturn(expectedUsers); @@ -51,7 +51,7 @@ void getUsers_shouldReturnListOfUsers() { @Test void updateUserActivation_shouldActivateUserSuccessfully() { UUID userId = UUID.randomUUID(); - User user = User.builder() + User user = new User.Builder() .id(userId) .email("user@example.com") .name("Test User") @@ -71,7 +71,7 @@ void updateUserActivation_shouldActivateUserSuccessfully() { @Test void updateUserActivation_shouldDeactivateUserSuccessfully() { UUID userId = UUID.randomUUID(); - User user = User.builder() + User user = new User.Builder() .id(userId) .email("user@example.com") .name("Test User") @@ -92,7 +92,7 @@ void updateUserActivation_shouldDeactivateUserSuccessfully() { @Test void deleteUser_shouldDeleteUserSuccessfully() { UUID userId = UUID.randomUUID(); - User user = User.builder() + User user = new User.Builder() .id(userId) .email("user@example.com") .name("Test User") diff --git a/src/test/java/com/podzilla/auth/service/AuthenticationServiceTest.java b/src/test/java/com/podzilla/auth/service/AuthenticationServiceTest.java index b111cf2..ca46914 100644 --- a/src/test/java/com/podzilla/auth/service/AuthenticationServiceTest.java +++ b/src/test/java/com/podzilla/auth/service/AuthenticationServiceTest.java @@ -90,7 +90,7 @@ void setUp() { loginRequest.setPassword("password123"); userRole = new Role(ERole.ROLE_USER); - user = User.builder() + user = new User.Builder() .id(UUID.randomUUID()) .name("Test User") .email("test@example.com") @@ -155,7 +155,6 @@ void registerAccount_shouldThrowValidationException_whenEmailExists() { void registerAccount_shouldHandleRoleNotFoundGracefully() { // Arrange - Simulate role not found in DB when(userRepository.existsByEmail(signupRequest.getEmail())).thenReturn(false); - when(passwordEncoder.encode(signupRequest.getPassword())).thenReturn("encodedPassword"); when(roleRepository.findByErole(ERole.ROLE_USER)).thenReturn(Optional.empty()); // Role not found // Act @@ -168,7 +167,6 @@ void registerAccount_shouldHandleRoleNotFoundGracefully() { // Assert verify(userRepository).existsByEmail(signupRequest.getEmail()); - verify(passwordEncoder).encode(signupRequest.getPassword()); verify(roleRepository).findByErole(ERole.ROLE_USER); } diff --git a/src/test/java/com/podzilla/auth/service/CustomUserDetailsServiceTest.java b/src/test/java/com/podzilla/auth/service/CustomUserDetailsServiceTest.java index 2770033..379db29 100644 --- a/src/test/java/com/podzilla/auth/service/CustomUserDetailsServiceTest.java +++ b/src/test/java/com/podzilla/auth/service/CustomUserDetailsServiceTest.java @@ -50,7 +50,7 @@ void setUp() { roles.add(userRole); roles.add(adminRole); - user = User.builder() + user = new User.Builder() .id(UUID.randomUUID()) .name("Test User") .email(userEmail) @@ -107,7 +107,7 @@ void loadUserByUsername_shouldThrowNotFoundException_whenUserDoesNotExist() { void loadUserByUsername_shouldThrowValidationException_whenUserHasEmptyRoles() { // Arrange String emailWithNoRoles = "norole@example.com"; - User userWithNoRoles = User.builder() + User userWithNoRoles = new User.Builder() .id(UUID.randomUUID()) .name("No Role User") .email(emailWithNoRoles) @@ -130,7 +130,7 @@ void loadUserByUsername_shouldThrowValidationException_whenUserHasEmptyRoles() { void loadUserByUsername_shouldThrowValidationException_whenUserHasNullRoles() { // Arrange String emailWithNullRoles = "nullrole@example.com"; - User userWithNullRoles = User.builder() + User userWithNullRoles = new User.Builder() .id(UUID.randomUUID()) .name("Null Role User") .email(emailWithNullRoles) diff --git a/src/test/java/com/podzilla/auth/service/TokenServiceTest.java b/src/test/java/com/podzilla/auth/service/TokenServiceTest.java index 896db88..6625e38 100644 --- a/src/test/java/com/podzilla/auth/service/TokenServiceTest.java +++ b/src/test/java/com/podzilla/auth/service/TokenServiceTest.java @@ -100,7 +100,7 @@ void generateAccessToken_ShouldAddCookie() { @DisplayName("Should generate new refresh token if none exists") void generateRefreshToken_WhenNoneExists_ShouldCreateNewAndAddCookie() { // Arrange - User user = User.builder().id(testUserId).email(testEmail).build(); + User user = new User.Builder().id(testUserId).email(testEmail).build(); when(userRepository.findByEmail(testEmail)).thenReturn(Optional.of(user)); when(refreshTokenRepository.findByUserIdAndExpiresAtAfter(eq(testUserId), any(Instant.class))) .thenReturn(Optional.empty()); // No existing valid token @@ -142,7 +142,7 @@ void generateRefreshToken_WhenNoneExists_ShouldCreateNewAndAddCookie() { @DisplayName("Should use existing refresh token if valid one exists") void generateRefreshToken_WhenValidExists_ShouldUseExistingAndAddCookie() { // Arrange - User user = User.builder().id(testUserId).email(testEmail).build(); + User user = new User.Builder().id(testUserId).email(testEmail).build(); RefreshToken existingToken = RefreshToken.builder() .id(testRefreshTokenId) .user(user) @@ -195,7 +195,7 @@ void generateRefreshToken_WhenUserNotFound_ShouldThrowValidationException() { @DisplayName("Should renew refresh token successfully") void renewRefreshToken_ValidToken_ShouldExpireOldCreateNewAddCookieAndReturnEmail() { // Arrange - User user = User.builder().id(testUserId).email(testEmail).build(); + User user = new User.Builder().id(testUserId).email(testEmail).build(); RefreshToken oldToken = RefreshToken.builder() .id(testRefreshTokenId) .user(user) @@ -388,7 +388,7 @@ void removeRefreshTokenFromCookieAndExpire_ValidState_ShouldPerformActions() { // Arrange setupClaimsForEmailExtraction(); // Simulate prior successful access token validation - User user = User.builder().id(testUserId).email(testEmail).build(); + User user = new User.Builder().id(testUserId).email(testEmail).build(); RefreshToken refreshToken = RefreshToken.builder() .id(testRefreshTokenId) .user(user) @@ -444,7 +444,7 @@ void removeRefreshTokenFromCookieAndExpire_UserNotFound_ShouldThrowValidationExc void removeRefreshTokenFromCookieAndExpire_TokenNotFound_ShouldThrowValidationException() { // Arrange setupClaimsForEmailExtraction(); - User user = User.builder().id(testUserId).email(testEmail).build(); + User user = new User.Builder().id(testUserId).email(testEmail).build(); when(userRepository.findByEmail(testEmail)).thenReturn(Optional.of(user)); when(refreshTokenRepository.findByUserIdAndExpiresAtAfter(eq(testUserId), any(Instant.class)))