using Microsoft.AspNetCore.Mvc; using MongoDB.Bson; using server.Models; using server.Persistence.Repositories; namespace server.Controllers.v1 { [ApiController] [ApiVersion("1.0")] [Route("/api/characters")] [Produces("application/json")] public class CharactersController : ControllerBase { private readonly ICharacterRepository _characterRepository; public CharactersController(ICharacterRepository characterRepository) { _characterRepository = characterRepository; } /// /// Gets a collection of characters. /// /// Filter parameters passed from query string. /// Returns the collection of characters requested. /// Not a valid request. /// Failed to get characters. /// Returns a collection of characters. [MapToApiVersion("1.0")] [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] public async Task GetCharactersAsync([FromQuery] CharacterFilter? filter) { try { var character = await _characterRepository.GetCharactersAsync(filter); return Ok(character); } catch (Exception e) { Console.WriteLine(e); return Problem(detail: "Failed to get characters", statusCode: 500); } } /// /// Gets a character by its id. /// /// The id of the character being requested. /// Returns the character requested. /// Not a valid request. /// Character with the given id not found. /// Failed to get character. /// Returns a character. [MapToApiVersion("1.0")] [HttpGet("{id}")] [ProducesResponseType(typeof(Character), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] public async Task GetCharacterByIdAsync(string id) { if (!ObjectId.TryParse(id, out _)) { ModelState.AddModelError(nameof(id), $"{id} is not a valid id"); return ValidationProblem(detail: "Invalid request"); } try { var quote = await _characterRepository.GetCharacterByIdAsync(id); return quote == null ? Problem(detail: $"Could not find character {id}", statusCode: 404) : Ok(quote); } catch (Exception e) { Console.WriteLine(e); return Problem(detail: "Failed to get character", statusCode: 500); } } } }