Add DMaaP Integration to retrieve AAI-EVENT
[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.List;
17 import java.util.Optional;
18 import java.util.stream.Collectors;
19 import org.onap.nbi.apis.hub.model.Subscriber;
20 import org.onap.nbi.apis.hub.model.Subscription;
21 import org.onap.nbi.apis.hub.service.CheckDMaaPEventsManager;
22 import org.onap.nbi.apis.hub.service.SubscriptionService;
23 import org.onap.nbi.commons.JsonRepresentation;
24 import org.onap.nbi.commons.MultiCriteriaRequestBuilder;
25 import org.onap.nbi.commons.ResourceManagement;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.data.mongodb.core.MongoTemplate;
30 import org.springframework.data.mongodb.core.query.Query;
31 import org.springframework.http.HttpHeaders;
32 import org.springframework.http.HttpStatus;
33 import org.springframework.http.MediaType;
34 import org.springframework.http.ResponseEntity;
35 import org.springframework.scheduling.annotation.EnableScheduling;
36 import org.springframework.util.MultiValueMap;
37 import org.springframework.web.bind.annotation.DeleteMapping;
38 import org.springframework.web.bind.annotation.GetMapping;
39 import org.springframework.web.bind.annotation.PathVariable;
40 import org.springframework.web.bind.annotation.PostMapping;
41 import org.springframework.web.bind.annotation.RequestBody;
42 import org.springframework.web.bind.annotation.RequestMapping;
43 import org.springframework.web.bind.annotation.RequestParam;
44 import org.springframework.web.bind.annotation.ResponseStatus;
45 import org.springframework.web.bind.annotation.RestController;
46
47 @RestController
48 @RequestMapping("/hub")
49 @EnableScheduling
50 public class HubResource extends ResourceManagement {
51
52   Logger logger = LoggerFactory.getLogger(HubResource.class);
53
54   @Autowired
55   MongoTemplate mongoTemplate;
56
57   @Autowired
58   SubscriptionService subscriptionService;
59
60   @Autowired
61   MultiCriteriaRequestBuilder multiCriteriaRequestBuilder;
62
63   @Autowired
64   CheckDMaaPEventsManager checkDMaaPEventMAnager;
65
66   @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
67   public ResponseEntity<Object> createEventSubscription(@RequestBody Subscription subscription,
68       @RequestParam MultiValueMap<String, String> params) {
69     logger.debug("POST request for subscription : {}", subscription);
70     Subscriber subscriber = subscriptionService.createSubscription(subscription);
71     JsonRepresentation filter = new JsonRepresentation(params);
72     return this.createResponse(Subscription.createFromSubscriber(subscriber), filter);
73
74   }
75
76   @GetMapping(value = "/{subscriptionId}", produces = MediaType.APPLICATION_JSON_VALUE)
77   public ResponseEntity<Subscription> getSubscription(@PathVariable String subscriptionId) {
78
79
80     Optional<Subscriber> optionalSubscriber =
81         subscriptionService.findSubscriptionById(subscriptionId);
82     if (!optionalSubscriber.isPresent()) {
83       return ResponseEntity.notFound().build();
84     }
85     return ResponseEntity.ok(Subscription.createFromSubscriber(optionalSubscriber.get()));
86   }
87
88   @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
89   public ResponseEntity<Object> findSubscribers(
90       @RequestParam MultiValueMap<String, String> params) {
91
92     Query query = multiCriteriaRequestBuilder.buildRequest(params);
93     List<Subscriber> subscribers = mongoTemplate.find(query, Subscriber.class);
94     JsonRepresentation filter = new JsonRepresentation(params);
95     long totalCount = subscriptionService.countSubscription();
96     HttpHeaders headers = new HttpHeaders();
97     headers.add("X-Total-Count", String.valueOf(totalCount));
98     headers.add("X-Result-Count", String.valueOf(subscribers.size()));
99     List<Subscription> subscriptions =
100         subscribers.stream().map(Subscription::createFromSubscriber).collect(Collectors.toList());
101
102     return this.findResponse(subscriptions, filter, headers);
103
104   }
105
106   /*
107    * Resource to test for DMaaP Integration for subscribing to AAI-EVENTs
108    */
109   @GetMapping("/testaaievents")
110   @ResponseStatus(HttpStatus.OK)
111   public void testAAIEventListener() {
112     checkDMaaPEventMAnager.checkForDMaaPAAIEvents();
113   }
114
115   @DeleteMapping("/{subscriptionId}")
116   @ResponseStatus(HttpStatus.NO_CONTENT)
117   public void deleteSubscription(@PathVariable String subscriptionId) {
118     logger.debug("DELETE request for subscription id #{}", subscriptionId);
119     subscriptionService.deleteSubscription(subscriptionId);
120   }
121
122 }