ToggleControlConfService.java

package io.featureprobe.api.service;

import io.featureprobe.api.dao.entity.Targeting;
import io.featureprobe.api.dao.entity.ToggleControlConf;
import io.featureprobe.api.dao.repository.ToggleControlConfRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Date;

@Slf4j
@AllArgsConstructor
@Service
public class ToggleControlConfService {

    ToggleControlConfRepository toggleControlConfRepository;

    MetricService metricService;

    @PersistenceContext
    public EntityManager entityManager;

    private ToggleControlConf createDefaultByTargeting(Targeting targeting) {
        ToggleControlConf controlConf = new ToggleControlConf();
        controlConf.setProjectKey(targeting.getProjectKey());
        controlConf.setEnvironmentKey(targeting.getEnvironmentKey());
        controlConf.setToggleKey(targeting.getToggleKey());
        controlConf.setTrackAccessEvents(false);
        controlConf.setLastModified(new Date());

        return controlConf;
    }

    public ToggleControlConf queryToggleControlConf(Targeting targeting) {
        ToggleControlConf toggleControlConf = toggleControlConfRepository
                .findByProjectKeyAndEnvironmentKeyAndToggleKey(targeting.getProjectKey(),
                        targeting.getEnvironmentKey(), targeting.getToggleKey())
                .orElse(createDefaultByTargeting(targeting));

        return toggleControlConf;
    }

    @Transactional(rollbackFor = Exception.class)
    public ToggleControlConf updateTrackAccessEvents(Targeting latestTargeting, Boolean trackAccessEvents) {
        ToggleControlConf toggleControlConf = queryToggleControlConf(latestTargeting);
        if (trackAccessEvents != null) {
            if (toggleControlConf.isTrackAccessEvents() == trackAccessEvents.booleanValue()) {
                return toggleControlConf;
            }
            toggleControlConf.setTrackAccessEvents(trackAccessEvents);
            Date now = new Date();
            if (trackAccessEvents) {
                toggleControlConf.setTrackStartTime(now);
                toggleControlConf.setTrackEndTime(null);
            } else {
                toggleControlConf.setTrackEndTime(now);
            }
            metricService.updateMetricIteration(latestTargeting.getProjectKey(), latestTargeting.getEnvironmentKey(),
                    latestTargeting.getToggleKey(), trackAccessEvents, now);
        }
        toggleControlConf.setLastModified(new Date());
        toggleControlConfRepository.save(toggleControlConf);

        return toggleControlConf;
    }
}