package de.ph87.data.series.consumption; import de.ph87.data.series.consumption.period.Period; import de.ph87.data.series.consumption.unit.Unit; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.ZonedDateTime; import java.util.Optional; @Slf4j @Service @Transactional @RequiredArgsConstructor public class ConsumptionService { private final ConsumptionRepository consumptionRepository; public void onConsumptionEvent(@NonNull final Period period, @NonNull final ConsumptionEvent event) { for (final Unit unit : Unit.values()) { final ZonedDateTime aligned = unit.align(event.getDate()); final Optional existingOptional = consumptionRepository.findByIdPeriodAndIdUnitAndIdAligned(period, unit, aligned); if (existingOptional.isPresent()) { final Consumption existing = existingOptional.get(); existing.setLastDate(event.getDate()); existing.setLastValue(event.getValue()); log.debug("Existing Consumption updated: {}", existing); } else { final Consumption created = consumptionRepository.save(new Consumption(period, unit, aligned, event.getDate(), event.getValue())); log.debug("New Consumption created: created={}", created); } } } }