ProductArea.java

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

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import no.nav.data.common.storage.domain.ChangeStamp;
import no.nav.data.common.storage.domain.DomainObject;
import no.nav.data.common.utils.StreamUtils;
import no.nav.data.team.po.dto.ProductAreaRequest;
import no.nav.data.team.po.dto.ProductAreaResponse;
import no.nav.data.team.shared.domain.HistorizedDomainObject;
import no.nav.data.team.shared.domain.Membered;
import no.nav.data.team.shared.dto.Links;
import no.nav.data.team.shared.domain.DomainObjectStatus;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;

import static no.nav.data.common.utils.StreamUtils.copyOf;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductArea implements DomainObject, Membered, HistorizedDomainObject {

    private UUID id;
    private String name;
    private String avdelingNomId;
    private String nomId;
    private AreaType areaType;
    private String description;
    private String slackChannel;
    private List<String> tags;
    private List<PaMember> members;
    private List<String> ownerGroupNavidentList;

    private DomainObjectStatus status;

    private ChangeStamp changeStamp;
    private LocalDateTime lastNudge;

    public List<PaMember> getMembers() {
        return members == null ? List.of() : members;
    }

    public ProductArea setFieldsFromRequest(ProductAreaRequest request, String avdelingNomId, List<PaMember> members) {
        name = request.getName();
        areaType = request.getAreaType();
        if (request.getAreaType().equals(AreaType.PRODUCT_AREA)) {
            this.avdelingNomId = avdelingNomId;
            this.ownerGroupNavidentList = request.getOwnerGroupNavidentList();
        }
        nomId = request.getNomId();
        description = request.getDescription();
        slackChannel = request.getSlackChannel();
        tags = copyOf(request.getTags());
        this.setMembers(members);
        this.members.sort(Comparator.comparing(PaMember::getNavIdent));
        status = request.getStatus();

        return this;
    }

    public ProductAreaResponse convertToResponse(String defaultProductAreaId) {
        return ProductAreaResponse.builder()
                .id(id)
                .name(name)
                .avdelingNomId(avdelingNomId)
                .nomId(nomId)
                .areaType(areaType)
                .description(description)
                .slackChannel(slackChannel)
                .tags(copyOf(tags))
                .members(StreamUtils.convert(members, PaMember::convertToResponse))
                .ownerGroupNavidentList(this.getOwnerGroupNavidentList())
                .changeStamp(convertChangeStampResponse())
                .links(Links.getFor(this))
                .status(status)
                .isDefaultArea(this.id.toString().equals(defaultProductAreaId))
                .build();
    }
}