AuditVersion.java

  1. package no.nav.data.common.auditing.domain;

  2. import jakarta.persistence.*;
  3. import lombok.AllArgsConstructor;
  4. import lombok.Builder;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import lombok.experimental.FieldNameConstants;
  8. import no.nav.data.common.auditing.dto.AuditResponse;
  9. import no.nav.data.common.exceptions.ValidationException;
  10. import no.nav.data.common.storage.domain.DomainObject;
  11. import no.nav.data.common.storage.domain.GenericStorage;
  12. import no.nav.data.common.storage.domain.TypeRegistration;
  13. import no.nav.data.common.utils.JsonUtils;
  14. import no.nav.data.team.po.domain.ProductArea;
  15. import no.nav.data.team.team.domain.Team;
  16. import org.hibernate.annotations.JdbcTypeCode;
  17. import org.hibernate.type.SqlTypes;

  18. import java.time.LocalDateTime;
  19. import java.util.UUID;

  20. @Data
  21. @Builder
  22. @NoArgsConstructor
  23. @AllArgsConstructor
  24. @Entity
  25. @FieldNameConstants
  26. @Table(name = "AUDIT_VERSION")
  27. public class AuditVersion {

  28.     public static final String TEAM_TYPE = TypeRegistration.typeOf(Team.class);
  29.     public static final String PA_TYPE = TypeRegistration.typeOf(ProductArea.class);

  30.     @Id
  31.     @Column(name = "AUDIT_ID")
  32.     @Builder.Default
  33.     private UUID id = UUID.randomUUID();

  34.     @Enumerated(EnumType.STRING)
  35.     @Column(name = "ACTION", nullable = false, updatable = false)
  36.     private Action action;

  37.     @Column(name = "TABLE_NAME", nullable = false, updatable = false)
  38.     private String table;

  39.     @Column(name = "TABLE_ID", nullable = false, updatable = false)
  40.     private String tableId;

  41.     @Column(name = "TIME", nullable = false, updatable = false)
  42.     @Builder.Default
  43.     private LocalDateTime time = LocalDateTime.now();

  44.     @Column(name = "USER_ID", nullable = false, updatable = false)
  45.     private String user;

  46.     @JdbcTypeCode(SqlTypes.JSON)
  47.     @Column(name = "DATA", nullable = false, updatable = false)
  48.     private String data;

  49.     @Transient
  50.     private transient DomainObject domainObjectCache;

  51.     public boolean isTeam() {
  52.         return getTable().equals(TEAM_TYPE);
  53.     }

  54.     public boolean isProductArea() {
  55.         return getTable().equals(PA_TYPE);
  56.     }

  57.     public Team getTeamData() {
  58.         return getDomainObjectData(Team.class);
  59.     }

  60.     public ProductArea getProductAreaData() {
  61.         return getDomainObjectData(ProductArea.class);
  62.     }

  63.     @SuppressWarnings("unchecked")
  64.     public <T extends DomainObject> T getDomainObjectData(Class<T> type) {
  65.         if (!table.equals(TypeRegistration.typeOf(type))) {
  66.             throw new ValidationException("Invalid type for audit" + type);
  67.         }
  68.         if (domainObjectCache == null) {
  69.             var genStorage = JsonUtils.toObject(data, GenericStorage.class);
  70.             domainObjectCache = JsonUtils.toObject(genStorage.getData(), type);
  71.         }
  72.         return (T) domainObjectCache;
  73.     }

  74.     public AuditResponse convertToResponse() {
  75.         return AuditResponse.builder()
  76.                 .id(id.toString())
  77.                 .action(action)
  78.                 .table(table)
  79.                 .tableId(tableId)
  80.                 .time(time)
  81.                 .user(user)
  82.                 .data(JsonUtils.toJsonNode(this.data))
  83.                 .build();
  84.     }

  85.     public static String tableName(Class<? extends Auditable> aClass) {
  86.         return aClass.getAnnotation(Table.class).name();
  87.     }

  88. }