query:1.0.2 - Fixed responses for availability edge-cases
[demos/kafka/wordcount] / src / main / java / de / juplo / kafka / wordcount / query / QueryController.java
1 package de.juplo.kafka.wordcount.query;
2
3 import lombok.RequiredArgsConstructor;
4 import org.apache.kafka.streams.errors.InvalidStateStoreException;
5 import org.springframework.http.HttpStatus;
6 import org.springframework.http.ResponseEntity;
7 import org.springframework.web.bind.annotation.GetMapping;
8 import org.springframework.web.bind.annotation.PathVariable;
9 import org.springframework.web.bind.annotation.RestController;
10
11 import java.net.URI;
12 import java.util.Optional;
13
14
15 @RestController
16 @RequiredArgsConstructor
17 public class QueryController
18 {
19   private final QueryStreamProcessor processor;
20
21   @GetMapping("{username}")
22   ResponseEntity<UserRanking> queryFor(@PathVariable String username)
23   {
24     Optional<URI> redirect = processor.getRedirect(username);
25     if (redirect.isPresent())
26     {
27       return
28           ResponseEntity
29               .status(HttpStatus.TEMPORARY_REDIRECT)
30               .location(redirect.get())
31               .build();
32     }
33
34     try
35     {
36       return ResponseEntity.of(processor.getUserRanking(username));
37     }
38     catch (InvalidStateStoreException e)
39     {
40       return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).build();
41     }
42   }
43 }