From 3e336ca3c9bdd8423f8c1cc6f9214237996f7f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20M=C3=BCller?= Date: Fri, 24 Jul 2026 07:11:52 +0200 Subject: [PATCH] feat(iam): add @PrePersist callback to auto-populate User.createdAt Add onCreate() method with @PrePersist annotation that sets createdAt to LocalDateTime.now() on first persist, consistent with other entities (UserTariff, CommunityTariff, etc.). Guard prevents overwriting existing values. Two new tests verify auto-population and idempotency. --- .../mueller/eeg/backend/iam/domain/User.java | 7 ++++++ .../eeg/backend/iam/domain/UserTest.java | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+) 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 2853618..bb7bbff 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 @@ -65,6 +65,13 @@ public class User implements UserDetails { @Column(nullable = false) private boolean enabled = false; + @PrePersist + protected void onCreate() { + if (createdAt == null) { + createdAt = LocalDateTime.now(); + } + } + @Override @NonNull public Collection getAuthorities() { 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 index e0d0c03..453e404 100644 --- 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 @@ -33,4 +33,28 @@ class UserTest { assertNull(user.getCreatedAt(), "createdAt should default to null (not auto-generated)"); } + + @Test + void prePersistSetsCreatedAt() { + User user = new User(); + + LocalDateTime before = LocalDateTime.now(); + user.onCreate(); + LocalDateTime after = LocalDateTime.now(); + + assertNotNull(user.getCreatedAt(), "createdAt must be set by @PrePersist callback"); + assertFalse(user.getCreatedAt().isBefore(before), "createdAt must not be before test start"); + assertFalse(user.getCreatedAt().isAfter(after), "createdAt must not be after test end"); + } + + @Test + void prePersistDoesNotOverwriteExistingCreatedAt() { + User user = new User(); + LocalDateTime fixed = LocalDateTime.of(2025, 1, 1, 12, 0); + user.setCreatedAt(fixed); + + user.onCreate(); + + assertEquals(fixed, user.getCreatedAt(), "createdAt must not be overwritten if already set"); + } }