feat: add in-memory repository with concurrent storage

This commit is contained in:
Dek Dalier
2026-08-17 22:37:41 +02:00
parent 01c7458220
commit e6e5cd3422
3 changed files with 47 additions and 16 deletions

View File

@@ -17,7 +17,6 @@ import org.springframework.web.bind.annotation.ResponseStatus;
@RestController @RestController
public class MeasurementController { public class MeasurementController {
private final MeasurementService measurementService; private final MeasurementService measurementService;
MeasurementController(MeasurementService measurementService) { MeasurementController(MeasurementService measurementService) {
@@ -38,7 +37,7 @@ public class MeasurementController {
@PostMapping("/measurements") @PostMapping("/measurements")
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
public Measurement postMeasurement(@RequestBody Measurement measurement) { public Measurement postMeasurement(@RequestBody Measurement measurement) {
return measurement; return measurementService.save(measurement);
} }
} }

View File

@@ -0,0 +1,33 @@
package dev.deklab.sensorapi.repository;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.stereotype.Repository;
import dev.deklab.model.Measurement;
@Repository
public class MeasurementRepository {
private final ConcurrentHashMap<Long, Measurement> store = new ConcurrentHashMap<>();
private final AtomicLong idGenerator = new AtomicLong();
public List<Measurement> findAll() {
return new ArrayList<>(store.values());
}
public Optional<Measurement> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
public Measurement save(Measurement measurement){
Long newId = idGenerator.incrementAndGet();
Measurement saved = new Measurement(newId,measurement.temperature(),measurement.humidity());
store.put(newId, saved);
return saved;
}
}

View File

@@ -6,23 +6,22 @@ import java.util.Optional;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import dev.deklab.model.Measurement; import dev.deklab.model.Measurement;
import dev.deklab.sensorapi.repository.MeasurementRepository;
@Service @Service
public class MeasurementService { public class MeasurementService {
private Measurement m1 = new Measurement(1L, 21.5, 48); private final MeasurementRepository measurementRepository;
private Measurement m2 = new Measurement(2L, 25.5, 38); MeasurementService(MeasurementRepository measurementRepository){
private Measurement m3 = new Measurement(3L, 29.5, 58); this.measurementRepository = measurementRepository;
}
private List<Measurement> measurements = List.of(m1, m2, m3);
public List<Measurement> returnAllMeasurements() { public List<Measurement> returnAllMeasurements() {
return measurements; return measurementRepository.findAll();
} }
public Optional<Measurement> searchById(Long id) { public Optional<Measurement> searchById(Long id) {
for (int i = 0; i < measurements.size(); i++) { return measurementRepository.findById(id);
if (id.equals(measurements.get(i).id())) { }
return Optional.of(measurements.get(i)); public Measurement save(Measurement measurement){
} return measurementRepository.save(measurement);
}
return Optional.empty();
} }
} }