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.
/// Returns 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 episodes", statusCode: 500);
}
}
///
/// Gets an episode by its number in the series.
///
/// The number of the episode in the series.
/// Returns the episode requested.
/// Unable to find an episode with the provided number.
/// Failed to get episode.
/// Returns the episode requested.
[MapToApiVersion("1.0")]
[HttpGet("{number:int}")]
[ProducesResponseType(typeof(Episode), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]
public async Task GetEpisodeByNumberAsync(int number)
{
try
{
var episode = await _episodeRepository.GetEpisodeByNumberAsync(number);
return episode == null ?
Problem(detail: $"Could not find episode {number}", statusCode: 404) :
Ok(episode);
}
catch (Exception e)
{
Console.WriteLine(e);
return Problem(detail: "Failed to get episode", statusCode: 500);
}
}
}
}