From cf1a203bdbcb322884baabdc6e5170eb89fb79e7 Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Thu, 23 Apr 2026 22:22:52 +0200 Subject: [PATCH 1/9] feat: implement entities and enumTypes for file and comment logger --- .../audit/CommentEventType.java | 7 ++ .../audit/FileEventType.java | 8 +++ .../audit/entity/CommentLog.java | 68 +++++++++++++++++++ .../audit/entity/FileLog.java | 65 ++++++++++++++++++ .../audit/entity/VisaLog.java | 6 +- 5 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/CommentEventType.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/FileEventType.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/CommentEventType.java b/src/main/java/org/example/visacasemanagementsystem/audit/CommentEventType.java new file mode 100644 index 0000000..e841a44 --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/CommentEventType.java @@ -0,0 +1,7 @@ +package org.example.visacasemanagementsystem.audit; + +public enum CommentEventType { + ADDED, + UPDATED, + DELETED +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/FileEventType.java b/src/main/java/org/example/visacasemanagementsystem/audit/FileEventType.java new file mode 100644 index 0000000..6679f49 --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/FileEventType.java @@ -0,0 +1,8 @@ +package org.example.visacasemanagementsystem.audit; + +public enum FileEventType { + UPLOADED, + DELETED, + DOWNLOADED + +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java b/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java new file mode 100644 index 0000000..520e5c2 --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java @@ -0,0 +1,68 @@ +package org.example.visacasemanagementsystem.audit.entity; + + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.example.visacasemanagementsystem.audit.CommentEventType; +import org.example.visacasemanagementsystem.audit.FileEventType; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@EntityListeners(AuditingEntityListener.class) +public class CommentLog { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "comment_log_id", nullable = false) + private Long id; + + @NotNull + @CreatedDate + private LocalDateTime timeStamp; + + @NotNull private Long actorUserId; + + @NotNull private Long visaCaseId; + + @NotNull + private Long commentId; + + @NotNull @Enumerated(EnumType.STRING) + private CommentEventType commentEventType; + + private String description; + + @Override + public boolean equals(Object o) { + if (!(o instanceof CommentLog that)) return false; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "CommentLog{" + + "id=" + id + + ", timeStamp=" + timeStamp + + ", actorUserId=" + actorUserId + + ", visaCaseId=" + visaCaseId + + ", commentId=" + commentId + + ", commentEventType=" + commentEventType + + ", description='" + description + '\'' + + '}'; + } +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java b/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java new file mode 100644 index 0000000..c4e996b --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java @@ -0,0 +1,65 @@ +package org.example.visacasemanagementsystem.audit.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.example.visacasemanagementsystem.audit.FileEventType; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@EntityListeners(AuditingEntityListener.class) +public class FileLog { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "file_log_id", nullable = false) + private Long id; + + @NotNull + @CreatedDate + private LocalDateTime timeStamp; + + @NotNull private Long actorUserId; + + @NotNull private Long visaCaseId; + + @NotNull private String fileName; + + @NotNull @Enumerated(EnumType.STRING) + private FileEventType fileEventType; + + private String description; + + @Override + public boolean equals(Object o) { + if (!(o instanceof FileLog fileLog)) return false; + return Objects.equals(id, fileLog.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "FileLog{" + + "id=" + id + + ", timeStamp=" + timeStamp + + ", actorUserId=" + actorUserId + + ", visaCaseId=" + visaCaseId + + ", fileName='" + fileName + '\'' + + ", fileEventType=" + fileEventType + + ", description='" + description + '\'' + + '}'; + } +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/entity/VisaLog.java b/src/main/java/org/example/visacasemanagementsystem/audit/entity/VisaLog.java index e86535c..33583cf 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/entity/VisaLog.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/entity/VisaLog.java @@ -27,14 +27,14 @@ public class VisaLog { @NotNull @CreatedDate private LocalDateTime timeStamp; - @NotNull private Long userId; // Vem gjorde vad? + @NotNull private Long userId; - @NotNull private Long visaCaseId; // Vilket ärende rör det? + @NotNull private Long visaCaseId; @NotNull @Enumerated(EnumType.STRING) private VisaEventType visaEventType; - private String description; // Beskrivning av händelse + private String description; @Override public boolean equals(Object o) { From 461f1a8bae1c56d38ae70ae93c7c55e52bd42b04 Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 09:31:37 +0200 Subject: [PATCH 2/9] feat: implement comment-/file DTOs and mapper --- .../audit/dto/CommentLogDTO.java | 15 +++++++ .../audit/dto/FileLogDTO.java | 15 +++++++ .../audit/entity/CommentLog.java | 1 - .../audit/mapper/CommentLogMapper.java | 36 +++++++++++++++++ .../audit/mapper/FileLogMapper.java | 39 +++++++++++++++++++ 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/dto/CommentLogDTO.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/dto/FileLogDTO.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapper.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/dto/CommentLogDTO.java b/src/main/java/org/example/visacasemanagementsystem/audit/dto/CommentLogDTO.java new file mode 100644 index 0000000..1b65beb --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/dto/CommentLogDTO.java @@ -0,0 +1,15 @@ +package org.example.visacasemanagementsystem.audit.dto; + +import org.example.visacasemanagementsystem.audit.CommentEventType; + +import java.time.LocalDateTime; + +public record CommentLogDTO( + Long id, + LocalDateTime timeStamp, + Long actorUserId, + Long visaCaseId, + Long commentId, + CommentEventType commentEventType, + String description) { +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/dto/FileLogDTO.java b/src/main/java/org/example/visacasemanagementsystem/audit/dto/FileLogDTO.java new file mode 100644 index 0000000..b986eca --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/dto/FileLogDTO.java @@ -0,0 +1,15 @@ +package org.example.visacasemanagementsystem.audit.dto; + +import org.example.visacasemanagementsystem.audit.FileEventType; + +import java.time.LocalDateTime; + +public record FileLogDTO( + Long id, + LocalDateTime timeStamp, + Long actorUserId, + Long visaCaseId, + String fileName, + FileEventType fileEventType, + String description){ +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java b/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java index 520e5c2..208922c 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java @@ -7,7 +7,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; import org.example.visacasemanagementsystem.audit.CommentEventType; -import org.example.visacasemanagementsystem.audit.FileEventType; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapper.java b/src/main/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapper.java new file mode 100644 index 0000000..87f8bc1 --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapper.java @@ -0,0 +1,36 @@ +package org.example.visacasemanagementsystem.audit.mapper; + +import org.example.visacasemanagementsystem.audit.CommentEventType; +import org.example.visacasemanagementsystem.audit.dto.CommentLogDTO; +import org.example.visacasemanagementsystem.audit.entity.CommentLog; +import org.springframework.stereotype.Component; + +@Component +public class CommentLogMapper { + + // For viewing (Entity --> DTO) + public CommentLogDTO toDTO(CommentLog commentLog) { + if (commentLog == null) return null; + + return new CommentLogDTO( + commentLog.getId(), + commentLog.getTimeStamp(), + commentLog.getActorUserId(), + commentLog.getVisaCaseId(), + commentLog.getCommentId(), + commentLog.getCommentEventType(), + commentLog.getDescription() + ); + } + + // The service layer is responsible for creating the log entity + public CommentLog toEntity(Long actorUserId, Long visaCaseId, Long commentId, CommentEventType commentEventType, String description) { + CommentLog commentLog = new CommentLog(); + commentLog.setActorUserId(actorUserId); + commentLog.setVisaCaseId(visaCaseId); + commentLog.setCommentId(commentId); + commentLog.setCommentEventType(commentEventType); + commentLog.setDescription(description); + return commentLog; + } +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java b/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java new file mode 100644 index 0000000..a4643e8 --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java @@ -0,0 +1,39 @@ +package org.example.visacasemanagementsystem.audit.mapper; + +import org.example.visacasemanagementsystem.audit.FileEventType; +import org.example.visacasemanagementsystem.audit.dto.FileLogDTO; +import org.example.visacasemanagementsystem.audit.entity.FileLog; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class FileLogMapper { + + // For viewing (Entity --> DTO) + public FileLogDTO toDTO(FileLog fileLog) { + if (fileLog == null) return null; + + return new FileLogDTO( + fileLog.getId(), + fileLog.getTimeStamp(), + fileLog.getActorUserId(), + fileLog.getVisaCaseId(), + fileLog.getFileName(), + fileLog.getFileEventType(), + fileLog.getDescription() + ); + } + + // The service layer is responsible for creating the log entity + public FileLog toEntity(Long actorUserId, Long visaCaseId, String fileName, FileEventType fileEventType, String description) { + FileLog fileLog = new FileLog(); + fileLog.setActorUserId(actorUserId); + fileLog.setVisaCaseId(visaCaseId); + fileLog.setFileName(fileName); + fileLog.setFileEventType(fileEventType); + fileLog.setDescription(description); + return fileLog; + + } +} From b94db7e637121178c3ee5ea30f1d691827781db8 Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 09:55:51 +0200 Subject: [PATCH 3/9] feat: implement comment-/file repos and services --- .../repository/CommentLogRepository.java | 9 +++++ .../audit/repository/FileLogRepository.java | 9 +++++ .../audit/service/CommentLogService.java | 37 +++++++++++++++++ .../audit/service/FileLogService.java | 40 +++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/repository/CommentLogRepository.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/repository/FileLogRepository.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java create mode 100644 src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/repository/CommentLogRepository.java b/src/main/java/org/example/visacasemanagementsystem/audit/repository/CommentLogRepository.java new file mode 100644 index 0000000..a8f3d33 --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/repository/CommentLogRepository.java @@ -0,0 +1,9 @@ +package org.example.visacasemanagementsystem.audit.repository; + +import org.example.visacasemanagementsystem.audit.entity.CommentLog; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CommentLogRepository extends JpaRepository { +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/repository/FileLogRepository.java b/src/main/java/org/example/visacasemanagementsystem/audit/repository/FileLogRepository.java new file mode 100644 index 0000000..416ac5a --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/repository/FileLogRepository.java @@ -0,0 +1,9 @@ +package org.example.visacasemanagementsystem.audit.repository; + +import org.example.visacasemanagementsystem.audit.entity.FileLog; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FileLogRepository extends JpaRepository { +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java b/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java new file mode 100644 index 0000000..ede161a --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java @@ -0,0 +1,37 @@ +package org.example.visacasemanagementsystem.audit.service; + +import org.example.visacasemanagementsystem.audit.CommentEventType; +import org.example.visacasemanagementsystem.audit.dto.CommentLogDTO; +import org.example.visacasemanagementsystem.audit.entity.CommentLog; +import org.example.visacasemanagementsystem.audit.mapper.CommentLogMapper; +import org.example.visacasemanagementsystem.audit.repository.CommentLogRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CommentLogService { + + private final CommentLogRepository commentLogRepository; + private final CommentLogMapper commentLogMapper; + + public CommentLogService(CommentLogRepository commentLogRepository, CommentLogMapper commentLogMapper) { + this.commentLogRepository = commentLogRepository; + this.commentLogMapper = commentLogMapper; + + } + + public void createCommentLog(Long actorUserId, Long visaCasId, Long commentId, CommentEventType commentEventType, String description) { + CommentLog commentLog = commentLogMapper.toEntity(actorUserId, visaCasId, commentId,commentEventType, description); + commentLogRepository.save(commentLog); + + } + + public List findAll() { + return commentLogRepository.findAll() + .stream() + .map(commentLogMapper::toDTO) + .toList(); + } + +} diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java b/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java new file mode 100644 index 0000000..7d1444f --- /dev/null +++ b/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java @@ -0,0 +1,40 @@ +package org.example.visacasemanagementsystem.audit.service; + +import org.example.visacasemanagementsystem.audit.CommentEventType; +import org.example.visacasemanagementsystem.audit.FileEventType; +import org.example.visacasemanagementsystem.audit.UserEventType; +import org.example.visacasemanagementsystem.audit.dto.FileLogDTO; +import org.example.visacasemanagementsystem.audit.dto.UserLogDTO; +import org.example.visacasemanagementsystem.audit.entity.CommentLog; +import org.example.visacasemanagementsystem.audit.entity.FileLog; +import org.example.visacasemanagementsystem.audit.entity.UserLog; +import org.example.visacasemanagementsystem.audit.mapper.FileLogMapper; +import org.example.visacasemanagementsystem.audit.repository.FileLogRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FileLogService { + + private final FileLogRepository fileLogRepository; + private final FileLogMapper fileLogMapper; + + public FileLogService(FileLogRepository fileLogRepository, FileLogMapper fileLogMapper) { + this.fileLogRepository = fileLogRepository; + this.fileLogMapper = fileLogMapper; + } + + public void createFileLog(Long actorUserId, Long visaCasId, String fileName, FileEventType fileEventType, String description) { + FileLog fileLog = fileLogMapper.toEntity(actorUserId, visaCasId, fileName, fileEventType, description); + fileLogRepository.save(fileLog); + + } + + public List findAll() { + return fileLogRepository.findAll() + .stream() + .map(fileLogMapper::toDTO) + .toList(); + } +} From f767e28103af456da5d9c67a82a1c112945de5d4 Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 11:29:38 +0200 Subject: [PATCH 4/9] feat: update services to use the new specific loggers --- .../comment/service/CommentService.java | 21 +++++++++----- .../file/FileService.java | 26 +++++++++++++++-- .../visa/service/VisaService.java | 29 ++++++++++++++++--- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java b/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java index 7c8dbd5..ee52f51 100644 --- a/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java +++ b/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java @@ -1,6 +1,8 @@ package org.example.visacasemanagementsystem.comment.service; +import org.example.visacasemanagementsystem.audit.CommentEventType; import org.example.visacasemanagementsystem.audit.VisaEventType; +import org.example.visacasemanagementsystem.audit.service.CommentLogService; import org.example.visacasemanagementsystem.audit.service.VisaLogService; import org.example.visacasemanagementsystem.comment.dto.CommentDTO; import org.example.visacasemanagementsystem.comment.dto.CreateCommentDTO; @@ -24,18 +26,19 @@ public class CommentService { private final CommentMapper commentMapper; private final UserRepository userRepository; private final VisaRepository visaRepository; - private final VisaLogService visaLogService; + private final CommentLogService commentLogService; - public CommentService(CommentRepository commentRepository, CommentMapper commentMapper, UserRepository userRepository, VisaRepository visaRepository, VisaLogService visaLogService) { + public CommentService(CommentRepository commentRepository, CommentMapper commentMapper, UserRepository userRepository, VisaRepository visaRepository, CommentLogService commentLogService) { this.commentRepository = commentRepository; this.commentMapper = commentMapper; this.userRepository = userRepository; this.visaRepository = visaRepository; - this.visaLogService = visaLogService; + this.commentLogService = commentLogService; + } - // Create Comment + // Create Comment @Transactional public CommentDTO createComment(CreateCommentDTO dto, Long userId) { if (dto == null) { @@ -64,11 +67,13 @@ public CommentDTO createComment(CreateCommentDTO dto, Long userId) { Comment savedComment = commentRepository.save(comment); // Create log in database - visaLogService.createVisaLog( + commentLogService.createCommentLog( author.getId(), visa.getId(), - VisaEventType.UPDATED, - "Comment added by " + author.getFullName() + savedComment.getId(), + CommentEventType.ADDED, + "User added a new comment" + ); return commentMapper.toDTO(savedComment); @@ -90,4 +95,4 @@ public List getCommentsByVisaId(Long visaId) { .map(commentMapper::toDTO) .toList(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/example/visacasemanagementsystem/file/FileService.java b/src/main/java/org/example/visacasemanagementsystem/file/FileService.java index 1535214..98d3124 100644 --- a/src/main/java/org/example/visacasemanagementsystem/file/FileService.java +++ b/src/main/java/org/example/visacasemanagementsystem/file/FileService.java @@ -2,6 +2,8 @@ import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; +import org.example.visacasemanagementsystem.audit.FileEventType; +import org.example.visacasemanagementsystem.audit.service.FileLogService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -24,6 +26,7 @@ public class FileService { private final S3Client s3Client; private final S3Presigner s3Presigner; + private final FileLogService fileLogService; private static final Set ALLOWED_CONTENT_TYPES = Set.of( "application/pdf", @@ -39,9 +42,10 @@ public class FileService { @Value("${minio.corsAllowedOrigins:http://localhost:8080}") private String corsAllowedOrigins; - public FileService(S3Client s3Client, S3Presigner s3Presigner) { + public FileService(S3Client s3Client, S3Presigner s3Presigner, FileLogService fileLogService) { this.s3Client = s3Client; this.s3Presigner = s3Presigner; + this.fileLogService = fileLogService; } @PostConstruct @@ -94,7 +98,7 @@ public void initializeBucket() { } } - public String uploadFile(MultipartFile file) throws IOException { + public String uploadFile(MultipartFile file, Long visaCaseId, Long actorUserId) throws IOException { // Validate file size if (file.getSize() > MAX_FILE_SIZE_BYTES) { throw new IOException("File exceeds maximum allowed size of 10 MB"); @@ -123,6 +127,14 @@ public String uploadFile(MultipartFile file) throws IOException { s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); + fileLogService.createFileLog( + actorUserId, + visaCaseId, + fileName, + FileEventType.UPLOADED, + "File uploaded: " + safeName + ); + return fileName; } @@ -141,12 +153,20 @@ public String getPresignedDownloadUrl(String fileName) { return s3Presigner.presignGetObject(presignRequest).url().toString(); } - public void deleteFile(String s3Key) { + public void deleteFile(String s3Key, Long actorUserId, Long visaCaseId) { DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder() .bucket(bucketName) .key(s3Key) .build(); s3Client.deleteObject(deleteObjectRequest); + + fileLogService.createFileLog( + actorUserId, + visaCaseId, + s3Key, + FileEventType.DELETED, + "File deleted: " + s3Key + ); } diff --git a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java index bbc1db1..b053f69 100644 --- a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java +++ b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java @@ -1,6 +1,8 @@ package org.example.visacasemanagementsystem.visa.service; import jakarta.persistence.EntityNotFoundException; +import org.example.visacasemanagementsystem.audit.FileEventType; import org.example.visacasemanagementsystem.audit.VisaEventType; +import org.example.visacasemanagementsystem.audit.service.FileLogService; import org.example.visacasemanagementsystem.audit.service.VisaLogService; import org.example.visacasemanagementsystem.exception.UnauthorizedException; import org.example.visacasemanagementsystem.file.FileService; @@ -35,18 +37,21 @@ public class VisaService { private final VisaMapper visaMapper; private final FileService fileService; private final VisaLogService visaLogService; + private final FileLogService fileLogService; public VisaService(VisaRepository visaRepository, UserRepository userRepository, VisaMapper visaMapper, VisaLogService visaLogService, - FileService fileService) { + FileService fileService, + FileLogService fileLogService) { this.visaRepository = visaRepository; this.userRepository = userRepository; this.visaMapper = visaMapper; this.visaLogService = visaLogService; this.fileService = fileService; + this.fileLogService = fileLogService; } // --- For filtering in Frontend list-view --- @@ -204,11 +209,19 @@ public VisaDTO applyForVisa(CreateVisaDTO dto, Long userId, String s3Key) { visa.setApplicant(applicant); visa.setVisaStatus(VisaStatus.SUBMITTED); + Visa savedVisa = visaRepository.save(visa); + if (s3Key != null && !s3Key.isBlank()) { - visa.getS3Keys().add(s3Key); + savedVisa.getS3Keys().add(s3Key); } - Visa savedVisa = visaRepository.save(visa); + fileLogService.createFileLog( + userId, + savedVisa.getId(), + s3Key, + FileEventType.UPLOADED, + "Initial document attached during application creation." + ); // Create log in database visaLogService.createVisaLog( @@ -246,6 +259,14 @@ public VisaDTO updateVisa(Long visaId, UpdateVisaDTO dto, Long userId, String ne if (newS3Key != null && !newS3Key.isBlank()) { visa.getS3Keys().add(newS3Key); + + fileLogService.createFileLog( + userId, + visaId, + newS3Key, + FileEventType.UPLOADED, + "Document attached during application update." + ); } visa.setVisaStatus(VisaStatus.SUBMITTED); @@ -287,7 +308,7 @@ public void removeVisaDocument(Long visaId, String s3Key, Long userId) { } visaRepository.save(visa); - fileService.deleteFile(s3Key); + fileService.deleteFile(s3Key, userId, visaId); visaLogService.createVisaLog(userId, visaId, VisaEventType.UPDATED, "Removed document: " + s3Key); } From 2b7cc8ef029f2554b129c2c00b615173ebe03b2c Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 12:39:58 +0200 Subject: [PATCH 5/9] refactor: remove duplicate log creation in database --- .../file/FileService.java | 25 +++---------------- .../visa/service/VisaService.java | 3 ++- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/example/visacasemanagementsystem/file/FileService.java b/src/main/java/org/example/visacasemanagementsystem/file/FileService.java index 98d3124..6eaa9ce 100644 --- a/src/main/java/org/example/visacasemanagementsystem/file/FileService.java +++ b/src/main/java/org/example/visacasemanagementsystem/file/FileService.java @@ -26,7 +26,6 @@ public class FileService { private final S3Client s3Client; private final S3Presigner s3Presigner; - private final FileLogService fileLogService; private static final Set ALLOWED_CONTENT_TYPES = Set.of( "application/pdf", @@ -42,10 +41,9 @@ public class FileService { @Value("${minio.corsAllowedOrigins:http://localhost:8080}") private String corsAllowedOrigins; - public FileService(S3Client s3Client, S3Presigner s3Presigner, FileLogService fileLogService) { + public FileService(S3Client s3Client, S3Presigner s3Presigner) { this.s3Client = s3Client; this.s3Presigner = s3Presigner; - this.fileLogService = fileLogService; } @PostConstruct @@ -98,7 +96,7 @@ public void initializeBucket() { } } - public String uploadFile(MultipartFile file, Long visaCaseId, Long actorUserId) throws IOException { + public String uploadFile(MultipartFile file) throws IOException { // Validate file size if (file.getSize() > MAX_FILE_SIZE_BYTES) { throw new IOException("File exceeds maximum allowed size of 10 MB"); @@ -127,14 +125,6 @@ public String uploadFile(MultipartFile file, Long visaCaseId, Long actorUserId) s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize())); - fileLogService.createFileLog( - actorUserId, - visaCaseId, - fileName, - FileEventType.UPLOADED, - "File uploaded: " + safeName - ); - return fileName; } @@ -153,21 +143,12 @@ public String getPresignedDownloadUrl(String fileName) { return s3Presigner.presignGetObject(presignRequest).url().toString(); } - public void deleteFile(String s3Key, Long actorUserId, Long visaCaseId) { + public void deleteFile(String s3Key) { DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder() .bucket(bucketName) .key(s3Key) .build(); s3Client.deleteObject(deleteObjectRequest); - fileLogService.createFileLog( - actorUserId, - visaCaseId, - s3Key, - FileEventType.DELETED, - "File deleted: " + s3Key - ); } - - } diff --git a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java index b053f69..647b7d2 100644 --- a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java +++ b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java @@ -308,9 +308,10 @@ public void removeVisaDocument(Long visaId, String s3Key, Long userId) { } visaRepository.save(visa); - fileService.deleteFile(s3Key, userId, visaId); + fileService.deleteFile(s3Key); visaLogService.createVisaLog(userId, visaId, VisaEventType.UPDATED, "Removed document: " + s3Key); + fileLogService.createFileLog(userId, visaId, s3Key, FileEventType.DELETED, "Applicant removed file."); } } From 403f44080d31c980848f527d4530cd9c36f64c77 Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 12:42:18 +0200 Subject: [PATCH 6/9] fix: spotless fix --- .../visacasemanagementsystem/audit/entity/CommentLog.java | 6 ++---- .../visacasemanagementsystem/audit/entity/FileLog.java | 3 +-- .../audit/mapper/FileLogMapper.java | 1 - .../audit/service/FileLogService.java | 5 ----- .../comment/service/CommentService.java | 2 -- .../example/visacasemanagementsystem/file/FileService.java | 2 -- 6 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java b/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java index 208922c..ffaf495 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/entity/CommentLog.java @@ -25,16 +25,14 @@ public class CommentLog { @Column(name = "comment_log_id", nullable = false) private Long id; - @NotNull - @CreatedDate + @NotNull @CreatedDate private LocalDateTime timeStamp; @NotNull private Long actorUserId; @NotNull private Long visaCaseId; - @NotNull - private Long commentId; + @NotNull private Long commentId; @NotNull @Enumerated(EnumType.STRING) private CommentEventType commentEventType; diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java b/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java index c4e996b..7866adf 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/entity/FileLog.java @@ -24,8 +24,7 @@ public class FileLog { @Column(name = "file_log_id", nullable = false) private Long id; - @NotNull - @CreatedDate + @NotNull @CreatedDate private LocalDateTime timeStamp; @NotNull private Long actorUserId; diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java b/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java index a4643e8..358eee1 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapper.java @@ -5,7 +5,6 @@ import org.example.visacasemanagementsystem.audit.entity.FileLog; import org.springframework.stereotype.Component; -import java.time.LocalDateTime; @Component public class FileLogMapper { diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java b/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java index 7d1444f..e92b45d 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java @@ -1,13 +1,8 @@ package org.example.visacasemanagementsystem.audit.service; -import org.example.visacasemanagementsystem.audit.CommentEventType; import org.example.visacasemanagementsystem.audit.FileEventType; -import org.example.visacasemanagementsystem.audit.UserEventType; import org.example.visacasemanagementsystem.audit.dto.FileLogDTO; -import org.example.visacasemanagementsystem.audit.dto.UserLogDTO; -import org.example.visacasemanagementsystem.audit.entity.CommentLog; import org.example.visacasemanagementsystem.audit.entity.FileLog; -import org.example.visacasemanagementsystem.audit.entity.UserLog; import org.example.visacasemanagementsystem.audit.mapper.FileLogMapper; import org.example.visacasemanagementsystem.audit.repository.FileLogRepository; import org.springframework.stereotype.Service; diff --git a/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java b/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java index ee52f51..a1e7311 100644 --- a/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java +++ b/src/main/java/org/example/visacasemanagementsystem/comment/service/CommentService.java @@ -1,9 +1,7 @@ package org.example.visacasemanagementsystem.comment.service; import org.example.visacasemanagementsystem.audit.CommentEventType; -import org.example.visacasemanagementsystem.audit.VisaEventType; import org.example.visacasemanagementsystem.audit.service.CommentLogService; -import org.example.visacasemanagementsystem.audit.service.VisaLogService; import org.example.visacasemanagementsystem.comment.dto.CommentDTO; import org.example.visacasemanagementsystem.comment.dto.CreateCommentDTO; import org.example.visacasemanagementsystem.comment.entity.Comment; diff --git a/src/main/java/org/example/visacasemanagementsystem/file/FileService.java b/src/main/java/org/example/visacasemanagementsystem/file/FileService.java index 6eaa9ce..387fcec 100644 --- a/src/main/java/org/example/visacasemanagementsystem/file/FileService.java +++ b/src/main/java/org/example/visacasemanagementsystem/file/FileService.java @@ -2,8 +2,6 @@ import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; -import org.example.visacasemanagementsystem.audit.FileEventType; -import org.example.visacasemanagementsystem.audit.service.FileLogService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; From 58820cd7b9f6f0f49661a3320cfc5b492108da3d Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 13:03:56 +0200 Subject: [PATCH 7/9] fix: suggested fixes from CodeRabbit --- .../audit/service/CommentLogService.java | 4 ++-- .../audit/service/FileLogService.java | 4 ++-- .../visa/service/VisaService.java | 15 +++++++-------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java b/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java index ede161a..b5b9128 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/service/CommentLogService.java @@ -21,8 +21,8 @@ public CommentLogService(CommentLogRepository commentLogRepository, CommentLogMa } - public void createCommentLog(Long actorUserId, Long visaCasId, Long commentId, CommentEventType commentEventType, String description) { - CommentLog commentLog = commentLogMapper.toEntity(actorUserId, visaCasId, commentId,commentEventType, description); + public void createCommentLog(Long actorUserId, Long visaCaseId, Long commentId, CommentEventType commentEventType, String description) { + CommentLog commentLog = commentLogMapper.toEntity(actorUserId, visaCaseId, commentId,commentEventType, description); commentLogRepository.save(commentLog); } diff --git a/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java b/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java index e92b45d..fc60634 100644 --- a/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java +++ b/src/main/java/org/example/visacasemanagementsystem/audit/service/FileLogService.java @@ -20,8 +20,8 @@ public FileLogService(FileLogRepository fileLogRepository, FileLogMapper fileLog this.fileLogMapper = fileLogMapper; } - public void createFileLog(Long actorUserId, Long visaCasId, String fileName, FileEventType fileEventType, String description) { - FileLog fileLog = fileLogMapper.toEntity(actorUserId, visaCasId, fileName, fileEventType, description); + public void createFileLog(Long actorUserId, Long visaCaseId, String fileName, FileEventType fileEventType, String description) { + FileLog fileLog = fileLogMapper.toEntity(actorUserId, visaCaseId, fileName, fileEventType, description); fileLogRepository.save(fileLog); } diff --git a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java index 647b7d2..ef50614 100644 --- a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java +++ b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java @@ -213,16 +213,15 @@ public VisaDTO applyForVisa(CreateVisaDTO dto, Long userId, String s3Key) { if (s3Key != null && !s3Key.isBlank()) { savedVisa.getS3Keys().add(s3Key); + fileLogService.createFileLog( + userId, + savedVisa.getId(), + s3Key, + FileEventType.UPLOADED, + "Initial document attached during application creation." + ); } - fileLogService.createFileLog( - userId, - savedVisa.getId(), - s3Key, - FileEventType.UPLOADED, - "Initial document attached during application creation." - ); - // Create log in database visaLogService.createVisaLog( userId, From 3f76301d89ccea47c9d59fce7343904a73ec71ae Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 14:38:30 +0200 Subject: [PATCH 8/9] feat: implement logMapper tests for comment and file --- .../audit/mapper/CommentLogMapperTest.java | 87 ++++++++++++++ .../audit/mapper/FileLogMapperTest.java | 113 ++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java create mode 100644 src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java diff --git a/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java new file mode 100644 index 0000000..ef4909c --- /dev/null +++ b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java @@ -0,0 +1,87 @@ +package org.example.visacasemanagementsystem.audit.mapper; + +import org.example.visacasemanagementsystem.audit.CommentEventType; +import org.example.visacasemanagementsystem.audit.dto.CommentLogDTO; +import org.example.visacasemanagementsystem.audit.entity.CommentLog; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; + +@DisplayName("CommentLogMapper unit tests") +class CommentLogMapperTest { + + private CommentLogMapper commentLogmapper; + + @BeforeEach + void setUp() { + commentLogmapper = new CommentLogMapper(); + } + + @Test + @DisplayName("Checking if toDTO copies every field from CommentLog entity to CommentLogDTO") + void toDTO_shouldCopyAllFields_WhenEntityIsPopulated() { + // Arrange + LocalDateTime timestamp = LocalDateTime.of(2026, 4, 24, 14, 0,0); + CommentLog entity = new CommentLog(); + entity.setId(50L); + entity.setTimeStamp(timestamp); + entity.setActorUserId(1L); + entity.setVisaCaseId(100L); + entity.setCommentId(20L); + entity.setCommentEventType(CommentEventType.ADDED); + entity.setDescription("User added a comment regarding missing documents."); + + // Act + CommentLogDTO dto = commentLogmapper.toDTO(entity); + + // Assert + assertThat(dto).isNotNull(); + assertThat(dto.id()).isEqualTo(50L); + assertThat(dto.timeStamp()).isEqualTo(timestamp); + assertThat(dto.actorUserId()).isEqualTo(1L); + assertThat(dto.visaCaseId()).isEqualTo(100L); + assertThat(dto.commentId()).isEqualTo(20L); + assertThat(dto.commentEventType()).isEqualTo(CommentEventType.ADDED); + assertThat(dto.description()).isEqualTo("User added a comment regarding missing documents."); + + } + + @Test + @DisplayName("Checking if toDTO returns null when entity is null") + void toDTO_shouldReturnNull_WhenEntityIsNull() { + // Act + CommentLogDTO dto = commentLogmapper.toDTO(null); + + // Assert + assertThat(dto).isNull(); + + } + + @Test + @DisplayName("Checking if toEntity sets all fields for a new log entry") + void toEntity_shouldSetAllFields_WhenAllArgumentsAreProvided() { + // Act + CommentLog entity = commentLogmapper.toEntity( + 1L, 100L, 20L, + CommentEventType.ADDED, "User added a comment" + ); + + // Assert + assertThat(entity).isNotNull(); + assertThat(entity.getActorUserId()).isEqualTo(1L); + assertThat(entity.getVisaCaseId()).isEqualTo(100L); + assertThat(entity.getCommentId()).isEqualTo(20L); + assertThat(entity.getCommentEventType()).isEqualTo(CommentEventType.ADDED); + assertThat(entity.getDescription()).isEqualTo("User added a comment"); + assertThat(entity.getId()).isNull(); + assertThat(entity.getTimeStamp()).isNull(); + } + + + + +} diff --git a/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java new file mode 100644 index 0000000..07af609 --- /dev/null +++ b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java @@ -0,0 +1,113 @@ +package org.example.visacasemanagementsystem.audit.mapper; + + +import org.example.visacasemanagementsystem.audit.FileEventType; +import org.example.visacasemanagementsystem.audit.dto.FileLogDTO; +import org.example.visacasemanagementsystem.audit.entity.FileLog; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; + +@DisplayName("FilLogMapper unit tests") +class FileLogMapperTest { + + private FileLogMapper fileLogMapper; + + @BeforeEach + void setUp() { + fileLogMapper = new FileLogMapper(); + } + + @Test + @DisplayName("Checking if toDTO copies every field from FileLog entity to FileLogDTO") + void toDTO_shouldCopyAllFields_WhenEntityIsPopulated() { + // Arrange + LocalDateTime timestamp = LocalDateTime.of(2026, 4, 24, 15, 0, 0); + + FileLog entity = new FileLog(); + entity.setId(101L); + entity.setTimeStamp(timestamp); + entity.setActorUserId(7L); + entity.setVisaCaseId(200L); + entity.setFileName("passport_scan.pdf"); + entity.setFileEventType(FileEventType.UPLOADED); + entity.setDescription("Initial passport document uploaded."); + + // Act + FileLogDTO dto = fileLogMapper.toDTO(entity); + + // Assert + assertThat(dto).isNotNull(); + assertThat(dto.id()).isEqualTo(101L); + assertThat(dto.timeStamp()).isEqualTo(timestamp); + assertThat(dto.actorUserId()).isEqualTo(7L); + assertThat(dto.fileName()).isEqualTo("passport_scan.pdf"); + assertThat(dto.fileEventType()).isEqualTo(FileEventType.UPLOADED); + assertThat(dto.description()).isEqualTo("Initial passport document uploaded."); + + } + + @Test + @DisplayName("Checking if toDTO returns null when entity is null") + void toDTO_shouldReturnNull_WhenEntityIsNull() { + // Act + FileLogDTO dto = fileLogMapper.toDTO(null); + + // Assert + assertThat(dto).isNull(); + } + + @Test + @DisplayName("Checking if toEntity sets all fields correctly for a new file log") + void toEntity_shouldSetAllFields_WhenAllArgumentsAreProvided() { + // Arrange + Long actorId = 7L; + Long visaId = 200L; + String fileName = "visa_photo.jpg"; + String description = "Applicant photo uploaded via web portal."; + + // Act + FileLog entity = fileLogMapper.toEntity( + actorId, + visaId, + fileName, + FileEventType.UPLOADED, + description + ); + + // Assert + assertThat(entity).isNotNull(); + assertThat(entity.getActorUserId()).isEqualTo(actorId); + assertThat(entity.getVisaCaseId()).isEqualTo(visaId); + assertThat(entity.getFileName()).isEqualTo("visa_photo.jpg"); + assertThat(entity.getFileEventType()).isEqualTo(FileEventType.UPLOADED); + assertThat(entity.getDescription()).isEqualTo(description); + + assertThat(entity.getId()).isNull(); + assertThat(entity.getTimeStamp()).isNull(); + + } + + @Test + @DisplayName("Checking if toEntity handles deletion events correctly") + void toEntity_shouldHandleDeletionEventType() { + // Act + FileLog entity = fileLogMapper.toEntity( + 1L, + 200L, + "old_document.pdf", + FileEventType.DELETED, + "Document removed due to incorrect format" + ); + + // Assert + assertThat(entity.getFileEventType()).isEqualTo(FileEventType.DELETED); + assertThat(entity.getFileName()).isEqualTo("old_document.pdf"); + } + + +} From 68d8072e792b8c72cef15d2c6254d969da022583 Mon Sep 17 00:00:00 2001 From: Ebba Andersson Date: Fri, 24 Apr 2026 14:52:51 +0200 Subject: [PATCH 9/9] fix: more fixes from CodeRabbit --- .../visa/service/VisaService.java | 6 ++++-- .../audit/mapper/CommentLogMapperTest.java | 10 +++++----- .../audit/mapper/FileLogMapperTest.java | 3 ++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java index ef50614..607296c 100644 --- a/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java +++ b/src/main/java/org/example/visacasemanagementsystem/visa/service/VisaService.java @@ -227,7 +227,7 @@ public VisaDTO applyForVisa(CreateVisaDTO dto, Long userId, String s3Key) { userId, savedVisa.getId(), VisaEventType.CREATED, - "Visa application submitted." + (s3Key != null ? " Document attached." : "") + "Visa application submitted." + (s3Key != null && !s3Key.isBlank() ? " Document attached." : "") ); return visaMapper.toDTO(savedVisa); } @@ -310,7 +310,9 @@ public void removeVisaDocument(Long visaId, String s3Key, Long userId) { fileService.deleteFile(s3Key); visaLogService.createVisaLog(userId, visaId, VisaEventType.UPDATED, "Removed document: " + s3Key); - fileLogService.createFileLog(userId, visaId, s3Key, FileEventType.DELETED, "Applicant removed file."); + + String actor = isOwner ? "Applicant" : "Administrator"; + fileLogService.createFileLog(userId, visaId, s3Key, FileEventType.DELETED, actor + " removed file."); } } diff --git a/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java index ef4909c..e0ecded 100644 --- a/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java +++ b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/CommentLogMapperTest.java @@ -14,11 +14,11 @@ @DisplayName("CommentLogMapper unit tests") class CommentLogMapperTest { - private CommentLogMapper commentLogmapper; + private CommentLogMapper commentLogMapper; @BeforeEach void setUp() { - commentLogmapper = new CommentLogMapper(); + commentLogMapper = new CommentLogMapper(); } @Test @@ -36,7 +36,7 @@ void toDTO_shouldCopyAllFields_WhenEntityIsPopulated() { entity.setDescription("User added a comment regarding missing documents."); // Act - CommentLogDTO dto = commentLogmapper.toDTO(entity); + CommentLogDTO dto = commentLogMapper.toDTO(entity); // Assert assertThat(dto).isNotNull(); @@ -54,7 +54,7 @@ void toDTO_shouldCopyAllFields_WhenEntityIsPopulated() { @DisplayName("Checking if toDTO returns null when entity is null") void toDTO_shouldReturnNull_WhenEntityIsNull() { // Act - CommentLogDTO dto = commentLogmapper.toDTO(null); + CommentLogDTO dto = commentLogMapper.toDTO(null); // Assert assertThat(dto).isNull(); @@ -65,7 +65,7 @@ void toDTO_shouldReturnNull_WhenEntityIsNull() { @DisplayName("Checking if toEntity sets all fields for a new log entry") void toEntity_shouldSetAllFields_WhenAllArgumentsAreProvided() { // Act - CommentLog entity = commentLogmapper.toEntity( + CommentLog entity = commentLogMapper.toEntity( 1L, 100L, 20L, CommentEventType.ADDED, "User added a comment" ); diff --git a/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java index 07af609..93ca4d6 100644 --- a/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java +++ b/src/test/java/org/example/visacasemanagementsystem/audit/mapper/FileLogMapperTest.java @@ -12,7 +12,7 @@ import java.time.LocalDateTime; -@DisplayName("FilLogMapper unit tests") +@DisplayName("FileLogMapper unit tests") class FileLogMapperTest { private FileLogMapper fileLogMapper; @@ -45,6 +45,7 @@ void toDTO_shouldCopyAllFields_WhenEntityIsPopulated() { assertThat(dto.id()).isEqualTo(101L); assertThat(dto.timeStamp()).isEqualTo(timestamp); assertThat(dto.actorUserId()).isEqualTo(7L); + assertThat(dto.visaCaseId()).isEqualTo(200L); assertThat(dto.fileName()).isEqualTo("passport_scan.pdf"); assertThat(dto.fileEventType()).isEqualTo(FileEventType.UPLOADED); assertThat(dto.description()).isEqualTo("Initial passport document uploaded.");