SegmentMapper.java

package io.featureprobe.api.mapper;

import io.featureprobe.api.dto.SegmentCreateRequest;
import io.featureprobe.api.dto.SegmentPublishRequest;
import io.featureprobe.api.dto.SegmentResponse;
import io.featureprobe.api.dto.SegmentUpdateRequest;
import io.featureprobe.api.dto.ToggleSegmentResponse;
import io.featureprobe.api.dao.entity.Segment;
import io.featureprobe.api.dao.entity.Toggle;
import io.featureprobe.api.base.model.SegmentRuleModel;
import io.featureprobe.api.base.util.JsonMapper;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.BeanMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.factory.Mappers;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;

@Mapper
public interface SegmentMapper extends BaseMapper {

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

    Segment requestToEntity(SegmentCreateRequest createRequest);

    @Mapping(target = "rules", expression = "java(toSegmentRules(segment.getRules()))")
    @Mapping(target = "modifiedBy", expression = "java(getAccount(segment.getModifiedBy()))")
    SegmentResponse entityToResponse(Segment segment);

    ToggleSegmentResponse toggleToToggleSegment(Toggle toggle);

    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    void mapEntity(SegmentUpdateRequest updateRequest, @MappingTarget Segment segment);

    @Mapping(target = "rules", expression = "java(toSegmentRulesString(publishRequest.getRules()))")
    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    void mapEntity(SegmentPublishRequest publishRequest, @MappingTarget Segment segment);

    default String toSegmentRulesString(List<SegmentRuleModel> rules) {
        if (!CollectionUtils.isEmpty(rules)) {
            return JsonMapper.toJSONString(rules);
        }
        return toDefaultSegmentRulesString();
    }

    default List<SegmentRuleModel> toSegmentRules(String rules) {
        if (StringUtils.isNotBlank(rules)) {
            return JsonMapper.toObject(rules, List.class);
        }
        return toDefaultSegmentRules();
    }

    default String toDefaultSegmentRulesString() {
        return JsonMapper.toJSONString(Collections.emptyList());
    }

    default List<SegmentRuleModel> toDefaultSegmentRules() {
        return Collections.emptyList();
    }

}