package org.podcastpedia.web.startpage;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.podcastpedia.common.domain.Episode;
import org.podcastpedia.common.domain.Podcast;
import org.podcastpedia.common.types.LanguageCode;
import org.podcastpedia.web.episodes.EpisodeDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
/**
* This class implements the PodcastService interface to offer the database functionality when adding podcasts
*
*/
public class StartPageServiceImpl implements StartPageService {
private static final Integer NUMBER_OF_PODCASTS_IN_CHART = 5;
@Autowired
private EpisodeDao episodeDao;
@Autowired
private StartPageDao startPageDao;
@Cacheable(value="newestAndRecommendedPodcasts", key="#root.method.name")
public List<Podcast> getLastUpdatedPodcasts() {
List<Podcast> newestPodcasts = startPageDao.getLastUpdatedPodcasts(NUMBER_OF_PODCASTS_IN_CHART);
for(Podcast p : newestPodcasts) {
Episode lastEpisode = getLastEpisodeForPodcast(p);
p.setLastEpisode(lastEpisode);
}
return newestPodcasts;
}
@Cacheable(value="newestAndRecommendedPodcasts", key="#root.method.name")
public List<Podcast> getNewEntries() {
List<Podcast> newEntries = startPageDao.getNewEntries(NUMBER_OF_PODCASTS_IN_CHART);
for(Podcast p : newEntries) {
Episode lastEpisode = getLastEpisodeForPodcast(p);
p.setLastEpisode(lastEpisode);
}
return newEntries;
}
@Cacheable(value="newestAndRecommendedPodcasts", key="T(java.lang.String).valueOf(#languageCode.code).concat('-').concat(#root.method.name)")
public List<Podcast> getLastUpdatedPodcasts(LanguageCode languageCode) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("lang", languageCode);
params.put("limit", NUMBER_OF_PODCASTS_IN_CHART);
List<Podcast> newestPodcasts = startPageDao.getLastUpdatedPodcastsWithLanguage(params);
for(Podcast p : newestPodcasts) {
Episode lastEpisode = getLastEpisodeForPodcast(p);
p.setLastEpisode(lastEpisode);
}
return newestPodcasts;
}
@Cacheable(value="newestAndRecommendedPodcasts", key="#root.method.name")
public List<Podcast> getRecommendedPodcasts() {
List<Podcast> recommendedPodcasts = startPageDao.getRecommendedPodcasts(NUMBER_OF_PODCASTS_IN_CHART);
for(Podcast p : recommendedPodcasts) {
Episode lastEpisode = getLastEpisodeForPodcast(p);
p.setLastEpisode(lastEpisode);
}
return recommendedPodcasts;
}
/**
* Returns the top rated podcasts - TODO should I hold this also in memory ????
*/
@Cacheable(value="randomAndTopRatedPodcasts", key="#root.method.name")
public List<Podcast> getTopRatedPodcasts(Integer numberOfPodcasts) {
List<Podcast> response = startPageDao.getTopRatedPodcasts(numberOfPodcasts);
for(Podcast p : response){
p.setLastEpisode(getLastEpisodeForPodcast(p));
}
return response;
}
private Episode getLastEpisodeForPodcast(Podcast p) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("podcastId", p.getPodcastId());
params.put("count", 1);
List<Episode> response = episodeDao.getEpisodesForPodcastId(params);
return response.get(0);
}
@Cacheable(value="randomAndTopRatedPodcasts", key="T(java.lang.String).valueOf(#languageCode.code).concat('-').concat(#root.method.name)")
public List<Podcast> getTopRatedPodcastsWithLanguage(LanguageCode languageCode, int numberOfResults) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("languageCode", languageCode);
params.put("numberOfResults", numberOfResults);
List<Podcast> podcasts= startPageDao.getTopRatedPodcastsWithLanguage(params);
for(Podcast p : podcasts){
p.setLastEpisode(getLastEpisodeForPodcast(p));
}
return podcasts;
}
//TODO - optimize and get the last episode only when the feed is called
@Cacheable(value="randomAndTopRatedPodcasts", key="#root.method.name")
public List<Podcast> getRandomPodcasts(Integer numberOfPodcasts) {
List<Podcast> randomPodcasts = startPageDao.getRandomPodcasts(numberOfPodcasts);
for(Podcast p : randomPodcasts){
p.setLastEpisode(getLastEpisodeForPodcast(p));
}
return randomPodcasts;
}
public void setStartPageDao(StartPageDao startPageDao) {
this.startPageDao = startPageDao;
}
}