Merge "Fix: Update OpenSSF Scorecard to RelEng reusable"
[cps.git] / cps-rest / src / main / java / org / onap / cps / rest / controller / QueryRestController.java
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2025 Nordix Foundation
4  *  Modifications Copyright (C) 2022 Bell Canada.
5  *  Modifications Copyright (C) 2022-2024 TechMahindra Ltd.
6  *  ================================================================================
7  *  Licensed under the Apache License, Version 2.0 (the "License");
8  *  you may not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  *
11  *        http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS,
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  *
19  *  SPDX-License-Identifier: Apache-2.0
20  *  ============LICENSE_END=========================================================
21  */
22
23 package org.onap.cps.rest.controller;
24
25 import io.micrometer.core.annotation.Timed;
26 import java.util.List;
27 import java.util.Map;
28 import lombok.RequiredArgsConstructor;
29 import org.onap.cps.api.CpsFacade;
30 import org.onap.cps.api.parameters.FetchDescendantsOption;
31 import org.onap.cps.api.parameters.PaginationOption;
32 import org.onap.cps.rest.api.CpsQueryApi;
33 import org.onap.cps.utils.ContentType;
34 import org.onap.cps.utils.JsonObjectMapper;
35 import org.onap.cps.utils.XmlFileUtils;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.ResponseEntity;
38 import org.springframework.web.bind.annotation.RequestMapping;
39 import org.springframework.web.bind.annotation.RestController;
40
41 @RestController
42 @RequestMapping("${rest.api.cps-base-path}")
43 @RequiredArgsConstructor
44 public class QueryRestController implements CpsQueryApi {
45
46     private final CpsFacade cpsFacade;
47     private final JsonObjectMapper jsonObjectMapper;
48
49     @Override
50     @Timed(value = "cps.data.controller.datanode.query.v1", description = "Time taken to query data nodes")
51     public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPath(final String dataspaceName,
52                                                                          final String anchorName,
53                                                                          final String cpsPath,
54                                                                          final Boolean includeDescendants) {
55         final FetchDescendantsOption fetchDescendantsOption =
56             FetchDescendantsOption.getFetchDescendantsOption(includeDescendants);
57         final List<Map<String, Object>> dataNodesAsMaps
58             = cpsFacade.executeAnchorQuery(dataspaceName, anchorName, cpsPath, fetchDescendantsOption);
59         return buildResponseEntity(dataNodesAsMaps, ContentType.JSON);
60     }
61
62     @Override
63     @Timed(value = "cps.data.controller.datanode.query.v2", description = "Time taken to query data nodes")
64     public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPathV2(final String dataspaceName,
65                                                                            final String anchorName,
66                                                                            final String cpsPath,
67                                                                            final String fetchDescendantsOptionAsString,
68                                                                            final String contentTypeInHeader) {
69         final ContentType contentType = ContentType.fromString(contentTypeInHeader);
70         final FetchDescendantsOption fetchDescendantsOption =
71             FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString);
72         final List<Map<String, Object>> dataNodesAsMaps
73             = cpsFacade.executeAnchorQuery(dataspaceName, anchorName, cpsPath, fetchDescendantsOption);
74         return buildResponseEntity(dataNodesAsMaps, contentType);
75     }
76
77     @Override
78     @Timed(value = "cps.data.controller.datanode.query.across.anchors",
79             description = "Time taken to query data nodes across anchors")
80     public ResponseEntity<Object> getNodesByDataspaceAndCpsPath(final String dataspaceName,
81                                                                 final String cpsPath,
82                                                                 final String fetchDescendantsOptionAsString,
83                                                                 final Integer pageIndex,
84                                                                 final Integer pageSize) {
85         final FetchDescendantsOption fetchDescendantsOption =
86                 FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString);
87         final PaginationOption paginationOption = (pageIndex == null || pageSize == null)
88                 ? PaginationOption.NO_PAGINATION : new PaginationOption(pageIndex, pageSize);
89         final List<Map<String, Object>> dataNodesAsMaps
90             = cpsFacade.executeDataspaceQuery(dataspaceName, cpsPath, fetchDescendantsOption, paginationOption);
91
92         final int totalPages = cpsFacade.countAnchorsInDataspaceQuery(dataspaceName, cpsPath, paginationOption);
93         return ResponseEntity.ok().header("total-pages", String.valueOf(totalPages))
94                 .body(jsonObjectMapper.asJsonString(dataNodesAsMaps));
95     }
96
97     private ResponseEntity<Object> buildResponseEntity(final List<Map<String, Object>> dataNodesAsMaps,
98                                                final ContentType contentType) {
99         final String responseData;
100         if (ContentType.XML.equals(contentType)) {
101             responseData = XmlFileUtils.convertDataMapsToXml(dataNodesAsMaps);
102         } else {
103             responseData = jsonObjectMapper.asJsonString(dataNodesAsMaps);
104         }
105         return new ResponseEntity<>(responseData, HttpStatus.OK);
106     }
107 }