Commit 95baeb32 authored by Nikolaos Kyriakoulis's avatar Nikolaos Kyriakoulis
Browse files

Use metrics models for API responses

parent 91af6a7d
Loading
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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
    );

@@ -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")
@@ -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
    );
@@ -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
    );
+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;
@@ -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);
@@ -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);
@@ -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);

@@ -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);

@@ -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) {
+9 −4
Original line number Diff line number Diff line
@@ -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) {