From 517ede01476258ca7c927cde5f88db655857c3c7 Mon Sep 17 00:00:00 2001 From: Fagor Date: Tue, 24 Oct 2023 10:00:26 +0700 Subject: [PATCH] Create api implementation for couple of requests --- .../userservice/api/AbstractApi.java | 69 +++++++++++++++++++ .../directors/userservice/api/DefaultApi.java | 4 +- .../userservice/api/EstablishmentApi.java | 47 ++----------- .../directors/userservice/api/OrderApi.java | 58 ++-------------- .../userservice/service/OrderServiceImpl.java | 31 +++++---- 5 files changed, 101 insertions(+), 108 deletions(-) create mode 100644 src/main/java/ru/nsu/fit/directors/userservice/api/AbstractApi.java diff --git a/src/main/java/ru/nsu/fit/directors/userservice/api/AbstractApi.java b/src/main/java/ru/nsu/fit/directors/userservice/api/AbstractApi.java new file mode 100644 index 0000000..cfb4140 --- /dev/null +++ b/src/main/java/ru/nsu/fit/directors/userservice/api/AbstractApi.java @@ -0,0 +1,69 @@ +package ru.nsu.fit.directors.userservice.api; + +import brave.internal.Nullable; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriBuilder; +import ru.nsu.fit.directors.userservice.dto.response.BaseResponse; +import ru.nsu.fit.directors.userservice.exception.ClientException; +import ru.nsu.fit.directors.userservice.exception.ServerNotAvailableException; + +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +public class AbstractApi implements DefaultApi { + private final WebClient.Builder webClient; + + public AbstractApi(WebClient.Builder webClient) { + this.webClient = webClient; + } + + @Nullable + public T syncGetWithParams(String path, Map params, Class type) { + ParameterizedTypeReference> reference = new ParameterizedTypeReference<>() { + }; + return Optional.ofNullable(webClient.build() + .get() + .uri(path, params) + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .onStatus(HttpStatusCode::is5xxServerError, response -> response.bodyToMono(String.class).map(ServerNotAvailableException::new)) + .toEntity(reference) + .block()) + .map(ResponseEntity::getBody) + .map(BaseResponse::getResult) + .orElse(null); + } + + @Nullable + public List syncListGetWithParams( + Function uriBuilder, + ParameterizedTypeReference>> reference + ) { + return Optional.ofNullable(webClient.build() + .get() + .uri(uriBuilder) + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .onStatus( + HttpStatusCode::is4xxClientError, + response -> response.bodyToMono(BaseResponse.class) + .map(resp -> new ClientException(resp.getException().getMessage())) + ) + .onStatus( + HttpStatusCode::is5xxServerError, + response -> response.bodyToMono(String.class).map(ServerNotAvailableException::new) + ) + .toEntity(reference) + .block()) + .map(ResponseEntity::getBody) + .map(BaseResponse::getResult) + .orElse(null); + } +} diff --git a/src/main/java/ru/nsu/fit/directors/userservice/api/DefaultApi.java b/src/main/java/ru/nsu/fit/directors/userservice/api/DefaultApi.java index 11bf48a..14822cc 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/api/DefaultApi.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/api/DefaultApi.java @@ -1,7 +1,9 @@ package ru.nsu.fit.directors.userservice.api; import brave.internal.Nullable; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.web.util.UriBuilder; +import ru.nsu.fit.directors.userservice.dto.response.BaseResponse; import java.net.URI; import java.util.List; @@ -14,6 +16,6 @@ public interface DefaultApi { T syncGetWithParams(String path, Map params, Class type); @Nullable - List syncListGetWithParams(Function uriBuilder, Class type); + List syncListGetWithParams(Function uriBuilder, ParameterizedTypeReference>> reference); } diff --git a/src/main/java/ru/nsu/fit/directors/userservice/api/EstablishmentApi.java b/src/main/java/ru/nsu/fit/directors/userservice/api/EstablishmentApi.java index 6ef67c8..6ed66e7 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/api/EstablishmentApi.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/api/EstablishmentApi.java @@ -1,52 +1,15 @@ package ru.nsu.fit.directors.userservice.api; -import brave.internal.Nullable; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.util.UriBuilder; -import ru.nsu.fit.directors.userservice.exception.ServerNotAvailableException; - -import java.net.URI; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; @Component -@RequiredArgsConstructor -public class EstablishmentApi implements DefaultApi { - private final WebClient.Builder establishmentClientBuilder; - - @Nullable - public T syncGetWithParams(String path, Map params, Class type) { - return Optional.ofNullable(establishmentClientBuilder.build() - .get() - .uri(path, params) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .onStatus(HttpStatusCode::is5xxServerError, response -> response.bodyToMono(String.class).map(ServerNotAvailableException::new)) - .toEntity(type) - .block()) - .map(ResponseEntity::getBody) - .orElse(null); - } +public class EstablishmentApi extends AbstractApi { - @Nullable - public List syncListGetWithParams(Function uriBuilder, Class type) { - return Optional.ofNullable(establishmentClientBuilder.build() - .get() - .uri(uriBuilder) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .onStatus(HttpStatusCode::is5xxServerError, response -> response.bodyToMono(String.class).map(ServerNotAvailableException::new)) - .toEntityList(type) - .block()) - .map(ResponseEntity::getBody) - .orElse(null); + @Autowired + public EstablishmentApi(WebClient.Builder establishmentClientBuilder) { + super(establishmentClientBuilder); } } diff --git a/src/main/java/ru/nsu/fit/directors/userservice/api/OrderApi.java b/src/main/java/ru/nsu/fit/directors/userservice/api/OrderApi.java index 4e6f8fc..ac3c9ef 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/api/OrderApi.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/api/OrderApi.java @@ -1,61 +1,13 @@ package ru.nsu.fit.directors.userservice.api; -import brave.internal.Nullable; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.util.UriBuilder; -import ru.nsu.fit.directors.userservice.dto.response.BaseResponse; -import ru.nsu.fit.directors.userservice.exception.ClientException; -import ru.nsu.fit.directors.userservice.exception.ServerNotAvailableException; - -import java.net.URI; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; @Component -@RequiredArgsConstructor -public class OrderApi implements DefaultApi { - private final WebClient.Builder orderClientBuilder; - - @Nullable - public T syncGetWithParams(String path, Map params, Class type) { - return Optional.ofNullable(orderClientBuilder.build() - .get() - .uri(path, params) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .onStatus(HttpStatusCode::is5xxServerError, response -> response.bodyToMono(String.class).map(ServerNotAvailableException::new)) - .toEntity(type) - .block()) - .map(ResponseEntity::getBody) - .orElse(null); +public class OrderApi extends AbstractApi { + @Autowired + public OrderApi(WebClient.Builder orderClientBuilder) { + super(orderClientBuilder); } - - @Nullable - public List syncListGetWithParams(Function uriBuilder, Class type) { - return Optional.ofNullable(orderClientBuilder.build() - .get() - .uri(uriBuilder) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .onStatus( - HttpStatusCode::is4xxClientError, - response -> response.bodyToMono(BaseResponse.class).map(resp -> new ClientException(resp.getException().getMessage())) - ) - .onStatus( - HttpStatusCode::is5xxServerError, - response -> response.bodyToMono(String.class).map(ServerNotAvailableException::new) - ) - .toEntityList(type) - .block()) - .map(ResponseEntity::getBody) - .orElse(null); - } - } diff --git a/src/main/java/ru/nsu/fit/directors/userservice/service/OrderServiceImpl.java b/src/main/java/ru/nsu/fit/directors/userservice/service/OrderServiceImpl.java index b410b51..bbc95f8 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/service/OrderServiceImpl.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/service/OrderServiceImpl.java @@ -1,6 +1,7 @@ package ru.nsu.fit.directors.userservice.service; import lombok.RequiredArgsConstructor; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; import ru.nsu.fit.directors.userservice.api.EstablishmentApi; @@ -13,8 +14,10 @@ import ru.nsu.fit.directors.userservice.mapper.OrderMapper; import ru.nsu.fit.directors.userservice.model.User; +import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import java.time.LocalDateTime; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -43,6 +46,7 @@ public void cancelOrder(Long orderId) { } @Override + @Nonnull public List getOrders(Integer status) { User loggedUser = securityService.getLoggedInUser(); return orderApi.syncListGetWithParams( @@ -50,7 +54,7 @@ public List getOrders(Integer status) { .queryParam("userId", loggedUser.getId()) .queryParam("status", status) .build(), - ResponseOrderDto.class + new ParameterizedTypeReference<>() {} ); } @@ -67,19 +71,22 @@ private void validateUserOrder(Long orderId) { } private void validateOrderTime(RequestOrderDto requestOrderDto) { - boolean isOrderTimeNotValid = Optional.ofNullable( - establishmentApi.syncListGetWithParams( - uriBuilder -> uriBuilder.path("/establishment/internal/time") - .queryParam("establishmentId", requestOrderDto.getEstablishmentId()) - .build(), - LocalDateTime.class - ) - ) - .map(times -> !times.contains(requestOrderDto.getDate().atTime(requestOrderDto.getTime()))) - .orElse(true); - if (isOrderTimeNotValid) { + LocalDateTime bookingTime = requestOrderDto.getDate().atTime(requestOrderDto.getTime()); + List validTimes = Optional.of(getValidTimes(requestOrderDto)) + .orElse(Collections.emptyList()); + if (!validTimes.contains(bookingTime)) { throw new OrderBookingTimeException(); } } + + @Nonnull + private List getValidTimes(RequestOrderDto requestOrderDto) { + return establishmentApi.syncListGetWithParams( + uriBuilder -> uriBuilder.path("/establishment/internal/time") + .queryParam("establishmentId", requestOrderDto.getEstablishmentId()) + .build(), + new ParameterizedTypeReference<>() {} + ); + } }