diff --git a/FakePieShop/Controllers/Api/SearchController.cs b/FakePieShop/Controllers/Api/SearchController.cs new file mode 100644 index 0000000..3c2a5cd --- /dev/null +++ b/FakePieShop/Controllers/Api/SearchController.cs @@ -0,0 +1,42 @@ +using FakePieShop.Repositories; +using FakePieShop.Models; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace FakePieShop.Controllers.Api +{ + [Route("api/[controller]")] + [ApiController] + public class SearchController : ControllerBase + { + private readonly IPieRepository _pieRepository; + + public SearchController(IPieRepository pieRepository) + { + _pieRepository = pieRepository; + } + + [HttpGet] + public IActionResult GetAll() => Ok(_pieRepository.AllPies); + + [HttpGet("{id}")] + public IActionResult GetById(int id) + { + Pie? pie = _pieRepository.GetPieById(id); + if (pie == null) return NotFound(); + return Ok(pie); + } + + [HttpPost] + public IActionResult SearchPies([FromBody] string searchQuery) + { + if (string.IsNullOrEmpty(searchQuery)) + return BadRequest(); + + IEnumerable pies = new List(); + + pies = _pieRepository.SearchPies(searchQuery); + return new JsonResult(pies); + } + } +} diff --git a/FakePieShop/Program.cs b/FakePieShop/Program.cs index 2c88a41..4aec9ba 100644 --- a/FakePieShop/Program.cs +++ b/FakePieShop/Program.cs @@ -1,6 +1,7 @@ using FakePieShop.Models; using FakePieShop.Repositories; using Microsoft.EntityFrameworkCore; +using System.Text.Json.Serialization; WebApplicationBuilder builder = WebApplication.CreateBuilder(args); @@ -14,9 +15,14 @@ builder.Services.AddScoped(services => ShoppingCart builder.Services.AddSession(); builder.Services.AddHttpContextAccessor(); +// use this configuration if using .net for backend only +// builder.Services.AddControllers(); + // configuration for MVC and entity framework core builder.Services.AddRazorPages(); -builder.Services.AddControllersWithViews(); +builder.Services.AddControllersWithViews() // this does the same as the above, but also includes support for .net views + .AddJsonOptions(options => options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles); + builder.Services.AddDbContext(options => { options.UseSqlServer( @@ -36,7 +42,9 @@ if (app.Environment.IsDevelopment()) app.UseDeveloperExceptionPage(); } -app.MapDefaultControllerRoute(); +// if writing a backend only project: +// app.MapControllers(); +app.MapDefaultControllerRoute(); // otherwise, this does the same configuration, but full stack app.MapRazorPages(); // use our own seed data diff --git a/FakePieShop/Repositories/IPieRepository.cs b/FakePieShop/Repositories/IPieRepository.cs index 634f88e..15c9c6a 100644 --- a/FakePieShop/Repositories/IPieRepository.cs +++ b/FakePieShop/Repositories/IPieRepository.cs @@ -7,5 +7,6 @@ namespace FakePieShop.Repositories IEnumerable AllPies { get; } IEnumerable PiesOfTheWeek { get; } Pie? GetPieById(int pieId); + IEnumerable SearchPies(string searchQuery); } } diff --git a/FakePieShop/Repositories/PieRepository.cs b/FakePieShop/Repositories/PieRepository.cs index 60a60fa..d1ec4a0 100644 --- a/FakePieShop/Repositories/PieRepository.cs +++ b/FakePieShop/Repositories/PieRepository.cs @@ -32,5 +32,8 @@ namespace FakePieShop.Repositories { return _fakePieShopDbContext.Pies.FirstOrDefault(p => p.PieId == pieId); } + + public IEnumerable SearchPies(string searchQuery) => + _fakePieShopDbContext.Pies.Where(p => p.Name.Contains(searchQuery)); } }