using Microsoft.AspNetCore.Mvc; using server.Models; using server.Persistence.Repositories; namespace server.Controllers.v1 { [ApiController] [ApiVersion("1.0")] [Route("/api/episodes")] [Produces("application/json")] public class EpisodesController : ControllerBase { private readonly IEpisodeRepository _episodeRepository; public EpisodesController(IEpisodeRepository episodeRepository) { _episodeRepository = episodeRepository; } /// /// Gets a collection of episodes. /// /// Filter parameters passed from query string. /// Returns the collection of episodes requested. /// Not a valid request. /// Failed to get episodes. /// A collection of episodes. [MapToApiVersion("1.0")] [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] public async Task>> GetEpisodesAsync([FromQuery] EpisodeFilter? filter) { try { var seasons = await _episodeRepository.GetEpisodesAsync(filter); return Ok(seasons); } catch (Exception e) { Console.WriteLine(e); return Problem(detail: "Failed to get episode", statusCode: 500); } } /// /// Gets an episode by its number in the series. /// /// The number of the episode in the series. /// Returns the episode requested. /// Not a valid request. /// Unable to find an episode with the provided number. /// Failed to get episode. /// The episode requested. [MapToApiVersion("1.0")] [HttpGet("{number:int}")] [ProducesResponseType(typeof(Episode), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] public async Task> GetEpisodeByNumberAsync(int number) { try { var episode = await _episodeRepository.GetEpisodeByNumberAsync(number); if (episode == null) return Problem(detail: $"Could not find episode {number}", statusCode: 404); return Ok(episode); } catch (Exception e) { Console.WriteLine(e); return Problem(detail: "Failed to get episode", statusCode: 500); } } } }