Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.example.visacasemanagementsystem.audit;

public enum UserEventType {
CREATED,
UPDATED,
DELETED,
AUTHORIZATION_CHANGED
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.example.visacasemanagementsystem.audit;

public enum AuditEventType {
public enum VisaEventType {
CREATED,
ASSIGNED,
UPDATED,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.example.visacasemanagementsystem.audit.dto;

import org.example.visacasemanagementsystem.audit.UserEventType;

import java.time.LocalDateTime;

public record UserLogDTO(
Long id,
LocalDateTime timeStamp,
Long actorUserId,
Long targetUserId,
UserEventType userEventType,
String description) {
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package org.example.visacasemanagementsystem.audit.dto;

import org.example.visacasemanagementsystem.audit.AuditEventType;
import org.example.visacasemanagementsystem.audit.VisaEventType;

import java.time.LocalDateTime;

public record AuditDTO(
public record VisaLogDTO(
Long id,
LocalDateTime timeStamp,
Long userId,
Long visaCaseId,
AuditEventType auditEventType,
VisaEventType visaEventType,
String description) {
}
Original file line number Diff line number Diff line change
@@ -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.UserEventType;
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 UserLog {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_log_id", nullable = false)
private Long id;

@NotNull @CreatedDate
private LocalDateTime timeStamp;

// Who performed the action (e.g. the sysadmin who deleted the account, or the
// user themselves when self-creating via signup or self-updating their profile).
@NotNull private Long actorUserId;

// Which user the action was performed on. For self-creation/self-update this
// equals actorUserId; for admin-initiated changes it differs.
@NotNull private Long targetUserId;

@NotNull @Enumerated(EnumType.STRING)
private UserEventType userEventType;

private String description; // Free-form description of what happened.

@Override
public boolean equals(Object o) {
if (!(o instanceof UserLog userLog)) return false;
return Objects.equals(id, userLog.id);
}

@Override
public int hashCode() {
return Objects.hashCode(id);
}

@Override
public String toString() {
return "UserLog{" +
"id=" + id +
", timeStamp=" + timeStamp +
", actorUserId=" + actorUserId +
", targetUserId=" + targetUserId +
", userEventType=" + userEventType +
", description='" + description + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.example.visacasemanagementsystem.audit.AuditEventType;
import org.example.visacasemanagementsystem.audit.VisaEventType;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

Expand All @@ -17,11 +17,11 @@
@Setter
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class AuditLog {
public class VisaLog {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "audit_id", nullable = false)
@Column(name = "visa_log_id", nullable = false)
private Long id;

@NotNull @CreatedDate
Expand All @@ -32,14 +32,14 @@ public class AuditLog {
@NotNull private Long visaCaseId; // Vilket ärende rör det?

@NotNull @Enumerated(EnumType.STRING)
private AuditEventType auditEventType;
private VisaEventType visaEventType;

private String description; // Beskrivning av händelse

@Override
public boolean equals(Object o) {
if (!(o instanceof AuditLog auditLog)) return false;
return Objects.equals(id, auditLog.id);
if (!(o instanceof VisaLog visaLog)) return false;
return Objects.equals(id, visaLog.id);
}

@Override
Expand All @@ -49,12 +49,12 @@ public int hashCode() {

@Override
public String toString() {
return "AuditLog{" +
return "VisaLog{" +
"id=" + id +
", timeStamp=" + timeStamp +
", userId=" + userId +
", visaCaseId=" + visaCaseId +
", auditEventType=" + auditEventType +
", visaEventType=" + visaEventType +
", description='" + description + '\'' +
'}';
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.example.visacasemanagementsystem.audit.mapper;

import org.example.visacasemanagementsystem.audit.UserEventType;
import org.example.visacasemanagementsystem.audit.dto.UserLogDTO;
import org.example.visacasemanagementsystem.audit.entity.UserLog;
import org.springframework.stereotype.Component;


@Component
public class UserLogMapper {

// For viewing (Entity --> DTO)
public UserLogDTO toDTO(UserLog userLog) {
if (userLog == null) return null;

return new UserLogDTO(
userLog.getId(),
userLog.getTimeStamp(),
userLog.getActorUserId(),
userLog.getTargetUserId(),
userLog.getUserEventType(),
userLog.getDescription()
);
}


// The service layer is responsible for creating the log entity
public UserLog toEntity(Long actorUserId, Long targetUserId, UserEventType userEventType, String description) {
UserLog userLog = new UserLog();
userLog.setActorUserId(actorUserId);
userLog.setTargetUserId(targetUserId);
userLog.setUserEventType(userEventType);
userLog.setDescription(description);
return userLog;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.example.visacasemanagementsystem.audit.mapper;

import org.example.visacasemanagementsystem.audit.VisaEventType;
import org.example.visacasemanagementsystem.audit.dto.VisaLogDTO;
import org.example.visacasemanagementsystem.audit.entity.VisaLog;
import org.springframework.stereotype.Component;


@Component
public class VisaLogMapper {

// For viewing (Entity --> DTO)
public VisaLogDTO toDTO(VisaLog visaLog) {
if (visaLog == null) return null;

return new VisaLogDTO(
visaLog.getId(),
visaLog.getTimeStamp(),
visaLog.getUserId(),
visaLog.getVisaCaseId(),
visaLog.getVisaEventType(),
visaLog.getDescription()
);
}


// The service layer is responsible for creating the log entity
public VisaLog toEntity(Long userId, Long visaCaseId, VisaEventType visaEventType, String description) {
VisaLog visaLog = new VisaLog();
visaLog.setUserId(userId);
visaLog.setVisaCaseId(visaCaseId);
visaLog.setVisaEventType(visaEventType);
visaLog.setDescription(description);
return visaLog;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.example.visacasemanagementsystem.audit.repository;

import org.example.visacasemanagementsystem.audit.entity.AuditLog;
import org.example.visacasemanagementsystem.audit.entity.UserLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface AuditRepository extends JpaRepository<AuditLog, Long> {
public interface UserLogRepository extends JpaRepository<UserLog, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.example.visacasemanagementsystem.audit.repository;

import org.example.visacasemanagementsystem.audit.entity.VisaLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface VisaLogRepository extends JpaRepository<VisaLog, Long> {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.example.visacasemanagementsystem.audit.service;

import org.example.visacasemanagementsystem.audit.UserEventType;
import org.example.visacasemanagementsystem.audit.dto.UserLogDTO;
import org.example.visacasemanagementsystem.audit.entity.UserLog;
import org.example.visacasemanagementsystem.audit.mapper.UserLogMapper;
import org.example.visacasemanagementsystem.audit.repository.UserLogRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserLogService {

private final UserLogRepository userLogRepository;
private final UserLogMapper userLogMapper;

public UserLogService(UserLogRepository userLogRepository, UserLogMapper userLogMapper) {
this.userLogRepository = userLogRepository;
this.userLogMapper = userLogMapper;
}

public void createUserLog(Long actorUserId, Long targetUserId, UserEventType userEventType, String description) {
UserLog userLog = userLogMapper.toEntity(actorUserId, targetUserId, userEventType, description);
userLogRepository.save(userLog);
}

public List<UserLogDTO> findAll() {
return userLogRepository.findAll()
.stream()
.map(userLogMapper::toDTO)
.toList();
}
}
Loading