package it.demo.twitterlike.rest.api.impl; import it.demo.twitterlike.rest.api.UserOperations; import it.demo.twitterlike.rest.api.UserProfile; import it.demo.twitterlike.rest.api.util.ResourceUtils; import it.demo.twitterlike.rest.api.util.UserProfileUtils; import java.util.Arrays; import org.springframework.core.ParameterizedTypeReference; import org.springframework.hateoas.Link; import org.springframework.hateoas.PagedResources; import org.springframework.hateoas.Resource; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriTemplate; public class UserTemplate extends AbstractTemplate implements UserOperations { private final ParameterizedTypeReference<Resource<UserProfile>> singleTypeParameter = new ParameterizedTypeReference<Resource<UserProfile>>() { }; private final ParameterizedTypeReference<PagedResources<Resource<UserProfile>>> pagedTypeParameter = new ParameterizedTypeReference<PagedResources<Resource<UserProfile>>>() { }; public UserTemplate(String baseUrl, RestTemplate restTemplate) { super(baseUrl, restTemplate); } public PagedResources<Resource<UserProfile>> findAll(Integer page, Integer size, String sort) { return doFind(pagedTypeParameter, page, size, sort, buildUrl(getBaseContext())); } public PagedResources<Resource<UserProfile>> findAll(Link link) { return doFind(pagedTypeParameter, null, null, null, link.getHref()); } public PagedResources<Resource<UserProfile>> findFollowers(String userId, Integer page, Integer size, String sort) { return doFind(pagedTypeParameter, page, size, sort, new UriTemplate(buildUrl(getBaseContext() + "/{userId}/followers")).expand(userId).toString()); } public PagedResources<Resource<UserProfile>> findMyFollow( Integer page, Integer size, String sort) { return doFind(pagedTypeParameter, page, size, sort,buildUrl(getBaseContext() + "/me/follows")); } public PagedResources<Resource<UserProfile>> findFollow(String userId, Integer page, Integer size, String sort) { return doFind(pagedTypeParameter, page, size, sort, new UriTemplate( buildUrl(getBaseContext() + "/{userId}/follows")) .expand(userId).toString()); } public Resource<UserProfile> getByLink(Link link) { return getByLink(singleTypeParameter, link); } @Override public Resource<UserProfile> getUserProfile() { return getSingleResult(buildUrl(getBaseContext() + "/me"), singleTypeParameter); } public Resource<UserProfile> getUserProfile(String id) { return getById(singleTypeParameter, id); } public void follow(Resource<UserProfile>... users) { follow(ResourceUtils.getContents(users)); } public void follow(UserProfile... users) { follow(Arrays.asList(users)); } public void follow(Iterable<? extends UserProfile> users) { follow(UserProfileUtils.getUserIds(users)); } public void follow(String... users) { restTemplate.postForObject(new UriTemplate(buildUrl(getBaseContext() + "/me/follows/{users}")).expand(users).toString(), null, Void.class); } public void unfollow(String... users) { restTemplate.delete(new UriTemplate(buildUrl(getBaseContext() + "/me/follows/{users}")).expand(users).toString(), null, Void.class); } public void delete(Long id) { restTemplate.delete(buildUrl(getBaseContext() + "/{id}"), id); } @Override protected String getBaseContext() { return "users"; } }