Task Livecoding Java Bff Cart Screen Dto

83. BFF: экран корзины с рекомендациями #

Условие задачи:
📌 Livecoding. Мы с тобой пишем свой стартап. Типо озона. Фишка нашего стартапа будет допродажа. Это когда, я как пользователь вижу новенький айфончик, кидаю его в корзину, перехожу на экран корзины и там вместе с айфоном вижу экран с рекомендациями, что подходит к моему выбранному айфону. Для того, чтобы это осуществить мы строим свой BFF. Наша задача вернуть DTO. Для задачи всегда приходят релевантные данные.

Код:

@FeignClient(name = "cart-service", url = "http://shopping-cart")
public interface ShoppingCartServiceClient {
    @GetMapping("/api/v1/shopping-cart")
    CartDto getClientCart();
}

@FeignClient(name = "recommendations-service", url = "http://recommendations")
public interface RecommendationsServiceClient {
    @GetMapping("/api/v1/recommendations")
    List<RecommendationDto> getClientRecommendations();
}

public record ClientCartScreenDto(CartDto cart, List<RecommendationDto> recommendations) {}

@Service
public class ClientCartScreenService {

    public ClientCartScreenDto getScreenData() {

        // todo: вызвать свои сервисы здесь

        return new ClientCartScreenDto(cart, recommendations);
    }
}
Спойлеры к решению
Подсказки
💡 Внедрите оба Feign-клиента в сервис через конструктор.
💡 Получите cart из ShoppingCartServiceClient#getClientCart().
💡 Получите recommendations из RecommendationsServiceClient#getClientRecommendations().
💡 Верните new ClientCartScreenDto(cart, recommendations).
Решение
@Service
@RequiredArgsConstructor
public class ClientCartScreenService {

    private final ShoppingCartServiceClient cartClient;
    private final RecommendationsServiceClient recommendationsClient;

    public ClientCartScreenDto getScreenData() {
        CartDto cart = cartClient.getClientCart();
        List<RecommendationDto> recommendations = recommendationsClient.getClientRecommendations();
        return new ClientCartScreenDto(cart, recommendations);
    }
}