package de.ph87.data.series; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.ZonedDateTime; import java.util.List; @Slf4j @Service @Transactional @RequiredArgsConstructor public class SeriesService { private final SeriesRepository seriesRepository; private final ApplicationEventPublisher applicationEventPublisher; @NonNull public Series getOrCreateByName(@NonNull final String name, @NonNull final SeriesMode mode, @NonNull final ZonedDateTime date, final double value, @NonNull final String unit) { final Series series = seriesRepository.findByNameOrAliasesContains(name, name).orElseGet(() -> seriesRepository.save(new Series(name, mode, date, value, unit))); if (series.getMode() != mode) { throw new RuntimeException("'mode' argument for getOrCreateByName does not match 'mode' of existing Series: mode=%s, series=%s".formatted(mode, series)); } series.update(date, value); final SeriesDto dto = new SeriesDto(series); applicationEventPublisher.publishEvent(dto); return series; } @NonNull public List findAllDto() { return seriesRepository.findAll().stream().map(SeriesDto::new).toList(); } }