diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..dba896c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# CS0472: The result of the expression is always the same since a value of this type is never equal to 'null' +dotnet_diagnostic.CS0472.severity = none diff --git a/criminalmindsapi.sln b/criminalmindsapi.sln index 4db8ac9..71e421e 100644 --- a/criminalmindsapi.sln +++ b/criminalmindsapi.sln @@ -8,7 +8,12 @@ Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "client", "client\client.esp {1EF6EB3C-FCA0-4FF6-8A99-373AFAC6E4EC} = {1EF6EB3C-FCA0-4FF6-8A99-373AFAC6E4EC} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "server", "server\server.csproj", "{1EF6EB3C-FCA0-4FF6-8A99-373AFAC6E4EC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "server", "server\server.csproj", "{1EF6EB3C-FCA0-4FF6-8A99-373AFAC6E4EC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2FE01B2A-2F23-477B-BC6A-1E71781A61DB}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/server/Controllers/EpisodesController.cs b/server/Controllers/EpisodesController.cs new file mode 100644 index 0000000..7dc03a2 --- /dev/null +++ b/server/Controllers/EpisodesController.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using server.Models; +using server.Persistence.Repositories; + +namespace server.Controllers +{ + [ApiController] + [Route("/api/episodes")] + [Produces("application/json")] + public class EpisodesController : ControllerBase + { + private readonly IEpisodeRepository _episodeRepository; + + public EpisodesController(IEpisodeRepository episodeRepository) + { + _episodeRepository = episodeRepository; + } + + [HttpGet] + [ProducesResponseType(typeof(List), 200)] + [ProducesResponseType(500)] + public async Task>> GetEpisodesAsync([FromQuery]EpisodeFilter? filter) + { + try + { +#pragma warning disable CS8604 // Possible null reference argument. + var seasons = await _episodeRepository.GetEpisodesAsync(filter); +#pragma warning restore CS8604 // Possible null reference argument. + return Ok(seasons); + } + catch (Exception e) + { + Console.WriteLine(e); + return StatusCode(StatusCodes.Status500InternalServerError, "Failed to get episodes"); + } + } + } +} diff --git a/server/Controllers/SeasonsController.cs b/server/Controllers/SeasonsController.cs index 6977fe5..a182394 100644 --- a/server/Controllers/SeasonsController.cs +++ b/server/Controllers/SeasonsController.cs @@ -5,7 +5,7 @@ using server.Persistence.Repositories; namespace server.Controllers { [ApiController] - [Route("api/seasons")] + [Route("/api/seasons")] [Produces("application/json")] public class SeasonsController : ControllerBase { diff --git a/server/Models/EpisodeFilter.cs b/server/Models/EpisodeFilter.cs new file mode 100644 index 0000000..ab91c92 --- /dev/null +++ b/server/Models/EpisodeFilter.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 EpisodeFilter + { + public int? Season { get; set; } = null; + } +} diff --git a/server/Persistence/Repositories/EpisodeRepository.cs b/server/Persistence/Repositories/EpisodeRepository.cs new file mode 100644 index 0000000..bed2bdb --- /dev/null +++ b/server/Persistence/Repositories/EpisodeRepository.cs @@ -0,0 +1,36 @@ +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using server.Models; + +namespace server.Persistence.Repositories +{ + public class EpisodeRepository : IEpisodeRepository + { + private readonly IDbContext _context; + + public EpisodeRepository(IDbContext context) + { + _context = context; + } + + public async Task> GetEpisodesAsync(EpisodeFilter? filter) + { + try + { + var query = _context.Episodes.AsQueryable(); + + if (filter?.Season != null) + { + query = query.Where(episode => episode.Season == filter.Season); + } + + return await query.ToListAsync(); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + } + } +} diff --git a/server/Persistence/Repositories/IEpisodeRepository.cs b/server/Persistence/Repositories/IEpisodeRepository.cs new file mode 100644 index 0000000..6e6a8f0 --- /dev/null +++ b/server/Persistence/Repositories/IEpisodeRepository.cs @@ -0,0 +1,14 @@ +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 IEpisodeRepository + { + Task> GetEpisodesAsync(EpisodeFilter filter); + } +} diff --git a/server/Program.cs b/server/Program.cs index 43dc06a..3e05561 100644 --- a/server/Program.cs +++ b/server/Program.cs @@ -15,6 +15,8 @@ builder.Services.AddSingleton(); builder.Services.AddScoped(); +builder.Services.AddScoped(); + builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); diff --git a/server/server.csproj b/server/server.csproj index 675eba3..3ca00a4 100644 --- a/server/server.csproj +++ b/server/server.csproj @@ -6,6 +6,10 @@ enable + + + +