package com.greglturnquist.springagram.frontend;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.hateoas.Resource;
import org.springframework.hateoas.mvc.TypeReferences;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class ApplicationControllerHelper {
private static final String QUERY_PROJECTION_OWNER = "?projection=owner";
private final RestTemplate rest = new RestTemplate();
@Value("${springagram.fallbackImageUrl:https://d1fto35gcfffzn.cloudfront.net/images/oss/oss-logo-spring.png}")
private String fallbackImageUrl;
@HystrixCommand(fallbackMethod = "getFallbackImageResource")
public Resource<Item> getImageResourceViaLink(String link, HttpEntity<String> httpEntity) {
String url = link + QUERY_PROJECTION_OWNER;
HttpEntity<?> requestEntity = new HttpEntity<>(httpEntity.getHeaders());
ParameterizedTypeReference<Resource<Item>> typeReference = new TypeReferences.ResourceType<Item>() {};
ResponseEntity<Resource<Item>> resource = rest.exchange(url, HttpMethod.GET, requestEntity, typeReference);
return resource.getBody();
}
public Resource<Item> getFallbackImageResource(String link, HttpEntity<String> httpEntity) {
Item item = new Item();
item.setImage(fallbackImageUrl);
User user = new User();
user.setName("fallback");
user.setRoles(new String[]{});
item.setUser(user);
return new Resource<>(item);
}
}