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")
{