Собрать DTO экрана корзины в BFF

11. Собрать DTO экрана корзины в BFF

Условие задачи:
Необходимо реализовать 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() {
        // код тут
    }
}

Спойлеры к решению

Подсказки
💡 Внедри оба Feign-клиента через конструктор.
💡 Получи корзину с помощью getClientCart().
💡 Получи рекомендации с помощью getClientRecommendations().
💡 Объедини результаты в ClientCartScreenDto.

Решение
@Service
public class ClientCartScreenService {

    private final ShoppingCartServiceClient cartClient;
    private final RecommendationsServiceClient recommendationsClient;

    public ClientCartScreenService(
            ShoppingCartServiceClient cartClient,
            RecommendationsServiceClient recommendationsClient
    ) {
        this.cartClient = cartClient;
        this.recommendationsClient = recommendationsClient;
    }

    public ClientCartScreenDto getScreenData() {
        CartDto cart = cartClient.getClientCart();

        List<RecommendationDto> recommendations =
                recommendationsClient.getClientRecommendations();

        return new ClientCartScreenDto(cart, recommendations);
    }
}

BFF вызывает два внешних сервиса и формирует DTO со всеми данными, необходимыми для отображения экрана корзины.