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
103 changes: 78 additions & 25 deletions src/main/java/com/podzilla/auth/model/User.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Role> roles = new HashSet<>();

@Builder.Default
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL,
orphanRemoval = true)
private Set<RefreshToken> 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<Role> roles = new HashSet<>();
private Set<RefreshToken> 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<Role> 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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.");
Expand All @@ -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,
Expand Down
10 changes: 5 additions & 5 deletions src/test/java/com/podzilla/auth/service/AdminServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<User> expectedUsers = Arrays.asList(user1, user2);

when(userRepository.findAll()).thenReturn(expectedUsers);
Expand All @@ -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")
Expand All @@ -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")
Expand All @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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
Expand All @@ -168,7 +167,6 @@ void registerAccount_shouldHandleRoleNotFoundGracefully() {

// Assert
verify(userRepository).existsByEmail(signupRequest.getEmail());
verify(passwordEncoder).encode(signupRequest.getPassword());
verify(roleRepository).findByErole(ERole.ROLE_USER);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
10 changes: 5 additions & 5 deletions src/test/java/com/podzilla/auth/service/TokenServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)))
Expand Down