GraphsController.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.provectus.kafka.ui.controller;
  2. import com.provectus.kafka.ui.api.GraphsApi;
  3. import com.provectus.kafka.ui.model.GraphDataRequestDTO;
  4. import com.provectus.kafka.ui.model.GraphDescriptionDTO;
  5. import com.provectus.kafka.ui.model.GraphDescriptionsDTO;
  6. import com.provectus.kafka.ui.model.GraphParameterDTO;
  7. import com.provectus.kafka.ui.model.PrometheusApiQueryResponseDTO;
  8. import com.provectus.kafka.ui.model.rbac.AccessContext;
  9. import com.provectus.kafka.ui.service.graphs.GraphDescription;
  10. import com.provectus.kafka.ui.service.graphs.GraphsService;
  11. import java.time.Duration;
  12. import java.time.OffsetDateTime;
  13. import java.util.Optional;
  14. import lombok.RequiredArgsConstructor;
  15. import org.mapstruct.Mapper;
  16. import org.mapstruct.factory.Mappers;
  17. import org.springframework.http.ResponseEntity;
  18. import org.springframework.web.bind.annotation.RestController;
  19. import org.springframework.web.server.ServerWebExchange;
  20. import prometheus.query.model.QueryResponse;
  21. import reactor.core.publisher.Mono;
  22. @RestController
  23. @RequiredArgsConstructor
  24. public class GraphsController extends AbstractController implements GraphsApi {
  25. private static final PrometheusApiMapper MAPPER = Mappers.getMapper(PrometheusApiMapper.class);
  26. @Mapper
  27. interface PrometheusApiMapper {
  28. PrometheusApiQueryResponseDTO fromClientResponse(QueryResponse resp);
  29. }
  30. private final GraphsService graphsService;
  31. @Override
  32. public Mono<ResponseEntity<PrometheusApiQueryResponseDTO>> getGraphData(String clusterName,
  33. Mono<GraphDataRequestDTO> graphDataRequestDto,
  34. ServerWebExchange exchange) {
  35. var context = AccessContext.builder()
  36. .cluster(clusterName)
  37. .operationName("getGraphData")
  38. .build();
  39. return accessControlService.validateAccess(context)
  40. .then(
  41. graphDataRequestDto.flatMap(req ->
  42. graphsService.getGraphData(
  43. getCluster(clusterName),
  44. req.getId(),
  45. Optional.ofNullable(req.getFrom()).map(OffsetDateTime::toInstant).orElse(null),
  46. Optional.ofNullable(req.getTo()).map(OffsetDateTime::toInstant).orElse(null),
  47. req.getParameters()
  48. ).map(MAPPER::fromClientResponse))
  49. .map(ResponseEntity::ok)
  50. ).doOnEach(sig -> auditService.audit(context, sig));
  51. }
  52. @Override
  53. public Mono<ResponseEntity<GraphDescriptionsDTO>> getGraphsList(String clusterName,
  54. ServerWebExchange exchange) {
  55. var context = AccessContext.builder()
  56. .cluster(clusterName)
  57. .operationName("getGraphsList")
  58. .build();
  59. var graphs = graphsService.getGraphs(getCluster(clusterName));
  60. return accessControlService.validateAccess(context).then(
  61. Mono.just(ResponseEntity.ok(new GraphDescriptionsDTO().graphs(graphs.map(this::map).toList()))));
  62. }
  63. private GraphDescriptionDTO map(GraphDescription graph) {
  64. return new GraphDescriptionDTO(graph.id())
  65. .defaultPeriod(Optional.ofNullable(graph.defaultInterval()).map(Duration::toString).orElse(null))
  66. .type(graph.isRange() ? GraphDescriptionDTO.TypeEnum.RANGE : GraphDescriptionDTO.TypeEnum.INSTANT)
  67. .parameters(graph.params().stream().map(GraphParameterDTO::new).toList());
  68. }
  69. }