From b3d050b42ec66aeb1ca6685dda3908c5cc649dee Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Mon, 8 Sep 2025 15:19:17 +0800 Subject: [PATCH] Add system user and log attribution --- .../config/SystemUserInitializer.java | 34 +++++++++++++++++++ .../service/PostChangeLogService.java | 9 +++++ 2 files changed, 43 insertions(+) create mode 100644 backend/src/main/java/com/openisle/config/SystemUserInitializer.java diff --git a/backend/src/main/java/com/openisle/config/SystemUserInitializer.java b/backend/src/main/java/com/openisle/config/SystemUserInitializer.java new file mode 100644 index 000000000..83017bdc2 --- /dev/null +++ b/backend/src/main/java/com/openisle/config/SystemUserInitializer.java @@ -0,0 +1,34 @@ +package com.openisle.config; + +import com.openisle.model.Role; +import com.openisle.model.User; +import com.openisle.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +/** + * Ensure a dedicated "system" user exists for internal operations. + */ +@Component +@RequiredArgsConstructor +public class SystemUserInitializer implements CommandLineRunner { + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + @Override + public void run(String... args) { + userRepository.findByUsername("system").orElseGet(() -> { + User system = new User(); + system.setUsername("system"); + system.setEmail("system@openisle.local"); + system.setPassword(passwordEncoder.encode("system")); + system.setRole(Role.ADMIN); + system.setVerified(true); + system.setApproved(true); + return userRepository.save(system); + }); + } +} + diff --git a/backend/src/main/java/com/openisle/service/PostChangeLogService.java b/backend/src/main/java/com/openisle/service/PostChangeLogService.java index 7244c4ca8..aeb6c2bc5 100644 --- a/backend/src/main/java/com/openisle/service/PostChangeLogService.java +++ b/backend/src/main/java/com/openisle/service/PostChangeLogService.java @@ -3,6 +3,7 @@ package com.openisle.service; import com.openisle.model.*; import com.openisle.repository.PostChangeLogRepository; import com.openisle.repository.PostRepository; +import com.openisle.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,6 +16,12 @@ import java.util.stream.Collectors; public class PostChangeLogService { private final PostChangeLogRepository logRepository; private final PostRepository postRepository; + private final UserRepository userRepository; + + private User getSystemUser() { + return userRepository.findByUsername("system") + .orElseThrow(() -> new IllegalStateException("System user not found")); + } public void recordContentChange(Post post, User user, String oldContent, String newContent) { PostContentChangeLog log = new PostContentChangeLog(); @@ -89,6 +96,7 @@ public class PostChangeLogService { public void recordVoteResult(Post post) { PostVoteResultChangeLog log = new PostVoteResultChangeLog(); log.setPost(post); + log.setUser(getSystemUser()); log.setType(PostChangeType.VOTE_RESULT); logRepository.save(log); } @@ -96,6 +104,7 @@ public class PostChangeLogService { public void recordLotteryResult(Post post) { PostLotteryResultChangeLog log = new PostLotteryResultChangeLog(); log.setPost(post); + log.setUser(getSystemUser()); log.setType(PostChangeType.LOTTERY_RESULT); logRepository.save(log); }