diff --git a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/config/AdminDataInitializer.java b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/config/AdminDataInitializer.java index bd63b95..4741133 100644 --- a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/config/AdminDataInitializer.java +++ b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/config/AdminDataInitializer.java @@ -13,6 +13,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; import java.security.SecureRandom; +import java.time.LocalDateTime; @Component @Profile("dev") @@ -60,6 +61,7 @@ public class AdminDataInitializer implements CommandLineRunner { admin.setLastName(ADMIN_LAST_NAME); admin.setParticipantType(ParticipantType.PRIVATE); admin.setRole(UserRole.ADMIN); + admin.setCreatedAt(LocalDateTime.now()); admin.setStatus(RegistrationStatus.APPROVED); admin.setEnabled(true); admin.setEmailVerified(true); @@ -74,6 +76,7 @@ public class AdminDataInitializer implements CommandLineRunner { testUser.setLastName("Benutzer"); testUser.setParticipantType(ParticipantType.PRIVATE); testUser.setRole(UserRole.MEMBER); + testUser.setCreatedAt(LocalDateTime.now()); testUser.setStatus(RegistrationStatus.PENDING); testUser.setEnabled(false); testUser.setEmailVerified(true); diff --git a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/domain/User.java b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/domain/User.java index 4645312..2853618 100644 --- a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/domain/User.java +++ b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/domain/User.java @@ -59,6 +59,9 @@ public class User implements UserDetails { @Column(nullable = false) private RegistrationStatus status = RegistrationStatus.PENDING; + @Column(updatable = false) + private LocalDateTime createdAt; + @Column(nullable = false) private boolean enabled = false; diff --git a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/mapper/UserMapper.java b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/mapper/UserMapper.java index b96db11..cead5c2 100644 --- a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/mapper/UserMapper.java +++ b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/mapper/UserMapper.java @@ -27,6 +27,7 @@ public interface UserMapper { @Mapping(target = "verificationToken", ignore = true) @Mapping(target = "passwordResetToken", ignore = true) @Mapping(target = "passwordResetTokenExpiry", ignore = true) + @Mapping(target = "createdAt", ignore = true) User mapToEntity(IamDtos.RegistrationRequest request, @MappingTarget User user); diff --git a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/service/AuthService.java b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/service/AuthService.java index 4358cba..4549219 100644 --- a/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/service/AuthService.java +++ b/eeg_backend/src/main/java/at/mueller/eeg/backend/iam/service/AuthService.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Instant; +import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.UUID; @@ -73,6 +74,7 @@ public class AuthService { } User newUser = userMapper.mapToEntity(request, new User()); + newUser.setCreatedAt(LocalDateTime.now()); String token = UUID.randomUUID().toString(); newUser.setVerificationToken(token); diff --git a/eeg_backend/src/test/java/at/mueller/eeg/backend/iam/domain/UserTest.java b/eeg_backend/src/test/java/at/mueller/eeg/backend/iam/domain/UserTest.java new file mode 100644 index 0000000..e0d0c03 --- /dev/null +++ b/eeg_backend/src/test/java/at/mueller/eeg/backend/iam/domain/UserTest.java @@ -0,0 +1,36 @@ +package at.mueller.eeg.backend.iam.domain; + +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; + +class UserTest { + + @Test + void createdAtFieldExists() { + User user = new User(); + LocalDateTime now = LocalDateTime.now(); + + user.setCreatedAt(now); + + assertEquals(now, user.getCreatedAt()); + } + + @Test + void createdAtIsNotUpdatable() throws NoSuchFieldException { + var field = User.class.getDeclaredField("createdAt"); + var column = field.getAnnotation(jakarta.persistence.Column.class); + + assertNotNull(column, "@Column annotation must be present on createdAt"); + assertFalse(column.updatable(), "createdAt must be non-updatable"); + } + + @Test + void createdAtDefaultIsNull() { + User user = new User(); + + assertNull(user.getCreatedAt(), "createdAt should default to null (not auto-generated)"); + } +}