Loading src/main/java/org/etsi/osl/tmf/metrics/api/MetricsApi.java +8 −4 Original line number Diff line number Diff line Loading @@ -5,6 +5,10 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.etsi.osl.tmf.metrics.ActiveServiceOrders; import org.etsi.osl.tmf.metrics.ServiceOrdersGroupByDay; import org.etsi.osl.tmf.metrics.ServiceOrdersGroupByState; import org.etsi.osl.tmf.metrics.TotalServiceOrders; import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; Loading @@ -29,7 +33,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/totalServiceOrders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Integer>> getTotalServiceOrders( ResponseEntity<TotalServiceOrders> getTotalServiceOrders( @Valid @RequestParam(value = "state", required = false) ServiceOrderStateType state ); Loading @@ -41,7 +45,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/activeServiceOrders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Integer>> getTotalActiveServiceOrders(); ResponseEntity<ActiveServiceOrders> getTotalActiveServiceOrders(); @Operation(summary = "Get service orders grouped by day", operationId = "getServiceOrdersGroupedByDay") Loading @@ -51,7 +55,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/serviceOrdersGroupByDay", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByDay( ResponseEntity<ServiceOrdersGroupByDay> getServiceOrdersGroupedByDay( @Valid @RequestParam(value = "starttime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime starttime, @Valid @RequestParam(value = "endtime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime endtime ); Loading @@ -64,7 +68,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/serviceOrdersGroupByState", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByState( ResponseEntity<ServiceOrdersGroupByState> getServiceOrdersGroupedByState( @Valid @RequestParam(value = "starttime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime starttime, @Valid @RequestParam(value = "endtime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime endtime ); Loading src/main/java/org/etsi/osl/tmf/metrics/api/MetricsApiController.java +25 −41 Original line number Diff line number Diff line package org.etsi.osl.tmf.metrics.api; import org.etsi.osl.tmf.metrics.*; import org.etsi.osl.tmf.metrics.reposervices.MetricsRepoService; import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; import org.slf4j.Logger; Loading Loading @@ -29,11 +30,10 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Integer>> getTotalServiceOrders(ServiceOrderStateType state) { public ResponseEntity<TotalServiceOrders> getTotalServiceOrders(ServiceOrderStateType state) { try { int totalServiceOrders = serviceOrderMetricsRepoService.countTotalServiceOrders(state); Map<String, Integer> response = new HashMap<>(); response.put("totalServiceOrders", totalServiceOrders); TotalServiceOrders response = new TotalServiceOrders(totalServiceOrders); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total service orders. ", e); Loading @@ -42,11 +42,10 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Integer>> getTotalActiveServiceOrders() { public ResponseEntity<ActiveServiceOrders> getTotalActiveServiceOrders() { try { int totalActiveServiceOrders = serviceOrderMetricsRepoService.countTotalActiveServiceOrders(); Map<String, Integer> response = new HashMap<>(); response.put("activeServiceOrders", totalActiveServiceOrders); ActiveServiceOrders response = new ActiveServiceOrders(totalActiveServiceOrders); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total active service orders. ", e); Loading @@ -55,36 +54,29 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { public ResponseEntity<ServiceOrdersGroupByDay> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { try { Map<String, Long> orderDatesGroupedByDate = serviceOrderMetricsRepoService.getServiceOrdersGroupedByDay(starttime, endtime); Map<String, Integer> orderDatesGroupedByDate = serviceOrderMetricsRepoService.getServiceOrdersGroupedByDay(starttime, endtime); // Fill missing days with count 0 Map<String, Long> fullDayMap = new LinkedHashMap<>(); Map<String, Integer> fullDayMap = new LinkedHashMap<>(); OffsetDateTime cursor = starttime.truncatedTo(ChronoUnit.DAYS); OffsetDateTime endDay = endtime.truncatedTo(ChronoUnit.DAYS); while (!cursor.isAfter(endDay)) { String key = cursor.toInstant().toString(); fullDayMap.put(key, orderDatesGroupedByDate.getOrDefault(key, 0L)); fullDayMap.put(key, orderDatesGroupedByDate.getOrDefault(key, 0)); cursor = cursor.plusDays(1); } List<Map<String, Object>> groupByDayList = fullDayMap.entrySet().stream() .map(entry -> { Map<String, Object> dayMap = new HashMap<>(); dayMap.put("key", entry.getKey()); dayMap.put("count", entry.getValue()); return dayMap; }) // Convert to model list List<GroupByItem> groupByDayList = fullDayMap.entrySet().stream() .map(entry -> new GroupByItem(entry.getKey(), entry.getValue())) .toList(); Map<String, Object> aggregations = Map.of("groupByDay", groupByDayList); Map<String, Object> serviceOrders = Map.of( "total", fullDayMap.values().stream().mapToLong(Long::longValue).sum(), "aggregations", aggregations ); Map<String, Object> response = Map.of("serviceOrders", serviceOrders); GroupByDayAggregations aggregations = new GroupByDayAggregations(groupByDayList); int total = fullDayMap.values().stream().mapToInt(Integer::intValue).sum(); ServiceOrdersDay wrapper = new ServiceOrdersDay(total, aggregations); ServiceOrdersGroupByDay response = new ServiceOrdersGroupByDay(wrapper); return new ResponseEntity<>(response, HttpStatus.OK); Loading @@ -95,7 +87,7 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByState(OffsetDateTime starttime, OffsetDateTime endtime) { public ResponseEntity<ServiceOrdersGroupByState> getServiceOrdersGroupedByState(OffsetDateTime starttime, OffsetDateTime endtime) { try { Map<String, Integer> servicesByState = serviceOrderMetricsRepoService.getServiceOrdersGroupedByState(starttime, endtime); Loading @@ -110,25 +102,17 @@ public class MetricsApiController implements MetricsApi { fullStateMap.put(key.toUpperCase(), value); }); // Build groupByState list List<Map<String, Object>> groupByStateList = fullStateMap.entrySet().stream() .map(entry -> { Map<String, Object> map = new HashMap<>(); map.put("key", entry.getKey()); map.put("count", entry.getValue()); return map; }) // Create aggregation items List<GroupByItem> groupByStateList = fullStateMap.entrySet().stream() .map(entry -> new GroupByItem(entry.getKey(), entry.getValue())) .toList(); // Build response structure using models GroupByStateAggregations aggregations = new GroupByStateAggregations(groupByStateList); int total = fullStateMap.values().stream().mapToInt(Integer::intValue).sum(); ServiceOrders services = new ServiceOrders(total, aggregations); ServiceOrdersGroupByState response = new ServiceOrdersGroupByState(services); // Wrap in response structure Map<String, Object> aggregations = Map.of("groupByState", groupByStateList); Map<String, Object> services = Map.of( "total", fullStateMap.values().stream().mapToInt(Integer::intValue).sum(), "aggregations", aggregations ); Map<String, Object> response = Map.of("serviceOrders", services); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { Loading src/main/java/org/etsi/osl/tmf/metrics/reposervices/MetricsRepoService.java +9 −4 Original line number Diff line number Diff line Loading @@ -39,22 +39,27 @@ public class MetricsRepoService { return serviceOrderRepository.countAllActive(currentDate, activeStates); } public Map<String, Long> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { public Map<String, Integer> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { if (starttime.plusDays(31).isBefore(endtime)) { starttime = endtime.minusDays(31); } List<OffsetDateTime> orderDates = serviceOrderRepository.getOrderDatesBetweenDates(starttime, endtime); return orderDates.stream() // First group by day with count as Long Map<String, Long> grouped = orderDates.stream() .map(dt -> dt.truncatedTo(ChronoUnit.DAYS)) // Remove time portion .collect(Collectors.groupingBy( dt -> dt.toInstant().toString(), // Format as ISO string (Z) Collectors.counting() )); // Convert Map<String, Long> to Map<String, Integer> return grouped.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, e -> e.getValue().intValue() )); } public Map<String, Integer> getServiceOrdersGroupedByState(OffsetDateTime starttime, OffsetDateTime endtime) { Loading Loading
src/main/java/org/etsi/osl/tmf/metrics/api/MetricsApi.java +8 −4 Original line number Diff line number Diff line Loading @@ -5,6 +5,10 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.etsi.osl.tmf.metrics.ActiveServiceOrders; import org.etsi.osl.tmf.metrics.ServiceOrdersGroupByDay; import org.etsi.osl.tmf.metrics.ServiceOrdersGroupByState; import org.etsi.osl.tmf.metrics.TotalServiceOrders; import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; Loading @@ -29,7 +33,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/totalServiceOrders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Integer>> getTotalServiceOrders( ResponseEntity<TotalServiceOrders> getTotalServiceOrders( @Valid @RequestParam(value = "state", required = false) ServiceOrderStateType state ); Loading @@ -41,7 +45,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/activeServiceOrders", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Integer>> getTotalActiveServiceOrders(); ResponseEntity<ActiveServiceOrders> getTotalActiveServiceOrders(); @Operation(summary = "Get service orders grouped by day", operationId = "getServiceOrdersGroupedByDay") Loading @@ -51,7 +55,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/serviceOrdersGroupByDay", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByDay( ResponseEntity<ServiceOrdersGroupByDay> getServiceOrdersGroupedByDay( @Valid @RequestParam(value = "starttime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime starttime, @Valid @RequestParam(value = "endtime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime endtime ); Loading @@ -64,7 +68,7 @@ public interface MetricsApi { @ApiResponse(responseCode = "500", description = "Internal Server Error") }) @RequestMapping(value = "/metrics/serviceOrdersGroupByState", method = RequestMethod.GET, produces = "application/json;charset=utf-8") ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByState( ResponseEntity<ServiceOrdersGroupByState> getServiceOrdersGroupedByState( @Valid @RequestParam(value = "starttime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime starttime, @Valid @RequestParam(value = "endtime", required = true) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime endtime ); Loading
src/main/java/org/etsi/osl/tmf/metrics/api/MetricsApiController.java +25 −41 Original line number Diff line number Diff line package org.etsi.osl.tmf.metrics.api; import org.etsi.osl.tmf.metrics.*; import org.etsi.osl.tmf.metrics.reposervices.MetricsRepoService; import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; import org.slf4j.Logger; Loading Loading @@ -29,11 +30,10 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Integer>> getTotalServiceOrders(ServiceOrderStateType state) { public ResponseEntity<TotalServiceOrders> getTotalServiceOrders(ServiceOrderStateType state) { try { int totalServiceOrders = serviceOrderMetricsRepoService.countTotalServiceOrders(state); Map<String, Integer> response = new HashMap<>(); response.put("totalServiceOrders", totalServiceOrders); TotalServiceOrders response = new TotalServiceOrders(totalServiceOrders); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total service orders. ", e); Loading @@ -42,11 +42,10 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Integer>> getTotalActiveServiceOrders() { public ResponseEntity<ActiveServiceOrders> getTotalActiveServiceOrders() { try { int totalActiveServiceOrders = serviceOrderMetricsRepoService.countTotalActiveServiceOrders(); Map<String, Integer> response = new HashMap<>(); response.put("activeServiceOrders", totalActiveServiceOrders); ActiveServiceOrders response = new ActiveServiceOrders(totalActiveServiceOrders); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { log.error("Couldn't retrieve total active service orders. ", e); Loading @@ -55,36 +54,29 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { public ResponseEntity<ServiceOrdersGroupByDay> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { try { Map<String, Long> orderDatesGroupedByDate = serviceOrderMetricsRepoService.getServiceOrdersGroupedByDay(starttime, endtime); Map<String, Integer> orderDatesGroupedByDate = serviceOrderMetricsRepoService.getServiceOrdersGroupedByDay(starttime, endtime); // Fill missing days with count 0 Map<String, Long> fullDayMap = new LinkedHashMap<>(); Map<String, Integer> fullDayMap = new LinkedHashMap<>(); OffsetDateTime cursor = starttime.truncatedTo(ChronoUnit.DAYS); OffsetDateTime endDay = endtime.truncatedTo(ChronoUnit.DAYS); while (!cursor.isAfter(endDay)) { String key = cursor.toInstant().toString(); fullDayMap.put(key, orderDatesGroupedByDate.getOrDefault(key, 0L)); fullDayMap.put(key, orderDatesGroupedByDate.getOrDefault(key, 0)); cursor = cursor.plusDays(1); } List<Map<String, Object>> groupByDayList = fullDayMap.entrySet().stream() .map(entry -> { Map<String, Object> dayMap = new HashMap<>(); dayMap.put("key", entry.getKey()); dayMap.put("count", entry.getValue()); return dayMap; }) // Convert to model list List<GroupByItem> groupByDayList = fullDayMap.entrySet().stream() .map(entry -> new GroupByItem(entry.getKey(), entry.getValue())) .toList(); Map<String, Object> aggregations = Map.of("groupByDay", groupByDayList); Map<String, Object> serviceOrders = Map.of( "total", fullDayMap.values().stream().mapToLong(Long::longValue).sum(), "aggregations", aggregations ); Map<String, Object> response = Map.of("serviceOrders", serviceOrders); GroupByDayAggregations aggregations = new GroupByDayAggregations(groupByDayList); int total = fullDayMap.values().stream().mapToInt(Integer::intValue).sum(); ServiceOrdersDay wrapper = new ServiceOrdersDay(total, aggregations); ServiceOrdersGroupByDay response = new ServiceOrdersGroupByDay(wrapper); return new ResponseEntity<>(response, HttpStatus.OK); Loading @@ -95,7 +87,7 @@ public class MetricsApiController implements MetricsApi { } @Override public ResponseEntity<Map<String, Object>> getServiceOrdersGroupedByState(OffsetDateTime starttime, OffsetDateTime endtime) { public ResponseEntity<ServiceOrdersGroupByState> getServiceOrdersGroupedByState(OffsetDateTime starttime, OffsetDateTime endtime) { try { Map<String, Integer> servicesByState = serviceOrderMetricsRepoService.getServiceOrdersGroupedByState(starttime, endtime); Loading @@ -110,25 +102,17 @@ public class MetricsApiController implements MetricsApi { fullStateMap.put(key.toUpperCase(), value); }); // Build groupByState list List<Map<String, Object>> groupByStateList = fullStateMap.entrySet().stream() .map(entry -> { Map<String, Object> map = new HashMap<>(); map.put("key", entry.getKey()); map.put("count", entry.getValue()); return map; }) // Create aggregation items List<GroupByItem> groupByStateList = fullStateMap.entrySet().stream() .map(entry -> new GroupByItem(entry.getKey(), entry.getValue())) .toList(); // Build response structure using models GroupByStateAggregations aggregations = new GroupByStateAggregations(groupByStateList); int total = fullStateMap.values().stream().mapToInt(Integer::intValue).sum(); ServiceOrders services = new ServiceOrders(total, aggregations); ServiceOrdersGroupByState response = new ServiceOrdersGroupByState(services); // Wrap in response structure Map<String, Object> aggregations = Map.of("groupByState", groupByStateList); Map<String, Object> services = Map.of( "total", fullStateMap.values().stream().mapToInt(Integer::intValue).sum(), "aggregations", aggregations ); Map<String, Object> response = Map.of("serviceOrders", services); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { Loading
src/main/java/org/etsi/osl/tmf/metrics/reposervices/MetricsRepoService.java +9 −4 Original line number Diff line number Diff line Loading @@ -39,22 +39,27 @@ public class MetricsRepoService { return serviceOrderRepository.countAllActive(currentDate, activeStates); } public Map<String, Long> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { public Map<String, Integer> getServiceOrdersGroupedByDay(OffsetDateTime starttime, OffsetDateTime endtime) { if (starttime.plusDays(31).isBefore(endtime)) { starttime = endtime.minusDays(31); } List<OffsetDateTime> orderDates = serviceOrderRepository.getOrderDatesBetweenDates(starttime, endtime); return orderDates.stream() // First group by day with count as Long Map<String, Long> grouped = orderDates.stream() .map(dt -> dt.truncatedTo(ChronoUnit.DAYS)) // Remove time portion .collect(Collectors.groupingBy( dt -> dt.toInstant().toString(), // Format as ISO string (Z) Collectors.counting() )); // Convert Map<String, Long> to Map<String, Integer> return grouped.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, e -> e.getValue().intValue() )); } public Map<String, Integer> getServiceOrdersGroupedByState(OffsetDateTime starttime, OffsetDateTime endtime) { Loading