package camelinaction;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* REST service for the recommendation service.
*/
@RestController
@RequestMapping("/api")
@ConfigurationProperties(prefix = "recommend") // inject properties from application.properties using this prefix
public class RecommendController {
private static final Logger LOG = LoggerFactory.getLogger(RecommendController.class);
// these are injected from the application.properties
private String cartUrl;
private String rulesUrl;
private String ratingsUrl;
// use rest template to call external REST service
private final RestTemplate restTemplate = new RestTemplate();
@RequestMapping(value = "recommend", method = RequestMethod.GET, produces = "application/json")
public List<ItemDto> recommend(HttpSession session) {
String id = session.getId();
LOG.info("HTTP session id {}", id);
// get the current item in the shopping cart associated with the HTTP session id
LOG.info("Calling cart service {}", cartUrl);
CartDto[] carts = restTemplate.getForObject(cartUrl, CartDto[].class, id);
String cartIds = cartsToCommaString(carts);
LOG.info("Shopping cart items {}", cartIds);
// call rules service with the items from the shopping cart to get list of items to be recommended
LOG.info("Calling rules service {}", rulesUrl);
ItemDto[] items = restTemplate.getForObject(rulesUrl, ItemDto[].class, id, cartIds);
String itemIds = itemsToCommaString(items);
LOG.info("Inventory items {}", itemIds);
// call rating service
LOG.info("Calling rating service {}", ratingsUrl);
RatingDto[] ratings = restTemplate.getForObject(ratingsUrl, RatingDto[].class, itemIds);
// append ratings to items
for (RatingDto rating : ratings) {
appendRatingToItem(rating, items);
}
return Arrays.asList(items);
}
public String getCartUrl() {
return cartUrl;
}
public void setCartUrl(String cartUrl) {
this.cartUrl = cartUrl;
}
public String getRulesUrl() {
return rulesUrl;
}
public void setRulesUrl(String rulesUrl) {
this.rulesUrl = rulesUrl;
}
public String getRatingsUrl() {
return ratingsUrl;
}
public void setRatingsUrl(String ratingsUrl) {
this.ratingsUrl = ratingsUrl;
}
private void appendRatingToItem(RatingDto rating, ItemDto[] items) {
for (ItemDto item : items) {
if (item.getItemNo() == rating.getItemNo()) {
item.setRating(rating.getRating());
}
}
}
private String cartsToCommaString(CartDto[] carts) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < carts.length; i++) {
CartDto cart = carts[i];
sb.append(cart.getItemId());
if (i < carts.length - 1) {
sb.append(",");
}
}
return sb.toString();
}
private String itemsToCommaString(ItemDto[] items) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < items.length; i++) {
ItemDto item = items[i];
sb.append(item.getItemNo());
if (i < items.length - 1) {
sb.append(",");
}
}
return sb.toString();
}
}