From e459d20f54610c9b22ce3bbffc343b8b8a04b854 Mon Sep 17 00:00:00 2001 From: StevanFreeborn Date: Thu, 23 Jun 2022 16:43:17 -0500 Subject: [PATCH] implement getquotebyidasync --- server/Controllers/v1/EpisodesController.cs | 2 +- server/Controllers/v1/QuotesController.cs | 35 ++++++++++++++++--- server/Controllers/v1/SeasonsController.cs | 2 +- server/Models/QuoteFilter.cs | 22 ++++++++++++ .../Repositories/IQuoteRepository.cs | 2 +- .../Repositories/QuoteRepository.cs | 34 +++++++++++++++--- 6 files changed, 85 insertions(+), 12 deletions(-) diff --git a/server/Controllers/v1/EpisodesController.cs b/server/Controllers/v1/EpisodesController.cs index d5ad22a..dbb131c 100644 --- a/server/Controllers/v1/EpisodesController.cs +++ b/server/Controllers/v1/EpisodesController.cs @@ -40,7 +40,7 @@ namespace server.Controllers.v1 catch (Exception e) { Console.WriteLine(e); - return Problem(detail: "Failed to get episode", statusCode: 500); + return Problem(detail: "Failed to get episodes", statusCode: 500); } } diff --git a/server/Controllers/v1/QuotesController.cs b/server/Controllers/v1/QuotesController.cs index 2eca4b6..cecdbaa 100644 --- a/server/Controllers/v1/QuotesController.cs +++ b/server/Controllers/v1/QuotesController.cs @@ -1,4 +1,6 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; +using MongoDB.Bson; using server.Models; using server.Persistence.Repositories; @@ -40,16 +42,39 @@ namespace server.Controllers.v1 catch (Exception e) { Console.WriteLine(e); - return Problem(detail: "Failed to get quote", statusCode: 500); + return Problem(detail: "Failed to get quotes", statusCode: 500); } } - // TODO: Implement getquotesbyid + // TODO: Add comments [MapToApiVersion("1.0")] - [HttpGet("{id:int}")] - public Task> GetQuoteByIdAsync(int id) + [HttpGet("{id}")] + [ProducesResponseType(typeof(Quote), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] + public async Task> GetQuoteByIdAsync(string id) { - throw new NotImplementedException(); + + if (!ObjectId.TryParse(id, out _)) + { + ModelState.AddModelError(nameof(id), $"{id} is not a valid id"); + return ValidationProblem(); + } + + try + { + var quote = await _quoteRepository.GetQuoteByIdAsync(id); + + return quote == null ? + Problem(detail: $"Could not find quote {id}", statusCode: 404) : + Ok(quote); + } + catch (Exception e) + { + Console.WriteLine(e); + return Problem(detail: "Failed to get quote", statusCode: 500); + } } } } diff --git a/server/Controllers/v1/SeasonsController.cs b/server/Controllers/v1/SeasonsController.cs index 200ecc5..fd84db7 100644 --- a/server/Controllers/v1/SeasonsController.cs +++ b/server/Controllers/v1/SeasonsController.cs @@ -37,7 +37,7 @@ namespace server.Controllers.v1 catch (Exception e) { Console.WriteLine(e); - return Problem(detail: "Failed to get season", statusCode: 500); + return Problem(detail: "Failed to get seasons", statusCode: 500); } } diff --git a/server/Models/QuoteFilter.cs b/server/Models/QuoteFilter.cs index 1abedf3..aff0f1d 100644 --- a/server/Models/QuoteFilter.cs +++ b/server/Models/QuoteFilter.cs @@ -2,9 +2,31 @@ { public class QuoteFilter { + + /// + /// Use to filter quotes by season. + /// + public int? Season { get; set; } = null; + + /// + /// Use to filter quotes by episode. + /// + public int? Episode { get; set; } = null; + + /// + /// Use to filter quotes by a key word. + /// + public string? TextKeyword { get; set; } = null; + + /// + /// Use to filter quotes by source. + /// + public string? Source { get; set; } = null; + /// /// Use to filter quote by narrator. /// public string? Narrator { get; set; } = null; + } } diff --git a/server/Persistence/Repositories/IQuoteRepository.cs b/server/Persistence/Repositories/IQuoteRepository.cs index daee7d7..227c3df 100644 --- a/server/Persistence/Repositories/IQuoteRepository.cs +++ b/server/Persistence/Repositories/IQuoteRepository.cs @@ -5,6 +5,6 @@ namespace server.Persistence.Repositories public interface IQuoteRepository { Task> GetQuotesAsync(QuoteFilter filter); - Task GetQuoteByIdAsync(int id); + Task GetQuoteByIdAsync(string id); } } diff --git a/server/Persistence/Repositories/QuoteRepository.cs b/server/Persistence/Repositories/QuoteRepository.cs index 64e9cf0..34c44d8 100644 --- a/server/Persistence/Repositories/QuoteRepository.cs +++ b/server/Persistence/Repositories/QuoteRepository.cs @@ -13,13 +13,32 @@ namespace server.Persistence.Repositories _context = context; } - // TODO: Implement optional, but possible filters for query. public async Task> GetQuotesAsync(QuoteFilter filter) { try { var query = _context.Quotes.AsQueryable(); + if (filter?.Season != null) + { + query = query.Where(quote => quote.Season == filter.Season); + } + + if (filter?.Episode != null) + { + query = query.Where(quote => quote.Episode == filter.Episode); + } + + if (filter?.TextKeyword != null) + { + query = query.Where(quote => quote.Text!.ToLower().Contains(filter.TextKeyword.ToLower())); + } + + if (filter?.Source != null) + { + query = query.Where(quote => quote.Source!.ToLower().Contains(filter.Source.ToLower())); + } + if (filter?.Narrator != null) { query = query.Where(quote => quote.Narrator!.ToLower().Contains(filter.Narrator.ToLower())); @@ -34,10 +53,17 @@ namespace server.Persistence.Repositories } } - // TODO: Implement GetQuoteByIdAsync() method. - public Task GetQuoteByIdAsync(int id) + public async Task GetQuoteByIdAsync(string id) { - throw new NotImplementedException(); + try + { + return await _context.Quotes.Find(quote => quote.Id == id).SingleOrDefaultAsync(); + } + catch(Exception e) + { + Console.WriteLine(e); + throw; + } } }