3f14b8a4454415b4b96c046a69c448138814e1c3
[externalapi/nbi.git] / src / main / java / org / onap / nbi / apis / hub / HubResource.java
1 /**
2  * Copyright (c) 2018 Orange
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 package org.onap.nbi.apis.hub;
15
16 import java.util.LinkedHashMap;
17 import java.util.List;
18 import java.util.Optional;
19 import java.util.stream.Collectors;
20 import org.onap.nbi.OnapComponentsUrlPaths;
21 import org.onap.nbi.apis.hub.model.Subscriber;
22 import org.onap.nbi.apis.hub.model.Subscription;
23 import org.onap.nbi.apis.hub.service.dmaap.CheckDMaaPEventsManager;
24 import org.onap.nbi.apis.hub.service.SubscriptionService;
25 import org.onap.nbi.commons.EWInterfaceUtils;
26 import org.onap.nbi.commons.JsonRepresentation;
27 import org.onap.nbi.commons.MultiCriteriaRequestBuilder;
28 import org.onap.nbi.commons.ResourceManagement;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 import org.springframework.beans.factory.annotation.Autowired;
32 import org.springframework.beans.factory.annotation.Value;
33 import org.springframework.data.mongodb.core.MongoTemplate;
34 import org.springframework.data.mongodb.core.query.Query;
35 import org.springframework.http.HttpHeaders;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.MediaType;
38 import org.springframework.http.ResponseEntity;
39 import org.springframework.scheduling.annotation.EnableScheduling;
40 import org.springframework.util.MultiValueMap;
41 import org.springframework.web.bind.annotation.DeleteMapping;
42 import org.springframework.web.bind.annotation.GetMapping;
43 import org.springframework.web.bind.annotation.PathVariable;
44 import org.springframework.web.bind.annotation.PostMapping;
45 import org.springframework.web.bind.annotation.RequestBody;
46 import org.springframework.web.bind.annotation.RequestHeader;
47 import org.springframework.web.bind.annotation.RequestMapping;
48 import org.springframework.web.bind.annotation.RequestParam;
49 import org.springframework.web.bind.annotation.ResponseStatus;
50 import org.springframework.web.bind.annotation.RestController;
51
52 @RestController
53 @RequestMapping(OnapComponentsUrlPaths.HUB_PATH)
54 @EnableScheduling
55 public class HubResource extends ResourceManagement {
56
57   Logger logger = LoggerFactory.getLogger(HubResource.class);
58
59   @Autowired
60   MongoTemplate mongoTemplate;
61
62   @Autowired
63   SubscriptionService subscriptionService;
64
65   @Autowired
66   MultiCriteriaRequestBuilder multiCriteriaRequestBuilder;
67
68   @Autowired
69   CheckDMaaPEventsManager checkDMaaPEventMAnager;
70
71   @Autowired
72   EWInterfaceUtils ewInterfaceUtils;
73
74   @Value("${nbi.public.url}")
75   private String nbiPublicUrl;
76
77   @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
78   public ResponseEntity<Object> createEventSubscription(@RequestBody Subscription subscription,
79       @RequestParam MultiValueMap<String, String> params, @RequestHeader(value="Target",required = false)String targetUrl) {
80     logger.debug("POST request for subscription : {}", subscription);
81     if (targetUrl != null) {
82       targetUrl = targetUrl + OnapComponentsUrlPaths.HUB_PATH;
83       String originalCallback = subscription.getCallback();
84       subscription.setCallback(nbiPublicUrl + OnapComponentsUrlPaths.LISTENER_PATH);
85       ResponseEntity ewResponse = ewInterfaceUtils.callPostRequestTarget(subscription, targetUrl);
86       if (ewResponse.getStatusCode() == HttpStatus.CREATED) {
87         subscription.setCallback(originalCallback);
88        subscription.setEwHost(targetUrl);
89        subscription.setEwId(((LinkedHashMap)ewResponse.getBody()).get( "id" ).toString());
90       } else {
91         return ewResponse;
92       }
93     }
94     Subscriber subscriber = subscriptionService.createSubscription(subscription);
95     JsonRepresentation filter = new JsonRepresentation(params);
96     return this.createResponse(Subscription.createFromSubscriber(subscriber), filter);
97
98   }
99
100   @GetMapping(value = "/{subscriptionId}", produces = MediaType.APPLICATION_JSON_VALUE)
101   public ResponseEntity<Subscription> getSubscription(@PathVariable String subscriptionId) {
102
103
104     Optional<Subscriber> optionalSubscriber =
105         subscriptionService.findSubscriptionById(subscriptionId);
106     if (!optionalSubscriber.isPresent()) {
107       return ResponseEntity.notFound().build();
108     }
109     return ResponseEntity.ok(Subscription.createFromSubscriber(optionalSubscriber.get()));
110   }
111
112   @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
113   public ResponseEntity<Object> findSubscribers(
114       @RequestParam MultiValueMap<String, String> params) {
115
116     Query query = multiCriteriaRequestBuilder.buildRequest(params);
117     List<Subscriber> subscribers = mongoTemplate.find(query, Subscriber.class);
118     JsonRepresentation filter = new JsonRepresentation(params);
119     long totalCount = subscriptionService.countSubscription();
120     HttpHeaders headers = new HttpHeaders();
121     headers.add("X-Total-Count", String.valueOf(totalCount));
122     headers.add("X-Result-Count", String.valueOf(subscribers.size()));
123     List<Subscription> subscriptions =
124         subscribers.stream().map(Subscription::createFromSubscriber).collect(Collectors.toList());
125
126     return this.findResponse(subscriptions, filter, headers);
127
128   }
129
130   /*
131    * Resource to test for DMaaP Integration for subscribing to AAI-EVENTs
132    */
133   @GetMapping("/testaaievents")
134   @ResponseStatus(HttpStatus.OK)
135   public void testAAIEventListener() {
136     checkDMaaPEventMAnager.checkForDMaaPAAIEvents();
137   }
138
139   @DeleteMapping("/{subscriptionId}")
140   @ResponseStatus(HttpStatus.NO_CONTENT)
141   public void deleteSubscription(@PathVariable String subscriptionId) {
142     logger.debug("DELETE request for subscription id #{}", subscriptionId);
143     Optional<Subscriber> optionalSubscriber= subscriptionService.findSubscriptionById(subscriptionId);
144     subscriptionService.deleteSubscription(subscriptionId);
145     String ewHost=optionalSubscriber.get().getEwHost();
146     String ewId=optionalSubscriber.get().getEwId();
147     logger.info("POST delete for ewHost : {}", ewHost);
148     logger.info("POST delete for ewId : {}", ewId);
149     if ( ewHost !=null && ewId !=null )
150     {
151       logger.info("POST deleteIF for ewHost : {}", ewHost);
152       String targetUrl = ewHost+ "/" + ewId;
153       ewInterfaceUtils.callDeleteRequestTarget(targetUrl);
154       logger.info("POST deleteIF for ewHost is : {}", targetUrl);
155     }
156   }
157
158 }