Skip to content
Snippets Groups Projects
Commit b6c3278f authored by Jakub Janeček's avatar Jakub Janeček
Browse files

Add special HTTP status for unavailability of depending service

parent 96010c66
No related branches found
No related tags found
No related merge requests found
Pipeline #95004 passed
......@@ -6,6 +6,7 @@ import cz.cvut.fel.swa.bookmaker.bookmakerservice.api.dto.BetDto;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.business.BetService;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.OddsClient;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.UserClient;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.exception.ServiceUnavailableException;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.domain.Bet;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
......@@ -16,6 +17,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.media.Content;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
@RestController
@RequiredArgsConstructor
......@@ -29,29 +31,41 @@ public class BetController {
@Operation(summary = "Get all bets", description = "Get all bets for the given user if the user exists")
@ApiResponse(responseCode = "200", description = "List of bets returned")
@ApiResponse(responseCode = "404", description = "User not found", content = @Content)
@ApiResponse(responseCode = "503", description = "Service unavailable", content = @Content)
ResponseEntity<Collection<BetDetailDto>> all(@PathVariable long id) {
if (userClient.getUser(id).isEmpty()) {
return ResponseEntity.notFound().build();
try {
if (userClient.getUser(id).isEmpty()) {
return ResponseEntity.notFound().build();
}
var bets = betService.findAllByUserId(id);
return ResponseEntity.ok().body(BetConverter.fromModels(bets));
} catch (ServiceUnavailableException e) {
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
.header("Retry-After", String.valueOf(TimeUnit.MINUTES.toSeconds(1)))
.build();
}
var bets = betService.findAllByUserId(id);
return ResponseEntity.ok().body(BetConverter.fromModels(bets));
}
@PostMapping("/users/{id}/bets")
@Operation(summary = "Place bet", description = "Place bet for the specified user on the given odds if both the user and odds data are valid.")
@ApiResponse(responseCode = "201", description = "Bet created successfully")
@ApiResponse(responseCode = "404", description = "User or odds not found/valid", content = @Content)
@ApiResponse(responseCode = "503", description = "Service unavailable", content = @Content)
ResponseEntity<?> create(@PathVariable long id, @RequestBody BetDto betDto) {
if (id != betDto.getUserId()
|| userClient.getUser(betDto.getUserId()).isEmpty()
|| oddsClient.getOdds(betDto.getOddsId()).isEmpty()) {
return ResponseEntity.notFound().build();
}
try {
if (id != betDto.getUserId()
|| userClient.getUser(betDto.getUserId()).isEmpty()
|| oddsClient.getOdds(betDto.getOddsId()).isEmpty()) {
return ResponseEntity.notFound().build();
}
Bet bet = BetConverter.toModel(betDto);
betService.create(bet);
Bet bet = BetConverter.toModel(betDto);
betService.create(bet);
return ResponseEntity.status(HttpStatus.CREATED).build();
return ResponseEntity.status(HttpStatus.CREATED).build();
} catch (ServiceUnavailableException e) {
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
.header("Retry-After", String.valueOf(TimeUnit.MINUTES.toSeconds(1)))
.build();
}
}
}
......@@ -2,6 +2,7 @@ package cz.cvut.fel.swa.bookmaker.bookmakerservice.client;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.converter.OddsConverter;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.dto.OddsDto;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.exception.ServiceUnavailableException;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.domain.Odds;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.ServiceInstance;
......@@ -19,10 +20,10 @@ public class OddsClient {
private final LoadBalancerClient loadBalancerClient;
private final WebClient.Builder webClientBuilder;
public Optional<Odds> getOdds(Long id) {
public Optional<Odds> getOdds(Long id) throws ServiceUnavailableException {
ServiceInstance instance = loadBalancerClient.choose("ODDS-SERVICE");
if (instance == null) {
return Optional.empty();
throw new ServiceUnavailableException();
}
String baseUrl = instance.getUri().toString();
......
......@@ -2,6 +2,7 @@ package cz.cvut.fel.swa.bookmaker.bookmakerservice.client;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.converter.UserConverter;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.dto.UserDto;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.client.exception.ServiceUnavailableException;
import cz.cvut.fel.swa.bookmaker.bookmakerservice.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.ServiceInstance;
......@@ -19,10 +20,10 @@ public class UserClient {
private final LoadBalancerClient loadBalancerClient;
private final WebClient.Builder webClientBuilder;
public Optional<User> getUser(Long id) {
public Optional<User> getUser(Long id) throws ServiceUnavailableException {
ServiceInstance instance = loadBalancerClient.choose("USER-SERVICE");
if (instance == null) {
return Optional.empty();
throw new ServiceUnavailableException();
}
String baseUrl = instance.getUri().toString();
......
package cz.cvut.fel.swa.bookmaker.bookmakerservice.client.exception;
public class ServiceUnavailableException extends Exception {
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment