MetricMapper.java

package io.featureprobe.api.mapper;

import io.featureprobe.api.base.enums.EventTypeEnum;
import io.featureprobe.api.base.enums.MatcherTypeEnum;
import io.featureprobe.api.dao.entity.Event;
import io.featureprobe.api.dao.entity.Metric;
import io.featureprobe.api.dto.EventResponse;
import io.featureprobe.api.dto.MetricConfigResponse;
import io.featureprobe.api.dto.MetricCreateRequest;
import io.featureprobe.api.dto.MetricResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

@Mapper
public interface MetricMapper {

    MetricMapper INSTANCE = Mappers.getMapper(MetricMapper.class);

    @Mapping(target = "events", expression = "java(toEventResponses(metric.getEvents()))")
    MetricResponse entityToResponse(Metric metric);

    @Mapping(target = "eventName", expression = "java(toEventName(metric))")
    @Mapping(target = "eventType", expression = "java(toEventType(metric))")
    @Mapping(target = "metricType", source = "type")
    @Mapping(target = "matcher", expression = "java(toEventMatcher(metric))")
    @Mapping(target = "url", expression = "java(toEventUrl(metric))")
    @Mapping(target = "selector", expression = "java(toEventSelector(metric))")
    MetricConfigResponse entityToConfigResponse(Metric metric);

    @Mapping(target = "events", expression = "java(toEmptyEvents())")
    @Mapping(target = "type", source = "metricType")
    void mapEntity(MetricCreateRequest createRequest, @MappingTarget Metric metric);

    default Set<EventResponse> toEventResponses(Set<Event> events) {
        return events.stream().map(e -> EventMapper.INSTANCE.entityToResponse(e)).collect(Collectors.toSet());
    }

    default Set<Event> toEmptyEvents() {
        return new TreeSet<>();
    }

    default String toEventName(Metric metric) {
        if (CollectionUtils.isEmpty(metric.getEvents())) {
            return null;
        }
        String eventName = "";
        for(Iterator<Event> e=metric.getEvents().iterator(); e.hasNext();) {
            Event event = e.next();
            if (EventTypeEnum.CLICK.equals(event.getType())) {
                return event.getName();
            } else {
                eventName = event.getName();
            }
        }
        return eventName;
    }

    default EventTypeEnum toEventType(Metric metric) {
        if (CollectionUtils.isEmpty(metric.getEvents())) {
            return null;
        }
        EventTypeEnum eventType = EventTypeEnum.CUSTOM;
        for(Iterator<Event> e=metric.getEvents().iterator(); e.hasNext();) {
            Event event = e.next();
            if (EventTypeEnum.CLICK.equals(event.getType())) {
                return event.getType();
            } else {
                eventType = event.getType();
            }
        }
        return eventType;
    }

    default MatcherTypeEnum toEventMatcher(Metric metric) {
        if (CollectionUtils.isEmpty(metric.getEvents())) {
            return null;
        }
        return metric.getEvents().iterator().next().getMatcher();
    }

    default String toEventUrl(Metric metric) {
        if (CollectionUtils.isEmpty(metric.getEvents())) {
            return null;
        }
        return metric.getEvents().iterator().next().getUrl();
    }

    default String toEventSelector(Metric metric) {
        if (CollectionUtils.isEmpty(metric.getEvents())) {
            return null;
        }
        for(Iterator<Event> e=metric.getEvents().iterator(); e.hasNext();)
        {
            Event event = e.next();
            if (EventTypeEnum.CLICK.equals(event.getType())) {
                return event.getSelector();
            }
        }
        return null;
    }
}