ServerSegmentBuilder.java

package io.featureprobe.api.builder;

import io.featureprobe.api.base.model.SegmentRuleModel;
import io.featureprobe.api.base.util.DateTimeTranslateUtil;
import io.featureprobe.api.base.util.JsonMapper;
import com.featureprobe.sdk.server.model.Condition;
import com.featureprobe.sdk.server.model.ConditionType;
import com.featureprobe.sdk.server.model.Segment;
import org.apache.commons.collections4.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class ServerSegmentBuilder {

    private static final String DATETIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";

    private Segment segment;

    private List<SegmentRuleModel> segmentRuleModels;

    public ServerSegmentBuilder builder() {
        this.segment = new Segment();
        return this;
    }

    public ServerSegmentBuilder uniqueId(String uniqueId) {
        this.segment.setUniqueId(uniqueId);
        return this;
    }

    public ServerSegmentBuilder version(Long version) {
        this.segment.setVersion(version);
        return this;
    }

    public ServerSegmentBuilder rules(String rules) {
        this.segmentRuleModels = JsonMapper.toListObject(rules, SegmentRuleModel.class);
        return this;
    }

    public Segment build() {
        this.setRules();
        return this.segment;
    }

    private void setRules() {
        if (CollectionUtils.isEmpty(segmentRuleModels)) {
            segment.setRules(Collections.emptyList());
            return;
        }
        List<com.featureprobe.sdk.server.model.SegmentRule> rules = segmentRuleModels.stream().map(segmentRuleModel ->
                segmentRuleModel.toSegmentRule()).collect(Collectors.toList());
        rules.forEach(rule -> rule.getConditions().forEach(condition -> {
            if (condition.getType() == ConditionType.DATETIME) {
                convertDatetimeToUnix(condition);
            }
        }));
        segment.setRules(rules);
    }

    private void convertDatetimeToUnix(Condition condition) {
        condition.setObjects(condition.getObjects().stream().map(datetime ->
                DateTimeTranslateUtil.translateUnix(datetime, DATETIME_FORMAT_PATTERN)).collect(Collectors.toList()));
    }

}