From 9bc24949b7da2f3be6b1f60909411d2e15edf21f Mon Sep 17 00:00:00 2001 From: StevanFreeborn Date: Fri, 24 Jun 2022 10:10:02 -0500 Subject: [PATCH] implement character controller methods --- server/Controllers/v1/CharactersController.cs | 75 +++++++++++++++++++ server/Models/CharacterFilter.cs | 13 ++++ .../Filters/ApiVersionOperationFilter.cs | 2 +- .../Repositories/CharacterRepository.cs | 15 +++- .../Repositories/ICharacterRepository.cs | 9 +-- server/Program.cs | 2 +- 6 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 server/Models/CharacterFilter.cs rename server/{ => Options}/Filters/ApiVersionOperationFilter.cs (95%) diff --git a/server/Controllers/v1/CharactersController.cs b/server/Controllers/v1/CharactersController.cs index 2a31a84..9f94a33 100644 --- a/server/Controllers/v1/CharactersController.cs +++ b/server/Controllers/v1/CharactersController.cs @@ -1,4 +1,7 @@ using Microsoft.AspNetCore.Mvc; +using MongoDB.Bson; +using server.Models; +using server.Persistence.Repositories; namespace server.Controllers.v1 { @@ -8,5 +11,77 @@ namespace server.Controllers.v1 [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(); + } + + 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); + } + } } } diff --git a/server/Models/CharacterFilter.cs b/server/Models/CharacterFilter.cs new file mode 100644 index 0000000..75e83dd --- /dev/null +++ b/server/Models/CharacterFilter.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace server.Models +{ + public class CharacterFilter + { + // TODO: Build character filter model + } +} diff --git a/server/Filters/ApiVersionOperationFilter.cs b/server/Options/Filters/ApiVersionOperationFilter.cs similarity index 95% rename from server/Filters/ApiVersionOperationFilter.cs rename to server/Options/Filters/ApiVersionOperationFilter.cs index b49cd1c..3d5eaf5 100644 --- a/server/Filters/ApiVersionOperationFilter.cs +++ b/server/Options/Filters/ApiVersionOperationFilter.cs @@ -2,7 +2,7 @@ using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; -namespace server.Filters +namespace server.Options.Filters { public class ApiVersionOperationFilter : IOperationFilter { diff --git a/server/Persistence/Repositories/CharacterRepository.cs b/server/Persistence/Repositories/CharacterRepository.cs index a06868f..ab14804 100644 --- a/server/Persistence/Repositories/CharacterRepository.cs +++ b/server/Persistence/Repositories/CharacterRepository.cs @@ -1,6 +1,19 @@ -namespace server.Persistence.Repositories +using server.Models; + +namespace server.Persistence.Repositories { public class CharacterRepository : ICharacterRepository { + // TODO: Implement getcharactersasync + public Task> GetCharactersAsync(CharacterFilter filter) + { + throw new NotImplementedException(); + } + + // TODO: Implement getcharacterbyidasync + public Task GetCharacterByIdAsync(string id) + { + throw new NotImplementedException(); + } } } diff --git a/server/Persistence/Repositories/ICharacterRepository.cs b/server/Persistence/Repositories/ICharacterRepository.cs index 2882fa5..b9b74a5 100644 --- a/server/Persistence/Repositories/ICharacterRepository.cs +++ b/server/Persistence/Repositories/ICharacterRepository.cs @@ -1,13 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using server.Models; namespace server.Persistence.Repositories { public interface ICharacterRepository { - + Task> GetCharactersAsync(CharacterFilter filter); + Task GetCharacterByIdAsync(string id); } } diff --git a/server/Program.cs b/server/Program.cs index 7095bca..247734d 100644 --- a/server/Program.cs +++ b/server/Program.cs @@ -2,13 +2,13 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.Extensions.Options; -using server.Filters; using server.Options; using server.Persistence; using server.Persistence.Repositories; using server.Persistence.Seed; using System.Reflection; using AspNetCoreRateLimit; +using server.Options.Filters; if (args.Length == 2 && args[0].ToLower() == "seed") {