Changelog.java

  1. package no.nav.data.team.notify.dto;

  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
  4. import com.fasterxml.jackson.annotation.JsonInclude;
  5. import lombok.AllArgsConstructor;
  6. import lombok.Builder;
  7. import lombok.Builder.Default;
  8. import lombok.Data;
  9. import lombok.NoArgsConstructor;
  10. import no.nav.data.team.notify.dto.MailModels.TypedItem;
  11. import no.nav.data.team.notify.dto.MailModels.UpdateModel;

  12. import java.util.ArrayList;
  13. import java.util.List;

  14. import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY;
  15. import static no.nav.data.common.utils.StreamUtils.convert;

  16. @Data
  17. public class Changelog {

  18.     private final List<Item> created = new ArrayList<>();
  19.     private final List<Item> deleted = new ArrayList<>();
  20.     private final List<Changeable> updated = new ArrayList<>();

  21.     @Data
  22.     @Builder
  23.     @AllArgsConstructor
  24.     @NoArgsConstructor
  25.     public static class Item {

  26.         TargetType type;

  27.         String id;
  28.         String name;
  29.         @JsonInclude(NON_EMPTY)
  30.         Boolean deleted;

  31.     }

  32.     @Data
  33.     @Builder
  34.     @AllArgsConstructor
  35.     @NoArgsConstructor
  36.     public static final class UpdateTeam implements Changeable {

  37.         Item target;

  38.         String oldName;
  39.         String newName;
  40.         String oldOwnershipType;
  41.         String newOwnershipType;
  42.         String oldTeamType;
  43.         String newTeamType;

  44.         Item oldArea;
  45.         Item newArea;

  46.         @Default
  47.         List<Resource> removedMembers = new ArrayList<>();
  48.         @Default
  49.         List<Resource> addedMembers = new ArrayList<>();
  50.     }

  51.     @Data
  52.     @Builder
  53.     @AllArgsConstructor
  54.     @NoArgsConstructor
  55.     public static final class UpdateArea implements Changeable {

  56.         Item target;

  57.         String oldName;
  58.         String newName;
  59.         String oldAreaType;
  60.         String newAreaType;

  61.         @Default
  62.         List<Resource> removedMembers = new ArrayList<>();
  63.         @Default
  64.         List<Resource> addedMembers = new ArrayList<>();
  65.         @Default
  66.         List<Item> removedTeams = new ArrayList<>();
  67.         @Default
  68.         List<Item> addedTeams = new ArrayList<>();
  69.     }

  70.     @JsonAutoDetect(fieldVisibility = Visibility.ANY)
  71.     public static record Resource(String ident, String name) {

  72.     }

  73.     public static Changelog from(UpdateModel model) {
  74.         var cl = new Changelog();
  75.         if (model != null) {
  76.             cl.getCreated().addAll(convert(model.getCreated(), Changelog::convertItemNoDel));
  77.             cl.getDeleted().addAll(convert(model.getDeleted(), Changelog::convertItemNoDel));
  78.             cl.getUpdated().addAll(convert(model.getUpdated(), Changelog::convertUpdateItem));
  79.         }
  80.         return cl;
  81.     }

  82.     private static Changeable convertUpdateItem(MailModels.UpdateItem item) {
  83.         Item target = convertItemNoDel(item.getItem());
  84.         return switch (target.getType()) {
  85.             case TEAM -> UpdateTeam.builder()
  86.                     .target(target)
  87.                     .oldName(item.getFromName())
  88.                     .newName(item.getToName())
  89.                     .oldOwnershipType(item.getFromOwnershipType())
  90.                     .newOwnershipType(item.getToOwnershipType())
  91.                     .oldTeamType(item.getFromTeamType())
  92.                     .newTeamType(item.getToTeamType())

  93.                     .oldArea(convertItem(item.getOldProductArea()))
  94.                     .newArea(convertItem(item.getNewProductArea()))

  95.                     .removedMembers(convert(item.removedMembers, m -> new Resource(m.getIdent(), m.getName())))
  96.                     .addedMembers(convert(item.newMembers, m -> new Resource(m.getIdent(), m.getName())))
  97.                     .build();
  98.             case AREA -> UpdateArea.builder()
  99.                     .target(target)
  100.                     .oldName(item.getFromName())
  101.                     .newName(item.getToName())
  102.                     .oldAreaType(item.getFromAreaType())
  103.                     .newAreaType(item.getToAreaType())

  104.                     .removedMembers(convert(item.removedMembers, m -> new Resource(m.getIdent(), m.getName())))
  105.                     .addedMembers(convert(item.newMembers, m -> new Resource(m.getIdent(), m.getName())))
  106.                     .removedTeams(convert(item.removedTeams, Changelog::convertItem))
  107.                     .addedTeams(convert(item.newTeams, Changelog::convertItem))
  108.                     .build();
  109.         };
  110.     }

  111.     private static Item convertItemNoDel(TypedItem item) {
  112.         var conv = convertItem(item);
  113.         conv.setDeleted(null);
  114.         return conv;
  115.     }

  116.     private static Item convertItem(TypedItem item) {
  117.         if (item == null) {
  118.             return null;
  119.         }
  120.         return Item.builder()
  121.                 .type(TargetType.valueOf(item.getType().name()))
  122.                 .id(item.getId())
  123.                 .name(item.getName())
  124.                 .deleted(item.isDeleted())
  125.                 .build();
  126.     }

  127.     enum TargetType {
  128.         TEAM,
  129.         AREA;
  130.     }

  131.     interface Changeable {

  132.     }
  133. }