Merge "Log all incoming HTTP requests to NCMP with Authorization Header"
[cps.git] / cps-ncmp-rest-stub / cps-ncmp-rest-stub-service / src / main / java / org / onap / cps / ncmp / rest / stub / controller / NetworkCmProxyStubController.java
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2022 Bell Canada
4  *  Modifications Copyright (c) 2022-2024 Nordix Foundation
5  *  ================================================================================
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  *
18  *  SPDX-License-Identifier: Apache-2.0
19  *  ============LICENSE_END=========================================================
20  */
21
22 package org.onap.cps.ncmp.rest.stub.controller;
23
24 import com.fasterxml.jackson.databind.ObjectMapper;
25 import jakarta.validation.Valid;
26 import jakarta.validation.constraints.NotNull;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.nio.charset.StandardCharsets;
30 import java.util.Arrays;
31 import java.util.Collections;
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Optional;
36 import java.util.UUID;
37 import lombok.extern.slf4j.Slf4j;
38 import org.onap.cps.ncmp.api.impl.operations.DatastoreType;
39 import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi;
40 import org.onap.cps.ncmp.rest.model.CmHandleQueryParameters;
41 import org.onap.cps.ncmp.rest.model.DataOperationRequest;
42 import org.onap.cps.ncmp.rest.model.RestModuleDefinition;
43 import org.onap.cps.ncmp.rest.model.RestModuleReference;
44 import org.onap.cps.ncmp.rest.model.RestOutputCmHandle;
45 import org.onap.cps.ncmp.rest.model.RestOutputCmHandleCompositeState;
46 import org.onap.cps.ncmp.rest.model.RestOutputCmHandlePublicProperties;
47 import org.onap.cps.ncmp.rest.stub.providers.ResourceProvider;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.http.HttpStatus;
50 import org.springframework.http.ResponseEntity;
51 import org.springframework.web.bind.annotation.RequestMapping;
52 import org.springframework.web.bind.annotation.RestController;
53
54 @Slf4j
55 @RestController
56 @RequestMapping("${rest.api.ncmp-stub-base-path}")
57 public class NetworkCmProxyStubController implements NetworkCmProxyApi {
58
59     @Autowired
60     private ResourceProvider resourceProvider;
61
62     @Autowired
63     private ObjectMapper objectMapper;
64
65     private static final String ASYNC_REQUEST_ID = "requestId";
66
67     @Override
68     public ResponseEntity<Object> getResourceDataForCmHandle(final String datastoreName, final String cmHandle,
69                                                              final String resourceIdentifier,
70                                                              final String optionsParamInQuery,
71                                                              final String topicParamInQuery,
72                                                              final Boolean includeDescendants,
73                                                              final String authorization) {
74         if (DatastoreType.PASSTHROUGH_OPERATIONAL == DatastoreType.fromDatastoreName(datastoreName)) {
75             final ResponseEntity<Map<String, Object>> asyncResponse = populateAsyncResponse(topicParamInQuery);
76             final Map<String, Object> asyncResponseData = asyncResponse.getBody();
77             Object responseObject = null;
78             // read JSON file and map/convert to java POJO
79             try {
80                 final Optional<Object> optionalResponseObject = getResponseObject(
81                         "passthrough-operational-example.json", Object.class);
82                 if (optionalResponseObject.isPresent()) {
83                     responseObject = optionalResponseObject.get();
84                 }
85
86             } catch (final IOException ioException) {
87                 log.error("Error reading the file.", ioException);
88                 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
89             }
90
91             if (asyncResponseData == null) {
92                 return ResponseEntity.ok(responseObject);
93             }
94             return ResponseEntity.ok(asyncResponse);
95         }
96         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
97     }
98
99     @Override
100     public ResponseEntity<List<RestOutputCmHandle>> searchCmHandles(
101             final CmHandleQueryParameters cmHandleQueryParameters) {
102         // read JSON file and map/convert to java POJO
103         try {
104             final Optional<RestOutputCmHandle[]> optionalResponseObject = getResponseObject("cmHandlesSearch.json",
105                     RestOutputCmHandle[].class);
106             if (optionalResponseObject.isPresent()) {
107                 final List<RestOutputCmHandle> restOutputCmHandles = Arrays.asList(optionalResponseObject.get());
108                 return ResponseEntity.ok(restOutputCmHandles);
109             }
110         } catch (final IOException ioException) {
111             log.error("Error reading the file.", ioException);
112             return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
113         }
114
115         return ResponseEntity.ok(Collections.<RestOutputCmHandle>emptyList());
116     }
117
118     private ResponseEntity<Map<String, Object>> populateAsyncResponse(final String topicParamInQuery) {
119         final Map<String, Object> responseData;
120         if (topicParamInQuery == null) {
121             responseData = null;
122         } else {
123             responseData = getAsyncResponseData();
124         }
125         return ResponseEntity.ok().body(responseData);
126     }
127
128     private Map<String, Object> getAsyncResponseData() {
129         final Map<String, Object> asyncResponseData = new HashMap<>(1);
130         final String resourceDataRequestId = UUID.randomUUID().toString();
131         asyncResponseData.put(ASYNC_REQUEST_ID, resourceDataRequestId);
132         return asyncResponseData;
133     }
134
135     private <T> Optional<T> getResponseObject(final String filename, final Class<T> type) throws IOException {
136         final Optional<InputStream> optionalInputStream = resourceProvider.getResourceInputStream(filename);
137         if (optionalInputStream.isPresent()) {
138             final String content = new String(optionalInputStream.get().readAllBytes(), StandardCharsets.UTF_8);
139             return Optional.of(objectMapper.readValue(content, type));
140         }
141         return Optional.empty();
142     }
143
144     @Override
145     public ResponseEntity<Void> createResourceDataRunningForCmHandle(final String datastoreName, final String cmHandle,
146                                                                      @NotNull @Valid final String resourceIdentifier,
147                                                                      @Valid final Object body,
148                                                                      final String contentType,
149                                                                      final String authorization) {
150         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
151     }
152
153     @Override
154     public ResponseEntity<Void> deleteResourceDataRunningForCmHandle(final String datastoreName, final String cmHandle,
155                                                                      @NotNull @Valid final String resourceIdentifier,
156                                                                      final String contentType,
157                                                                      final String authorization) {
158         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
159     }
160
161     @Override
162     public ResponseEntity<RestOutputCmHandlePublicProperties> getCmHandlePublicPropertiesByCmHandleId(
163             final String cmHandle) {
164         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
165     }
166
167     @Override
168     public ResponseEntity<RestOutputCmHandleCompositeState> getCmHandleStateByCmHandleId(final String cmHandle) {
169         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
170     }
171
172     @Override
173     public ResponseEntity<List<RestModuleDefinition>> getModuleDefinitions(final String cmHandleId,
174                                                                            final String moduleName,
175                                                                            final String revision) {
176         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
177     }
178
179     @Override
180     public ResponseEntity<List<RestModuleReference>> getModuleReferencesByCmHandle(final String cmHandle) {
181         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
182     }
183
184     @Override
185     public ResponseEntity<Object> executeDataOperationForCmHandles(final String topicParamInQuery,
186                                                                    final DataOperationRequest dataOperationRequest,
187                                                                    final String authorization) {
188         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
189     }
190
191     @Override
192     public ResponseEntity<Object> patchResourceDataRunningForCmHandle(final String datastoreName, final String cmHandle,
193                                                                       @NotNull @Valid final String resourceIdentifier,
194                                                                       @Valid final Object body,
195                                                                       final String contentType,
196                                                                       final String authorization) {
197         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
198     }
199
200     @Override
201     public ResponseEntity<Object> queryResourceDataForCmHandle(final String datastoreName, final String cmHandle,
202                                                                @Valid final String cpsPath, @Valid final String options,
203                                                                @Valid final String topic,
204                                                                @Valid final Boolean includeDescendants) {
205         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
206     }
207
208     @Override
209     public ResponseEntity<RestOutputCmHandle> retrieveCmHandleDetailsById(final String cmHandle) {
210         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
211
212     }
213
214     @Override
215     public ResponseEntity<List<String>> searchCmHandleIds(@Valid final CmHandleQueryParameters body) {
216         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
217
218     }
219
220     @Override
221     public ResponseEntity<Object> setDataSyncEnabledFlagForCmHandle(final String cmHandle,
222                                                                     @NotNull @Valid final Boolean dataSyncEnabled) {
223         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
224
225     }
226
227     @Override
228     public ResponseEntity<Object> updateResourceDataRunningForCmHandle(final String datastoreName,
229                                                                        final String cmHandle,
230                                                                        @NotNull @Valid final String resourceIdentifier,
231                                                                        @Valid final Object body,
232                                                                        final String contentType,
233                                                                        final String authorization) {
234         return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
235
236     }
237 }