package org.podcastpedia.web.episodes;
import org.apache.log4j.Logger;
import org.podcastpedia.common.domain.Episode;
import org.podcastpedia.common.domain.EpisodeWrapper;
import org.podcastpedia.common.exception.BusinessException;
import org.podcastpedia.common.types.ErrorCodeType;
import org.podcastpedia.common.util.config.ConfigService;
import org.podcastpedia.core.episodes.EpisodeService;
import org.podcastpedia.core.podcasts.PodcastService;
import org.podcastpedia.core.searching.SearchData;
import org.podcastpedia.web.podcasts.PodcastController;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
/**
* Annotation-driven controller that handles requests to display episodes and
* episode archive pages.
*
* @author ama
*/
@Controller
@RequestMapping("/podcasts")
// it will handle all requests having "podcasts" in it
public class EpisodeController {
protected static Logger LOG = Logger.getLogger(PodcastController.class);
@Autowired
private PodcastService podcastService;
@Autowired
private EpisodeService episodeService;
@Autowired
private ConfigService configService;
/**
* Add an empty searchData object to the model
*/
@ModelAttribute
public void addDataToModel(ModelMap model) {
SearchData dataForSearchBar = new SearchData();
dataForSearchBar.setSearchMode("natural");
dataForSearchBar.setCurrentPage(1);
dataForSearchBar.setQueryText(null);
dataForSearchBar.setNumberResultsPerPage(10);
model.put("advancedSearchData", dataForSearchBar);
}
/**
* Controller method for episode page.
*
* @param podcastId
* @param episodeId
* @param show_other_episodes
* @param model
*
* @return
* @throws BusinessException
*/
@RequestMapping(value = "{podcastId}/*/episodes/{episodeId}/*", method = RequestMethod.GET)
public String getEpisodeDetails(
@PathVariable("podcastId") int podcastId,
@PathVariable("episodeId") int episodeId,
@RequestParam(value = "show_other_episodes", required = false) Boolean show_other_episodes,
ModelMap model)
throws BusinessException {
LOG.debug("------ getEpisodeDetails : Received request to show details for episode id "
+ episodeId + " of the podcast id " + podcastId + " ------");
EpisodeWrapper episodeDetails = episodeService.getEpisodeDetails(
podcastId, episodeId);
model.addAttribute("podcast_title_in_url", episodeDetails.getEpisode()
.getPodcast().getTitleInUrl());
if (episodeDetails.getEpisode().getRating() == null)
episodeDetails.getEpisode().setRating(10f);
model.addAttribute("roundedRatingScore",
Math.round(episodeDetails.getEpisode().getRating()));
model.addAttribute("episodeDetails", episodeDetails.getEpisode());
// set other episodes to be displayed
List<Episode> otherEpisodes = episodeDetails.getLastEpisodes();
if (otherEpisodes != null) {
model.addAttribute("episodes", otherEpisodes);
model.addAttribute("otherEpisodesSize",
otherEpisodes.size());
model.addAttribute("nr_divs_with_ratings", otherEpisodes.size());
}
if (null != show_other_episodes && show_other_episodes) {
model.addAttribute("show_other_episodes", true);
} else {
model.addAttribute("show_other_episodes", false);
}
//set og_url
String og_url = "https://www.podcastpedia.org/podcasts/" + episodeDetails.getEpisode().getPodcastId()
+ "/" + episodeDetails.getEpisode().getPodcast().getTitleInUrl()
+ "/episodes/" + episodeDetails.getEpisode().getEpisodeId()
+ "/" + episodeDetails.getEpisode().getTitleInUrl();
model.addAttribute("og_url", og_url);
return "m_episodeDetails_def";
}
@RequestMapping(value = "{podcastId}/*/episodes/archive/pages/{currentPage}", method = RequestMethod.GET)
public String getEpisodeArchivePage(
@PathVariable("podcastId") Integer podcastId,
@PathVariable("currentPage") Integer currentPage, ModelMap model,
HttpSession session)
throws BusinessException {
LOG.debug("------ getEpisodeDetails : Received request to show all episodes for podcast id "
+ podcastId + " ------");
Integer numberOfEpisodes = podcastService
.getNumberEpisodesForPodcast(podcastId);
// default is 20 if you want to get rid of the cache for config data
Integer numberOfEpisodesPerPage = Integer.valueOf(configService
.getValue("NUMBER_OF_EPISODES_PER_PAGE_IN_ARCHIVE"));
List<Episode> episodes = episodeService.getEpisodesFromArchive(
podcastId, currentPage, numberOfEpisodes);
model.addAttribute("episodes", episodes);
model.addAttribute("nr_divs_with_ratings", episodes.size());
model.addAttribute("currentPage", currentPage);
model.addAttribute("numberOfEpisodes", numberOfEpisodes);
model.addAttribute("podcastTitleInUrl", episodes.get(0)
.getPodcast().getTitleInUrl());
model.addAttribute("podcastId", podcastId);
Integer numberOfArchivePages = episodeService
.getNumberOfArchivePages(numberOfEpisodes);
model.addAttribute("numberOfEpisodePages", numberOfArchivePages);
model.addAttribute("numberOfEpisodesPerPage", numberOfEpisodesPerPage);
return "m_allEpisodesForPodcastDefinition";
}
@ExceptionHandler({ NoSuchRequestHandlingMethodException.class,
ConversionNotSupportedException.class })
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public String handleResourceNotFound(ModelMap model) {
model.put("advancedSearchData", new SearchData());
return "resourceNotFound";
}
@ExceptionHandler(BusinessException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public String handleBusinessException(BusinessException ex,
HttpServletRequest request) {
String tileDefinitionName = null;
if (ex.getErrorCode() == ErrorCodeType.EPISODE_FOUND_IN_ARCHIVE_ERROR_CODE
|| ex.getErrorCode() == ErrorCodeType.EPISODE_NOT_FOUND_BUT_PODCAST_AVAILABLE) {
request.setAttribute("episode", ex.getEpisode());
tileDefinitionName = "error_ep_found_in_archive";
} else {
tileDefinitionName = "resourceNotFound";
}
return tileDefinitionName;
}
}