package com.springsource.myrestaurants.dao; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.web.client.RestTemplate; import com.springsource.myrestaurants.config.CouchDbConfig; import com.springsource.myrestaurants.models.Restaurant; import com.springsource.myrestaurants.models.UserAccount; public class UserAccountDao { protected final Logger logger = LoggerFactory.getLogger(getClass()); private RestTemplate restTemplate; public UserAccountDao() { restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); converters.add(new MappingJacksonHttpMessageConverter()); restTemplate.setMessageConverters(converters); } public UserAccount findUserAccount(Long id) { if (id == null) return null; return (UserAccount) restTemplate.getForObject(CouchDbConfig.URL + "demouser", UserAccount.class); } public UserAccount findByName(String name) { if (name == null) return null; return (UserAccount) restTemplate.getForObject(CouchDbConfig.URL + "demouser", UserAccount.class); } public void persist(UserAccount userAccount) { // Note only 1 user in couchdb version for now restTemplate.put(CouchDbConfig.URL + "demouser", userAccount); userAccount.setRevision(((UserAccount) restTemplate.getForObject( CouchDbConfig.URL + "demouser", UserAccount.class)) .getRevision()); } public boolean addToFavorites(UserAccount u, Restaurant r) { UserAccount user = (UserAccount) restTemplate.getForObject(CouchDbConfig.URL + "demouser", UserAccount.class); if (user != null && r != null) { if (!user.getFavorites().contains(r.getId())) { user.getFavorites().add(r.getId()); persist(user); logger.debug("Added " + r.getId() + "to favorites for user = " + user.getUserName()); return true; } else { logger.debug("Already present in list"); return true; } } logger.debug("Could not find user = demouser"); return false; } public boolean removeFromFavorites(UserAccount u, Restaurant r) { UserAccount user = (UserAccount) restTemplate.getForObject(CouchDbConfig.URL + "demouser", UserAccount.class); if (user != null && r != null) { if (!user.getFavorites().contains(r.getId())) { logger.debug(r.getName() + ", Not present in list"); logger.debug("fav list = " + user.getFavorites()); return true; } else { user.getFavorites().remove(r.getId()); persist(user); logger.debug("Removed " + r.getId() + "from favorites for user = " + user.getUserName()); return true; } } logger.debug("Could not find user = demouser"); return false; } public List<String> getFavoriteRestaurantsIds(UserAccount u) { UserAccount user = (UserAccount) restTemplate.getForObject(CouchDbConfig.URL + "demouser", UserAccount.class); if (user != null) { return user.getFavorites(); } else { logger.debug("Could not find user = demouser"); } return new ArrayList<String>(); } public UserAccount merge(UserAccount userAccount) { restTemplate.put(CouchDbConfig.URL + "demouser", userAccount); return (UserAccount) restTemplate.getForObject(CouchDbConfig.URL + "demouser", UserAccount.class); } }