GenericNotificationTask.java

package no.nav.data.team.notify.domain;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import no.nav.data.common.storage.domain.ChangeStamp;
import no.nav.data.common.storage.domain.DomainObject;
import no.nav.data.common.storage.domain.TypeRegistration;
import no.nav.data.common.utils.StreamUtils;
import no.nav.data.team.cluster.domain.Cluster;
import no.nav.data.team.po.domain.ProductArea;
import no.nav.data.team.team.domain.Team;

import java.util.List;
import java.util.UUID;

@Data
@NoArgsConstructor
@ToString(exclude = {"changeStamp"})
public class GenericNotificationTask implements DomainObject {

    private UUID id;
    private ChangeStamp changeStamp;

    private TaskType taskType;
    private TaskObject taskObject;

    public GenericNotificationTask(TaskObject taskObject) {
        setTaskObject(taskObject);
    }

    public void setTaskObject(TaskObject taskObject) {
        this.taskObject = taskObject;
        this.taskType = TaskType.valueOf(taskObject.getClass().getSimpleName());
    }

    public enum TaskType {
        InactiveMembers
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static final class InactiveMembers implements TaskObject {

        private UUID teamId;
        private UUID clusterId;
        private UUID productAreaId;
        private List<String> identsInactive;

        public static InactiveMembers team(UUID id, List<String> identsInactive) {
            return InactiveMembers.builder().teamId(id).identsInactive(identsInactive).build();
        }

        public static InactiveMembers cluster(UUID id, List<String> identsInactive) {
            return InactiveMembers.builder().clusterId(id).identsInactive(identsInactive).build();
        }

        public static InactiveMembers productArea(UUID id, List<String> identsInactive) {
            return InactiveMembers.builder().productAreaId(id).identsInactive(identsInactive).build();
        }

        public String getType() {
            return teamId != null ? TypeRegistration.typeOf(Team.class)
                    : productAreaId != null ? TypeRegistration.typeOf(ProductArea.class) : TypeRegistration.typeOf(Cluster.class);
        }

        public UUID getId() {
            return StreamUtils.first(teamId, productAreaId, clusterId);
        }
    }

    @JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY, property = "taskType")
    @JsonSubTypes({
            @Type(value = InactiveMembers.class, name = "InactiveMembers")
    })
    public interface TaskObject {

    }
}