From 0179004ffd6246cec165dfeaa9a49312f41c2725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Silva?= Date: Wed, 27 Sep 2023 03:34:04 +0100 Subject: [PATCH] Project Finished. --- BreweryAPI/BreweryAPI schema.PNG | Bin 0 -> 84327 bytes BreweryAPI/BreweryAPI.sln | 39 ++ BreweryAPI/BreweryAPI/BreweryAPI.csproj | 25 + BreweryAPI/BreweryAPI/Context.cs | 19 + .../BreweryAPI/Controllers/BeerController.cs | 156 +++++ .../Controllers/BreweryController.cs | 135 +++++ .../Controllers/BrewerySalesController.cs | 171 ++++++ .../Controllers/WholesalerController.cs | 134 +++++ .../WholesalerInventoryController.cs | 142 +++++ .../Controllers/WholesalerQuoteController.cs | 128 +++++ BreweryAPI/BreweryAPI/DTOs/BeerDTO.cs | 10 + BreweryAPI/BreweryAPI/DTOs/BreweryDTO.cs | 9 + BreweryAPI/BreweryAPI/DTOs/BrewerySalesDTO.cs | 11 + BreweryAPI/BreweryAPI/DTOs/WholesalerDTO.cs | 9 + .../BreweryAPI/DTOs/WholesalerInventoryDTO.cs | 10 + .../BreweryAPI/DTOs/WholesalerQuoteDTO.cs | 12 + .../BreweryAPI/Helpers/MappingProfiles.cs | 25 + .../BreweryAPI/Interface/IBeerRepository.cs | 16 + .../Interface/IBreweryRepository.cs | 15 + .../Interface/IBrewerySalesRepository.cs | 15 + .../IWholesalerInventoryRepository.cs | 17 + .../Interface/IWholesalerQuoteRepository.cs | 15 + .../Interface/IWholesalerRepository.cs | 15 + BreweryAPI/BreweryAPI/Models/BeerModel.cs | 16 + BreweryAPI/BreweryAPI/Models/BreweryModel.cs | 15 + .../BreweryAPI/Models/BrewerySalesModel.cs | 16 + .../BreweryAPI/Models/WholesalerInventory.cs | 15 + .../BreweryAPI/Models/WholesalerModel.cs | 15 + .../BreweryAPI/Models/WholesalerQuoteModel.cs | 17 + BreweryAPI/BreweryAPI/Program.cs | 71 +++ .../BreweryAPI/Properties/launchSettings.json | 41 ++ .../BreweryAPI/Repositories/BeerRepository.cs | 58 ++ .../Repositories/BreweryRepository.cs | 53 ++ .../Repositories/BrewerySalesRepository.cs | 53 ++ .../WholesalerInventoryRepository.cs | 63 ++ .../Repositories/WholesalerQuoteRepository.cs | 53 ++ .../Repositories/WholesalerRepository.cs | 54 ++ BreweryAPI/BreweryAPI/SeedData.cs | 149 +++++ .../BreweryAPI/appsettings.Development.json | 8 + BreweryAPI/BreweryAPI/appsettings.json | 13 + BreweryAPI/BreweryMaui/App.xaml | 14 + BreweryAPI/BreweryMaui/App.xaml.cs | 12 + BreweryAPI/BreweryMaui/AppShell.xaml | 13 + BreweryAPI/BreweryMaui/AppShell.xaml.cs | 10 + BreweryAPI/BreweryMaui/BreweryMaui.csproj | 73 +++ BreweryAPI/BreweryMaui/MauiProgram.cs | 25 + .../BreweryMaui/Pages/BreweryMainPage.xaml | 101 ++++ .../BreweryMaui/Pages/BreweryMainPage.xaml.cs | 169 ++++++ .../BreweryMaui/Pages/BreweryUserPage.xaml | 217 +++++++ .../BreweryMaui/Pages/BreweryUserPage.xaml.cs | 287 ++++++++++ BreweryAPI/BreweryMaui/Pages/MainPage.xaml | 49 ++ BreweryAPI/BreweryMaui/Pages/MainPage.xaml.cs | 23 + .../BreweryMaui/Pages/WholesalerMainPage.xaml | 102 ++++ .../Pages/WholesalerMainPage.xaml.cs | 167 ++++++ .../Pages/WholesallerUserPage.xaml | 399 +++++++++++++ .../Pages/WholesallerUserPage.xaml.cs | 538 ++++++++++++++++++ .../BreweryMaui/Platforms/Windows/App.xaml | 8 + .../BreweryMaui/Platforms/Windows/App.xaml.cs | 24 + .../Platforms/Windows/Package.appxmanifest | 46 ++ .../Platforms/Windows/app.manifest | 15 + .../Properties/launchSettings.json | 8 + .../BreweryMaui/Resources/AppIcon/appicon.svg | 4 + .../Resources/AppIcon/appiconfg.svg | 8 + .../Resources/Fonts/CroissantOne-Regular.ttf | Bin 0 -> 50376 bytes .../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 107144 bytes .../Resources/Images/beerbackground.jpg | Bin 0 -> 169689 bytes .../BreweryMaui/Resources/Raw/AboutAssets.txt | 15 + .../BreweryMaui/Resources/Splash/splash.svg | 8 + .../BreweryMaui/Resources/Styles/Colors.xaml | 44 ++ .../BreweryMaui/Resources/Styles/Styles.xaml | 405 +++++++++++++ .../IntegrationTests/Controllers/BeerTests.cs | 172 ++++++ .../Controllers/BrewerySalesTest.cs | 158 +++++ .../Controllers/BreweryTests.cs | 149 +++++ .../Controllers/WholesalerInventoryTests.cs | 150 +++++ .../Controllers/WholesalerQuote.cs | 127 +++++ .../Controllers/WholsesalerTest.cs | 143 +++++ BreweryAPI/IntegrationTests/GlobalUsings.cs | 1 + .../IntegrationTests/Helpers/TestData.cs | 140 +++++ .../Helpers/TestEnvironment.cs | 47 ++ .../IntegrationTests/IntegrationTests.csproj | 33 ++ BreweryAPI/ReadMe.txt | 60 ++ 81 files changed, 5802 insertions(+) create mode 100644 BreweryAPI/BreweryAPI schema.PNG create mode 100644 BreweryAPI/BreweryAPI.sln create mode 100644 BreweryAPI/BreweryAPI/BreweryAPI.csproj create mode 100644 BreweryAPI/BreweryAPI/Context.cs create mode 100644 BreweryAPI/BreweryAPI/Controllers/BeerController.cs create mode 100644 BreweryAPI/BreweryAPI/Controllers/BreweryController.cs create mode 100644 BreweryAPI/BreweryAPI/Controllers/BrewerySalesController.cs create mode 100644 BreweryAPI/BreweryAPI/Controllers/WholesalerController.cs create mode 100644 BreweryAPI/BreweryAPI/Controllers/WholesalerInventoryController.cs create mode 100644 BreweryAPI/BreweryAPI/Controllers/WholesalerQuoteController.cs create mode 100644 BreweryAPI/BreweryAPI/DTOs/BeerDTO.cs create mode 100644 BreweryAPI/BreweryAPI/DTOs/BreweryDTO.cs create mode 100644 BreweryAPI/BreweryAPI/DTOs/BrewerySalesDTO.cs create mode 100644 BreweryAPI/BreweryAPI/DTOs/WholesalerDTO.cs create mode 100644 BreweryAPI/BreweryAPI/DTOs/WholesalerInventoryDTO.cs create mode 100644 BreweryAPI/BreweryAPI/DTOs/WholesalerQuoteDTO.cs create mode 100644 BreweryAPI/BreweryAPI/Helpers/MappingProfiles.cs create mode 100644 BreweryAPI/BreweryAPI/Interface/IBeerRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Interface/IBreweryRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Interface/IBrewerySalesRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Interface/IWholesalerInventoryRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Interface/IWholesalerQuoteRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Interface/IWholesalerRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Models/BeerModel.cs create mode 100644 BreweryAPI/BreweryAPI/Models/BreweryModel.cs create mode 100644 BreweryAPI/BreweryAPI/Models/BrewerySalesModel.cs create mode 100644 BreweryAPI/BreweryAPI/Models/WholesalerInventory.cs create mode 100644 BreweryAPI/BreweryAPI/Models/WholesalerModel.cs create mode 100644 BreweryAPI/BreweryAPI/Models/WholesalerQuoteModel.cs create mode 100644 BreweryAPI/BreweryAPI/Program.cs create mode 100644 BreweryAPI/BreweryAPI/Properties/launchSettings.json create mode 100644 BreweryAPI/BreweryAPI/Repositories/BeerRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Repositories/BreweryRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Repositories/BrewerySalesRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Repositories/WholesalerInventoryRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Repositories/WholesalerQuoteRepository.cs create mode 100644 BreweryAPI/BreweryAPI/Repositories/WholesalerRepository.cs create mode 100644 BreweryAPI/BreweryAPI/SeedData.cs create mode 100644 BreweryAPI/BreweryAPI/appsettings.Development.json create mode 100644 BreweryAPI/BreweryAPI/appsettings.json create mode 100644 BreweryAPI/BreweryMaui/App.xaml create mode 100644 BreweryAPI/BreweryMaui/App.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/AppShell.xaml create mode 100644 BreweryAPI/BreweryMaui/AppShell.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/BreweryMaui.csproj create mode 100644 BreweryAPI/BreweryMaui/MauiProgram.cs create mode 100644 BreweryAPI/BreweryMaui/Pages/BreweryMainPage.xaml create mode 100644 BreweryAPI/BreweryMaui/Pages/BreweryMainPage.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/Pages/BreweryUserPage.xaml create mode 100644 BreweryAPI/BreweryMaui/Pages/BreweryUserPage.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/Pages/MainPage.xaml create mode 100644 BreweryAPI/BreweryMaui/Pages/MainPage.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/Pages/WholesalerMainPage.xaml create mode 100644 BreweryAPI/BreweryMaui/Pages/WholesalerMainPage.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/Pages/WholesallerUserPage.xaml create mode 100644 BreweryAPI/BreweryMaui/Pages/WholesallerUserPage.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/Platforms/Windows/App.xaml create mode 100644 BreweryAPI/BreweryMaui/Platforms/Windows/App.xaml.cs create mode 100644 BreweryAPI/BreweryMaui/Platforms/Windows/Package.appxmanifest create mode 100644 BreweryAPI/BreweryMaui/Platforms/Windows/app.manifest create mode 100644 BreweryAPI/BreweryMaui/Properties/launchSettings.json create mode 100644 BreweryAPI/BreweryMaui/Resources/AppIcon/appicon.svg create mode 100644 BreweryAPI/BreweryMaui/Resources/AppIcon/appiconfg.svg create mode 100644 BreweryAPI/BreweryMaui/Resources/Fonts/CroissantOne-Regular.ttf create mode 100644 BreweryAPI/BreweryMaui/Resources/Fonts/OpenSans-Regular.ttf create mode 100644 BreweryAPI/BreweryMaui/Resources/Images/beerbackground.jpg create mode 100644 BreweryAPI/BreweryMaui/Resources/Raw/AboutAssets.txt create mode 100644 BreweryAPI/BreweryMaui/Resources/Splash/splash.svg create mode 100644 BreweryAPI/BreweryMaui/Resources/Styles/Colors.xaml create mode 100644 BreweryAPI/BreweryMaui/Resources/Styles/Styles.xaml create mode 100644 BreweryAPI/IntegrationTests/Controllers/BeerTests.cs create mode 100644 BreweryAPI/IntegrationTests/Controllers/BrewerySalesTest.cs create mode 100644 BreweryAPI/IntegrationTests/Controllers/BreweryTests.cs create mode 100644 BreweryAPI/IntegrationTests/Controllers/WholesalerInventoryTests.cs create mode 100644 BreweryAPI/IntegrationTests/Controllers/WholesalerQuote.cs create mode 100644 BreweryAPI/IntegrationTests/Controllers/WholsesalerTest.cs create mode 100644 BreweryAPI/IntegrationTests/GlobalUsings.cs create mode 100644 BreweryAPI/IntegrationTests/Helpers/TestData.cs create mode 100644 BreweryAPI/IntegrationTests/Helpers/TestEnvironment.cs create mode 100644 BreweryAPI/IntegrationTests/IntegrationTests.csproj create mode 100644 BreweryAPI/ReadMe.txt diff --git a/BreweryAPI/BreweryAPI schema.PNG b/BreweryAPI/BreweryAPI schema.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5fd29dadbdd97f5f62870a6883f7a0cb90ccc80a GIT binary patch literal 84327 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 literal 0 HcmV?d00001 diff --git a/BreweryAPI/BreweryAPI.sln b/BreweryAPI/BreweryAPI.sln new file mode 100644 index 0000000..749fa3a --- /dev/null +++ b/BreweryAPI/BreweryAPI.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34009.444 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreweryAPI", "BreweryAPI\BreweryAPI.csproj", "{2776268A-0281-4010-9B3A-1DCBA2B86F37}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IntegrationTests", "IntegrationTests\IntegrationTests.csproj", "{3DF4EAFA-2635-47BA-A626-0662DC447DA6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreweryMaui", "BreweryMaui\BreweryMaui.csproj", "{23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2776268A-0281-4010-9B3A-1DCBA2B86F37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2776268A-0281-4010-9B3A-1DCBA2B86F37}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2776268A-0281-4010-9B3A-1DCBA2B86F37}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2776268A-0281-4010-9B3A-1DCBA2B86F37}.Release|Any CPU.Build.0 = Release|Any CPU + {3DF4EAFA-2635-47BA-A626-0662DC447DA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DF4EAFA-2635-47BA-A626-0662DC447DA6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DF4EAFA-2635-47BA-A626-0662DC447DA6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DF4EAFA-2635-47BA-A626-0662DC447DA6}.Release|Any CPU.Build.0 = Release|Any CPU + {23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}.Release|Any CPU.Build.0 = Release|Any CPU + {23C06012-5E13-4AD4-9AB1-4FB8B75B3F8C}.Release|Any CPU.Deploy.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ACB2614C-8CD0-4665-BAB7-E03D00321141} + EndGlobalSection +EndGlobal diff --git a/BreweryAPI/BreweryAPI/BreweryAPI.csproj b/BreweryAPI/BreweryAPI/BreweryAPI.csproj new file mode 100644 index 0000000..c83fb52 --- /dev/null +++ b/BreweryAPI/BreweryAPI/BreweryAPI.csproj @@ -0,0 +1,25 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/BreweryAPI/BreweryAPI/Context.cs b/BreweryAPI/BreweryAPI/Context.cs new file mode 100644 index 0000000..f7e6ec4 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Context.cs @@ -0,0 +1,19 @@ +using BreweryAPI.Models; +using Microsoft.EntityFrameworkCore; + +namespace BreweryAPI +{ + public class Context : DbContext + { + public DbSet Breweries { get; set; } + public DbSet Beers { get; set; } + public DbSet BrewerySales { get; set; } + public DbSet Wholesalers { get; set; } + public DbSet WholesalerInventories { get; set; } + public DbSet WholesalerQuotes { get; set; } + + public Context (DbContextOptions options) : base (options) + { + } + } +} diff --git a/BreweryAPI/BreweryAPI/Controllers/BeerController.cs b/BreweryAPI/BreweryAPI/Controllers/BeerController.cs new file mode 100644 index 0000000..9ff0684 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Controllers/BeerController.cs @@ -0,0 +1,156 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Interface; +using BreweryAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace BreweryAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class BeerController : Controller + { + private readonly IBeerRepository _beerRepository; + private readonly IBreweryRepository _breweryRepository; + private readonly IMapper _mapper; + + public BeerController(IBeerRepository beerRepository, IBreweryRepository breweryRepository, IMapper mapper) + { + _breweryRepository = breweryRepository; + _beerRepository = beerRepository; + _mapper = mapper; + } + + [HttpGet] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + public IActionResult GetBeers() + { + var beers = _mapper.Map>(_beerRepository.GetBeers()); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(beers); + } + + [HttpGet("singular/{beerId}")] + [ProducesResponseType(200, Type = typeof(BeerModel))] + [ProducesResponseType(400)] + public IActionResult GetBeer(int beerId) + { + if (!_beerRepository.BeerExists(beerId)) + return NotFound(); + + var beer = _mapper.Map(_beerRepository.GetBeer(beerId)); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(beer); + } + + [HttpGet("{breweryId}")] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + [ProducesResponseType(400)] + public IActionResult GetBeersByBrewery(int breweryId) + { + if (!_breweryRepository.BreweryExists(breweryId)) + return NotFound(); + + var beersByBrewery = _mapper.Map>(_beerRepository.GetBeersByBrewery(breweryId)); + + if(beersByBrewery.Count == 0) + return NotFound(); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(beersByBrewery); + } + + [HttpPost] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + public IActionResult CreateBeer([FromBody] BeerDTO beerCreate) + { + if (beerCreate == null) + return BadRequest(ModelState); + + var beer = _beerRepository.GetBeers() + .Where(b => b.BeerName.Trim().ToUpper() == beerCreate.BeerName.TrimEnd().ToUpper()) + .FirstOrDefault(); + + if (beer != null) + { + ModelState.AddModelError("", "Beer already exists"); + return StatusCode(422, ModelState); + } + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var beerMap = _mapper.Map(beerCreate); + + if (!_beerRepository.CreateBeer(beerMap)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + return Ok("Succesfully created"); + } + + [HttpPut("{beerId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult UpdateBeer(int beerId, [FromBody] BeerDTO updatedBeer) + { + if (updatedBeer == null) + return BadRequest(ModelState); + + if (beerId != updatedBeer.BeerId) + return BadRequest(ModelState); + + if (!_beerRepository.BeerExists(beerId)) + return NotFound(); + + if (!ModelState.IsValid) + return BadRequest(); + + var beerMap = _mapper.Map(updatedBeer); + + if (!_beerRepository.UpdateBeer(beerMap)) + { + ModelState.AddModelError("", "Something went wrong updating beer"); + return StatusCode(500, ModelState); + } + + return NoContent(); + } + + [HttpDelete("{beerId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult DeleteBeer(int beerId) + { + if (!_beerRepository.BeerExists(beerId)) + { + return NotFound(); + } + + var beerToDelete = _beerRepository.GetBeer(beerId); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + if (!_beerRepository.DeleteBeer(beerToDelete)) + { + ModelState.AddModelError("", "Something went wrong deleting beer"); + } + + return NoContent(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Controllers/BreweryController.cs b/BreweryAPI/BreweryAPI/Controllers/BreweryController.cs new file mode 100644 index 0000000..ee56dde --- /dev/null +++ b/BreweryAPI/BreweryAPI/Controllers/BreweryController.cs @@ -0,0 +1,135 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Interface; +using BreweryAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace BreweryAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class BreweryController : Controller + { + private readonly IBreweryRepository _breweryRepository; + private readonly IMapper _mapper; + + public BreweryController(IBreweryRepository breweryRepository, IMapper mapper) + { + _breweryRepository = breweryRepository; + _mapper = mapper; + } + + [HttpGet] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + public IActionResult GetBreweries() + { + var breweries = _mapper.Map>(_breweryRepository.GetBreweries()); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(breweries); + } + + [HttpGet("{breweryId}")] + [ProducesResponseType(200, Type = typeof(BreweryModel))] + [ProducesResponseType(400)] + public IActionResult GetBrewery(int breweryId) + { + if (!_breweryRepository.BreweryExists(breweryId)) + return NotFound(); + + var brewery = _mapper.Map(_breweryRepository.GetBrewery(breweryId)); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(brewery); + } + + [HttpPost] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + public IActionResult CreateBrewery([FromBody] BreweryDTO breweryCreate) + { + if (breweryCreate == null) + return BadRequest(ModelState); + + var brewery = _breweryRepository.GetBreweries() + .Where(b => b.BreweryName.Trim().ToUpper() == breweryCreate.BreweryName.TrimEnd().ToUpper()) + .FirstOrDefault(); + + if (brewery != null) + { + ModelState.AddModelError("", "Brewery already exists"); + return StatusCode(422, ModelState); + } + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var breweryMap = _mapper.Map(breweryCreate); + + if (!_breweryRepository.CreateBrewery(breweryMap)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + return Ok("Succesfully created"); + } + + [HttpPut("{breweryId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult UpdateBrewery(int breweryId, [FromBody] BreweryDTO updatedBrewery) + { + if (updatedBrewery == null) + return BadRequest(ModelState); + + if (breweryId != updatedBrewery.BreweryId) + return BadRequest(ModelState); + + if (!_breweryRepository.BreweryExists(breweryId)) + return NotFound(); + + if (!ModelState.IsValid) + return BadRequest(); + + var breweryMap = _mapper.Map(updatedBrewery); + + if (!_breweryRepository.UpdateBrewery(breweryMap)) + { + ModelState.AddModelError("", "Something went wrong updating brewery"); + return StatusCode(500, ModelState); + } + + return NoContent(); + } + + [HttpDelete("{breweryId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult DeleteBrewery(int breweryId) + { + if (!_breweryRepository.BreweryExists(breweryId)) + { + return NotFound(); + } + + var breweryToDelete = _breweryRepository.GetBrewery(breweryId); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + if (!_breweryRepository.DeleteBrewery(breweryToDelete)) + { + ModelState.AddModelError("", "Something went wrong deleting brewery"); + } + + return NoContent(); + } + } +} \ No newline at end of file diff --git a/BreweryAPI/BreweryAPI/Controllers/BrewerySalesController.cs b/BreweryAPI/BreweryAPI/Controllers/BrewerySalesController.cs new file mode 100644 index 0000000..a84b25f --- /dev/null +++ b/BreweryAPI/BreweryAPI/Controllers/BrewerySalesController.cs @@ -0,0 +1,171 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Interface; +using BreweryAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace BreweryAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class BrewerySalesController: Controller + { + private readonly IBrewerySalesRepository _brewerySalesRepository; + private readonly IBeerRepository _beerRepository; + private readonly IWholesalerInventoryRepository _wholesalerInventoryRepository; + private readonly IMapper _mapper; + public BrewerySalesController(IWholesalerInventoryRepository wholesalerInventoryRepository, IBrewerySalesRepository brewerySalesRepository, IBeerRepository beerRepository, IMapper mapper) + { + _wholesalerInventoryRepository = wholesalerInventoryRepository; + _beerRepository = beerRepository; + _brewerySalesRepository = brewerySalesRepository; + _mapper = mapper; + } + + [HttpGet] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + public IActionResult GetBrewerySales() + { + var brewerySales = _mapper.Map>(_brewerySalesRepository.GetBrewerySales()); + + if(!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + return Ok(brewerySales); + } + + + [HttpGet("{brewerySalesId}")] + [ProducesResponseType(200, Type = typeof(BrewerySalesModel))] + [ProducesResponseType(400)] + public IActionResult GetBrewerySale(int brewerySalesId) + { + if (!_brewerySalesRepository.BrewerySaleExists(brewerySalesId)) + return NotFound(); + + var brewerySalesMap = _mapper.Map(_brewerySalesRepository.GetBrewerySale(brewerySalesId)); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(brewerySalesMap); + } + + [HttpPost] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + public IActionResult CreateBrewerySale([FromBody] BrewerySalesDTO brewerySaleCreate) + { + if (brewerySaleCreate == null) + return BadRequest(ModelState); + + var beer = _mapper.Map(_beerRepository.GetBeer(brewerySaleCreate.BeerId)); + + if(beer == null) + return BadRequest(ModelState); + + if(brewerySaleCreate.TotalPrice != beer.Price * brewerySaleCreate.Quantity) + return BadRequest(ModelState); + + //Update wholesaler inventory with the quantity of the sale + var wholesalerInventory = _wholesalerInventoryRepository.SelectRecord(brewerySaleCreate.WholeSalerId, brewerySaleCreate.BeerId); + + if(wholesalerInventory != null) + { + wholesalerInventory.Quantity = wholesalerInventory.Quantity + brewerySaleCreate.Quantity; + _wholesalerInventoryRepository.UpdateWholesalerInventory(wholesalerInventory); + } + else + { + //if the wholesaler buying beer does not have any items to update in their inventory, this will create a new item upon purchase. + WholesalerInventoryDTO newInventoryRecord = new WholesalerInventoryDTO + { + WholesalerId = brewerySaleCreate.WholeSalerId, + BeerId = brewerySaleCreate.BeerId, + Quantity = brewerySaleCreate.Quantity + }; + + var InventoryRecordToAdd = _mapper.Map(newInventoryRecord); + + _wholesalerInventoryRepository.CreateWholesalerInventory(InventoryRecordToAdd); + } + + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var brewerySaleMap = _mapper.Map(brewerySaleCreate); + + if (!_brewerySalesRepository.CreateBrewerySale(brewerySaleMap)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + return Ok("Succesfully created"); + } + + [HttpPut("{brewerySaleId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult UpdateBrewerySale(int brewerySaleId, [FromBody] BrewerySalesDTO updatedBrewerySale) + { + if (updatedBrewerySale == null) + return BadRequest(ModelState); + + if (brewerySaleId != updatedBrewerySale.SalesId) + return BadRequest(ModelState); + + var beer = _mapper.Map(_beerRepository.GetBeer(updatedBrewerySale.BeerId)); + + if (beer == null) + return BadRequest(ModelState); + + if (updatedBrewerySale.TotalPrice != beer.Price * updatedBrewerySale.Quantity) + return BadRequest(ModelState); + + if (!_brewerySalesRepository.BrewerySaleExists(brewerySaleId)) + return NotFound(); + + if (!ModelState.IsValid) + return BadRequest(); + + var brewerySaleMap = _mapper.Map(updatedBrewerySale); + + if (!_brewerySalesRepository.UpdateBrewerySales(brewerySaleMap)) + { + ModelState.AddModelError("", "Something went wrong updating brewerySale"); + return StatusCode(500, ModelState); + } + + return NoContent(); + } + + [HttpDelete("{brewerySaleId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult DeleteBrewerySale(int brewerySaleId) + { + if (!_brewerySalesRepository.BrewerySaleExists(brewerySaleId)) + { + return NotFound(); + } + + var brewerySaleToDelete = _brewerySalesRepository.GetBrewerySale (brewerySaleId); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + if (!_brewerySalesRepository.DeleteBrewerySales(brewerySaleToDelete)) + { + ModelState.AddModelError("", "Something went wrong deleting brewery"); + } + + return NoContent(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Controllers/WholesalerController.cs b/BreweryAPI/BreweryAPI/Controllers/WholesalerController.cs new file mode 100644 index 0000000..2b960ff --- /dev/null +++ b/BreweryAPI/BreweryAPI/Controllers/WholesalerController.cs @@ -0,0 +1,134 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Interface; +using BreweryAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace BreweryAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class WholesalerController: Controller + { + private readonly IWholesalerRepository _wholesalerRepository; + private readonly IMapper _mapper; + public WholesalerController(IWholesalerRepository wholesalerRepository, IMapper mapper) + { + _wholesalerRepository = wholesalerRepository; + _mapper = mapper; + } + + [HttpGet] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + public IActionResult GetWholesalers() + { + var wholesalers = _mapper.Map>(_wholesalerRepository.GetWholesalers()); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(wholesalers); + } + + [HttpGet("{wholesalerId}")] + [ProducesResponseType(200, Type = typeof(WholesalerModel))] + [ProducesResponseType(400)] + public IActionResult GetWholesaler(int wholesalerId) + { + if (!_wholesalerRepository.WholesalerExists(wholesalerId)) + return NotFound(); + + var wholesaler = _mapper.Map(_wholesalerRepository.GetWholesaler(wholesalerId)); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(wholesaler); + } + + [HttpPost] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + public IActionResult CreateWholesaler([FromBody] WholesalerDTO wholesalerCreate) + { + if (wholesalerCreate == null) + return BadRequest(ModelState); + + var wholesaler = _wholesalerRepository.GetWholesalers() + .Where(b => b.WholesalerName.Trim().ToUpper() == wholesalerCreate.WholesalerName.TrimEnd().ToUpper()) + .FirstOrDefault(); + + if (wholesaler != null) + { + ModelState.AddModelError("", "Wholesaler already exists"); + return StatusCode(422, ModelState); + } + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var wholesalerMap = _mapper.Map(wholesalerCreate); + + if (!_wholesalerRepository.CreateWholesaler(wholesalerMap)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + return Ok("Succesfully created"); + } + + [HttpPut("{wholesalerId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult UpdateWholesaler(int wholesalerId, [FromBody] WholesalerDTO updateWholesaler) + { + if (updateWholesaler == null) + return BadRequest(ModelState); + + if (wholesalerId != updateWholesaler.WholesalerID) + return BadRequest(ModelState); + + if (!_wholesalerRepository.WholesalerExists(wholesalerId)) + return NotFound(); + + if (!ModelState.IsValid) + return BadRequest(); + + var wholesalerMap = _mapper.Map(updateWholesaler); + + if (!_wholesalerRepository.UpdateWholesaler(wholesalerMap)) + { + ModelState.AddModelError("", "Something went wrong updating wholesaler"); + return StatusCode(500, ModelState); + } + + return NoContent(); + } + + [HttpDelete("{wholesalerId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult DeleteWholesaler(int wholesalerId) + { + if (!_wholesalerRepository.WholesalerExists(wholesalerId)) + { + return NotFound(); + } + + var wholesalerToDelete = _wholesalerRepository.GetWholesaler(wholesalerId); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + if (!_wholesalerRepository.DeleteWholesaler(wholesalerToDelete)) + { + ModelState.AddModelError("", "Something went wrong deleting wholesaler"); + } + + return NoContent(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Controllers/WholesalerInventoryController.cs b/BreweryAPI/BreweryAPI/Controllers/WholesalerInventoryController.cs new file mode 100644 index 0000000..29bc32f --- /dev/null +++ b/BreweryAPI/BreweryAPI/Controllers/WholesalerInventoryController.cs @@ -0,0 +1,142 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Interface; +using BreweryAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace BreweryAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class WholesalerInventoryController: Controller + { + private readonly IWholesalerInventoryRepository _wholesalerInventoryRepository; + private readonly IBeerRepository _beerRepository; + private readonly IMapper _mapper; + public WholesalerInventoryController(IWholesalerInventoryRepository wholesalerInventoryRepository, IBeerRepository beerRepository, IMapper mapper) + { + _wholesalerInventoryRepository = wholesalerInventoryRepository; + _beerRepository = beerRepository; + _mapper = mapper; + } + + [HttpGet] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + public IActionResult GetWholesalerInventories() + { + var wholesalerInventories = _mapper.Map>(_wholesalerInventoryRepository.GetWholesalerInventories()); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(wholesalerInventories); + } + + [HttpGet("{wholesalerInventoryId}")] + [ProducesResponseType(200, Type = typeof(WholesalerInventory))] + [ProducesResponseType(400)] + public IActionResult GetWholesalerInventory(int wholesalerInventoryId) + { + if (!_wholesalerInventoryRepository.WholesalerInventoryExists(wholesalerInventoryId)) + return NotFound(); + + var wholesaler = _mapper.Map(_wholesalerInventoryRepository.GetWholesalerInventory(wholesalerInventoryId)); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(wholesaler); + } + + [HttpPost] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + public IActionResult createWholesalerInventory([FromBody] WholesalerInventoryDTO wholesalerInventoryCreate) + { + if (wholesalerInventoryCreate == null) + return BadRequest(ModelState); + + var beer = _mapper.Map(_beerRepository.GetBeer(wholesalerInventoryCreate.BeerId)); + + if (beer == null) + return BadRequest(ModelState); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var wholesalerInventoryMap = _mapper.Map(wholesalerInventoryCreate); + + if (_wholesalerInventoryRepository.IsUniqueRecord(wholesalerInventoryMap)) + { + ModelState.AddModelError("", "Record already exists"); + return StatusCode(422, ModelState); + } + + if (!_wholesalerInventoryRepository.CreateWholesalerInventory(wholesalerInventoryMap)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + return Ok("Succesfully created"); + } + + [HttpPut("{wholesaleInventoryId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult updateWholesalerInventory(int wholesaleInventoryId, [FromBody] WholesalerInventoryDTO updateWholesaleInventory) + { + if (updateWholesaleInventory == null) + return BadRequest(ModelState); + + if (wholesaleInventoryId != updateWholesaleInventory.ItemId) + return BadRequest(ModelState); + + var beer = _mapper.Map(_beerRepository.GetBeer(updateWholesaleInventory.BeerId)); + + if (beer == null) + return BadRequest(ModelState); + + if (!_wholesalerInventoryRepository.WholesalerInventoryExists(wholesaleInventoryId)) + return NotFound(); + + if (!ModelState.IsValid) + return BadRequest(); + + var wholesaleInventoryMap = _mapper.Map(updateWholesaleInventory); + + if (!_wholesalerInventoryRepository.UpdateWholesalerInventory(wholesaleInventoryMap)) + { + ModelState.AddModelError("", "Something went wrong updating wholesaleInventory"); + return StatusCode(500, ModelState); + } + + return NoContent(); + } + + [HttpDelete("{wholesaleInventoryId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult DeleteWholesaleInventory(int wholesaleInventoryId) + { + if (!_wholesalerInventoryRepository.WholesalerInventoryExists(wholesaleInventoryId)) + { + return NotFound(); + } + + var wholesaleInventoryModel = _wholesalerInventoryRepository.GetWholesalerInventory(wholesaleInventoryId); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + if (!_wholesalerInventoryRepository.DeleteWholesalerInventory(wholesaleInventoryModel)) + { + ModelState.AddModelError("", "Something went wrong deleting wholesaleInventory"); + } + + return NoContent(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Controllers/WholesalerQuoteController.cs b/BreweryAPI/BreweryAPI/Controllers/WholesalerQuoteController.cs new file mode 100644 index 0000000..86b1aba --- /dev/null +++ b/BreweryAPI/BreweryAPI/Controllers/WholesalerQuoteController.cs @@ -0,0 +1,128 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Interface; +using BreweryAPI.Models; +using Microsoft.AspNetCore.Mvc; + +namespace BreweryAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class WholesalerQuoteController: Controller + { + private readonly IWholesalerInventoryRepository _wholesalerInventoryRepository; + private readonly IWholesalerQuoteRepository _wholesalerQuoteRepository; + private readonly IMapper _mapper; + + public WholesalerQuoteController(IWholesalerInventoryRepository wholesalerInventoryRepository, IWholesalerQuoteRepository wholesalerQuoteRepository, IMapper mapper) + { + _wholesalerInventoryRepository = wholesalerInventoryRepository; + _wholesalerQuoteRepository = wholesalerQuoteRepository; + _mapper = mapper; + } + + [HttpGet] + [ProducesResponseType(200, Type = typeof(IEnumerable))] + public IActionResult GetWholesalerQuotes() + { + var wholesalerQuotes = _mapper.Map>(_wholesalerQuoteRepository.GetWholesalerQuotes()); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(wholesalerQuotes); + } + + + [HttpGet("{wholesalerQuoteId}")] + [ProducesResponseType(200, Type = typeof(WholesalerQuoteModel))] + [ProducesResponseType(400)] + public IActionResult GetWholesalerQuote(int wholesalerQuoteId) + { + if (!_wholesalerQuoteRepository.WholesalerQuoteExists(wholesalerQuoteId)) + return NotFound(); + + var wholesalerQuoteMap = _mapper.Map(_wholesalerQuoteRepository.GetWholesalerQuote(wholesalerQuoteId)); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + return Ok(wholesalerQuoteMap); + } + + [HttpPost] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + public IActionResult CreateWholesalerQuote([FromBody] WholesalerQuoteDTO wholesalerQuoteCreate) + { + if (wholesalerQuoteCreate == null) + return BadRequest(ModelState); + + var wholesalerInventoryRecord = _mapper.Map(_wholesalerInventoryRepository.SelectRecord(wholesalerQuoteCreate.WholesalerId, wholesalerQuoteCreate.BeerId)); + + if (wholesalerInventoryRecord == null) + return BadRequest(ModelState); + + if(wholesalerQuoteCreate.Quantity > wholesalerInventoryRecord.Quantity) + { + return BadRequest(ModelState); + } + else + { + wholesalerInventoryRecord.Quantity = wholesalerInventoryRecord.Quantity - wholesalerQuoteCreate.Quantity; + } + + if(wholesalerQuoteCreate.Quantity > 10) + { + wholesalerQuoteCreate.TotalPrice = wholesalerQuoteCreate.TotalPrice * 90; + } + else if (wholesalerQuoteCreate.Quantity > 20) + { + wholesalerQuoteCreate.TotalPrice = wholesalerQuoteCreate.TotalPrice * 80; + } + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var wholesalerQuoteMap = _mapper.Map(wholesalerQuoteCreate); + + if (!_wholesalerQuoteRepository.CreateWholesalerQuote(wholesalerQuoteMap)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + if (!_wholesalerInventoryRepository.UpdateWholesalerInventory(wholesalerInventoryRecord)) + { + ModelState.AddModelError("", "something went wrong while saving"); + return StatusCode(500, ModelState); + } + + return Ok("Succesfully created"); + } + + [HttpDelete("{wholesalerQuoteId}")] + [ProducesResponseType(400)] + [ProducesResponseType(204)] + [ProducesResponseType(404)] + public IActionResult DeleteWholesalerQuote(int wholesalerQuoteId) + { + if (!_wholesalerQuoteRepository.WholesalerQuoteExists(wholesalerQuoteId)) + { + return NotFound(); + } + + var wholesalerQuoteToDelete = _wholesalerQuoteRepository.GetWholesalerQuote(wholesalerQuoteId); + + if (!ModelState.IsValid) + return BadRequest(ModelState); + + if (!_wholesalerQuoteRepository.DeleteWholesalerQuote(wholesalerQuoteToDelete)) + { + ModelState.AddModelError("", "Something went wrong deleting wholesaler"); + } + + return NoContent(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/DTOs/BeerDTO.cs b/BreweryAPI/BreweryAPI/DTOs/BeerDTO.cs new file mode 100644 index 0000000..19c39c1 --- /dev/null +++ b/BreweryAPI/BreweryAPI/DTOs/BeerDTO.cs @@ -0,0 +1,10 @@ +namespace BreweryAPI.DTOs +{ + public class BeerDTO + { + public int BeerId { get; set; } + public string BeerName { get; set; } + public decimal Price { get; set; } + public int BreweryId { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/DTOs/BreweryDTO.cs b/BreweryAPI/BreweryAPI/DTOs/BreweryDTO.cs new file mode 100644 index 0000000..849fbf8 --- /dev/null +++ b/BreweryAPI/BreweryAPI/DTOs/BreweryDTO.cs @@ -0,0 +1,9 @@ +namespace BreweryAPI.DTOs +{ + public class BreweryDTO + { + public int BreweryId { get; set; } + public string BreweryName { get; set; } + public string BreweryLocation { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/DTOs/BrewerySalesDTO.cs b/BreweryAPI/BreweryAPI/DTOs/BrewerySalesDTO.cs new file mode 100644 index 0000000..5969ba9 --- /dev/null +++ b/BreweryAPI/BreweryAPI/DTOs/BrewerySalesDTO.cs @@ -0,0 +1,11 @@ +namespace BreweryAPI.DTOs +{ + public class BrewerySalesDTO + { + public int SalesId { get; set; } + public int WholeSalerId { get; set; } + public int BeerId { get; set; } + public int Quantity { get; set; } + public decimal TotalPrice { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/DTOs/WholesalerDTO.cs b/BreweryAPI/BreweryAPI/DTOs/WholesalerDTO.cs new file mode 100644 index 0000000..4cef0d6 --- /dev/null +++ b/BreweryAPI/BreweryAPI/DTOs/WholesalerDTO.cs @@ -0,0 +1,9 @@ +namespace BreweryAPI.DTOs +{ + public class WholesalerDTO + { + public int WholesalerID { get; set; } + public string WholesalerName { get; set; } + public string WholesalerLocation { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/DTOs/WholesalerInventoryDTO.cs b/BreweryAPI/BreweryAPI/DTOs/WholesalerInventoryDTO.cs new file mode 100644 index 0000000..2227893 --- /dev/null +++ b/BreweryAPI/BreweryAPI/DTOs/WholesalerInventoryDTO.cs @@ -0,0 +1,10 @@ +namespace BreweryAPI.DTOs +{ + public class WholesalerInventoryDTO + { + public int ItemId { get; set; } + public int WholesalerId { get; set; } + public int BeerId { get; set; } + public int Quantity { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/DTOs/WholesalerQuoteDTO.cs b/BreweryAPI/BreweryAPI/DTOs/WholesalerQuoteDTO.cs new file mode 100644 index 0000000..b9a188c --- /dev/null +++ b/BreweryAPI/BreweryAPI/DTOs/WholesalerQuoteDTO.cs @@ -0,0 +1,12 @@ +namespace BreweryAPI.DTOs +{ + public class WholesalerQuoteDTO + { + public int QuoteId { get; set; } + public string ClientName { get; set; } + public int WholesalerId { get; set; } + public int BeerId { get; set; } + public int Quantity { get; set; } + public decimal TotalPrice { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/Helpers/MappingProfiles.cs b/BreweryAPI/BreweryAPI/Helpers/MappingProfiles.cs new file mode 100644 index 0000000..1ac51a5 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Helpers/MappingProfiles.cs @@ -0,0 +1,25 @@ +using AutoMapper; +using BreweryAPI.DTOs; +using BreweryAPI.Models; + +namespace BreweryAPI.Helpers +{ + public class MappingProfiles : Profile + { + public MappingProfiles() + { + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Interface/IBeerRepository.cs b/BreweryAPI/BreweryAPI/Interface/IBeerRepository.cs new file mode 100644 index 0000000..c2e99cb --- /dev/null +++ b/BreweryAPI/BreweryAPI/Interface/IBeerRepository.cs @@ -0,0 +1,16 @@ +using BreweryAPI.Models; + +namespace BreweryAPI.Interface +{ + public interface IBeerRepository + { + ICollection GetBeers(); + BeerModel GetBeer(int id); + bool CreateBeer(BeerModel beerModel); + bool UpdateBeer(BeerModel beerModel); + bool DeleteBeer(BeerModel beerModel); + public ICollection GetBeersByBrewery(int breweryId); + bool BeerExists(int id); + bool Save(); + } +} diff --git a/BreweryAPI/BreweryAPI/Interface/IBreweryRepository.cs b/BreweryAPI/BreweryAPI/Interface/IBreweryRepository.cs new file mode 100644 index 0000000..2589acb --- /dev/null +++ b/BreweryAPI/BreweryAPI/Interface/IBreweryRepository.cs @@ -0,0 +1,15 @@ +using BreweryAPI.Models; + +namespace BreweryAPI.Interface +{ + public interface IBreweryRepository + { + ICollection GetBreweries(); + BreweryModel GetBrewery(int id); + bool CreateBrewery(BreweryModel breweryModel); + bool UpdateBrewery(BreweryModel breweryModel); + bool DeleteBrewery(BreweryModel breweryModel); + bool BreweryExists(int id); + bool Save(); + } +} diff --git a/BreweryAPI/BreweryAPI/Interface/IBrewerySalesRepository.cs b/BreweryAPI/BreweryAPI/Interface/IBrewerySalesRepository.cs new file mode 100644 index 0000000..37f74c2 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Interface/IBrewerySalesRepository.cs @@ -0,0 +1,15 @@ +using BreweryAPI.Models; + +namespace BreweryAPI.Interface +{ + public interface IBrewerySalesRepository + { + ICollection GetBrewerySales(); + BrewerySalesModel GetBrewerySale(int id); + bool CreateBrewerySale(BrewerySalesModel brewerySalesModel); + bool UpdateBrewerySales(BrewerySalesModel brewerySalesModel); + bool DeleteBrewerySales(BrewerySalesModel brewerySalesModel); + bool BrewerySaleExists(int id); + bool Save(); + } +} diff --git a/BreweryAPI/BreweryAPI/Interface/IWholesalerInventoryRepository.cs b/BreweryAPI/BreweryAPI/Interface/IWholesalerInventoryRepository.cs new file mode 100644 index 0000000..cd42fcb --- /dev/null +++ b/BreweryAPI/BreweryAPI/Interface/IWholesalerInventoryRepository.cs @@ -0,0 +1,17 @@ +using BreweryAPI.Models; + +namespace BreweryAPI.Interface +{ + public interface IWholesalerInventoryRepository + { + ICollection GetWholesalerInventories(); + WholesalerInventory GetWholesalerInventory(int id); + bool CreateWholesalerInventory(WholesalerInventory wholesalerInventory); + bool UpdateWholesalerInventory(WholesalerInventory wholesalerInventory); + bool DeleteWholesalerInventory(WholesalerInventory wholesalerInventory); + bool WholesalerInventoryExists(int id); + bool Save(); + public bool IsUniqueRecord(WholesalerInventory wholesalerInventory); + public WholesalerInventory SelectRecord(int wholesalerId, int beerId); + } +} diff --git a/BreweryAPI/BreweryAPI/Interface/IWholesalerQuoteRepository.cs b/BreweryAPI/BreweryAPI/Interface/IWholesalerQuoteRepository.cs new file mode 100644 index 0000000..aeda2dc --- /dev/null +++ b/BreweryAPI/BreweryAPI/Interface/IWholesalerQuoteRepository.cs @@ -0,0 +1,15 @@ +using BreweryAPI.Models; + +namespace BreweryAPI.Interface +{ + public interface IWholesalerQuoteRepository + { + ICollection GetWholesalerQuotes(); + WholesalerQuoteModel GetWholesalerQuote(int id); + bool CreateWholesalerQuote(WholesalerQuoteModel wholesalerQuote); + bool UpdateWholesalerQuote(WholesalerQuoteModel wholesalerQuote); + bool DeleteWholesalerQuote(WholesalerQuoteModel wholesalerQuote); + bool WholesalerQuoteExists(int id); + bool Save(); + } +} diff --git a/BreweryAPI/BreweryAPI/Interface/IWholesalerRepository.cs b/BreweryAPI/BreweryAPI/Interface/IWholesalerRepository.cs new file mode 100644 index 0000000..3c4cc87 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Interface/IWholesalerRepository.cs @@ -0,0 +1,15 @@ +using BreweryAPI.Models; + +namespace BreweryAPI.Interface +{ + public interface IWholesalerRepository + { + ICollection GetWholesalers(); + WholesalerModel GetWholesaler(int id); + bool CreateWholesaler(WholesalerModel wholesalerModel); + bool UpdateWholesaler(WholesalerModel wholesalerModel); + bool DeleteWholesaler(WholesalerModel wholesalerModel); + bool WholesalerExists(int id); + bool Save(); + } +} diff --git a/BreweryAPI/BreweryAPI/Models/BeerModel.cs b/BreweryAPI/BreweryAPI/Models/BeerModel.cs new file mode 100644 index 0000000..4ac6067 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Models/BeerModel.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; + +namespace BreweryAPI.Models +{ + public class BeerModel + { + [Key] + public int BeerId { get; set; } + public string BeerName { get; set; } + public decimal Price { get; set; } + public int BreweryId { get; set; } + + public BreweryModel Brewery { get; set; } + public ICollection WholesalerInventories { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/Models/BreweryModel.cs b/BreweryAPI/BreweryAPI/Models/BreweryModel.cs new file mode 100644 index 0000000..65a7262 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Models/BreweryModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace BreweryAPI.Models +{ + public class BreweryModel + { + [Key] + public int BreweryId { get; set; } + public string BreweryName { get; set; } + public string BreweryLocation { get; set; } + + public ICollection Beers{get; set;} + } +} + diff --git a/BreweryAPI/BreweryAPI/Models/BrewerySalesModel.cs b/BreweryAPI/BreweryAPI/Models/BrewerySalesModel.cs new file mode 100644 index 0000000..4d5c723 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Models/BrewerySalesModel.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; + +namespace BreweryAPI.Models +{ + public class BrewerySalesModel + { + [Key] + public int SalesId { get; set; } + public int WholeSalerId { get; set; } + public int BeerId { get; set; } + public int Quantity { get; set; } + public decimal TotalPrice { get; set; } + + public WholesalerModel Wholesaler { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/Models/WholesalerInventory.cs b/BreweryAPI/BreweryAPI/Models/WholesalerInventory.cs new file mode 100644 index 0000000..0e5aea8 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Models/WholesalerInventory.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace BreweryAPI.Models +{ + public class WholesalerInventory + { + [Key] + public int ItemId { get; set; } + public int WholesalerId { get; set; } + public int BeerId { get; set; } + public int Quantity { get; set; } + + public WholesalerModel Wholesaler { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/Models/WholesalerModel.cs b/BreweryAPI/BreweryAPI/Models/WholesalerModel.cs new file mode 100644 index 0000000..39c0077 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Models/WholesalerModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace BreweryAPI.Models +{ + public class WholesalerModel + { + [Key] + public int WholesalerID { get; set; } + public string WholesalerName { get;set; } + public string WholesalerLocation { get; set; } + + public ICollection WholesalerInventories { get; set; } // One-to-many relationship to Inventories + public ICollection WholesalerQuote { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/Models/WholesalerQuoteModel.cs b/BreweryAPI/BreweryAPI/Models/WholesalerQuoteModel.cs new file mode 100644 index 0000000..fd4a8a8 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Models/WholesalerQuoteModel.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace BreweryAPI.Models +{ + public class WholesalerQuoteModel + { + [Key] + public int QuoteId { get; set; } + public string ClientName { get; set; } + public int WholesalerId { get; set; } + public int BeerId { get; set; } + public int Quantity { get; set; } + public decimal TotalPrice { get; set; } + + public WholesalerModel Wholesaler { get; set; } + } +} diff --git a/BreweryAPI/BreweryAPI/Program.cs b/BreweryAPI/BreweryAPI/Program.cs new file mode 100644 index 0000000..178984d --- /dev/null +++ b/BreweryAPI/BreweryAPI/Program.cs @@ -0,0 +1,71 @@ +using BreweryAPI; + +using BreweryAPI.Interface; +using BreweryAPI.Repositories; + +using Microsoft.EntityFrameworkCore; + +public class Program +{ + private static void Main(string[] args) + { + Context context; + bool isTestEnvironment = Environment.GetEnvironmentVariable("TEST_ENVIRONMENT")?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false; + + var builder = WebApplication.CreateBuilder(args); + + builder.Services.AddControllers(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + builder.Services.AddDbContext(options => + { + options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); + }); + + var app = builder.Build(); + + using (var scope = app.Services.CreateScope()) + { + context = scope.ServiceProvider.GetService(); + + try + { + if(!isTestEnvironment) + { + SeedData seedData = new SeedData(context); + seedData.SeedDataContext(); + } + + } + catch (Exception ex) + { + Console.WriteLine($"Database creation error: {ex.Message}"); + } + } + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseHttpsRedirection(); + + app.UseAuthorization(); + + app.MapControllers(); + + app.Run(); + } + + private static bool IsTestEnvironment(string[] args) + { + return args.Contains("--test-environment"); + } +} \ No newline at end of file diff --git a/BreweryAPI/BreweryAPI/Properties/launchSettings.json b/BreweryAPI/BreweryAPI/Properties/launchSettings.json new file mode 100644 index 0000000..05f6552 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:48553", + "sslPort": 44355 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5124", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7256;http://localhost:5124", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/BreweryAPI/BreweryAPI/Repositories/BeerRepository.cs b/BreweryAPI/BreweryAPI/Repositories/BeerRepository.cs new file mode 100644 index 0000000..6ac8be2 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Repositories/BeerRepository.cs @@ -0,0 +1,58 @@ +using BreweryAPI.Interface; +using BreweryAPI.Models; + +namespace BreweryAPI.Repositories +{ + public class BeerRepository : IBeerRepository + { + private readonly Context _context; + public BeerRepository(Context context) + { + _context = context; + } + + public bool BeerExists(int id) + { + return _context.Beers.Any(b => b.BeerId == id); + } + + public bool CreateBeer(BeerModel beerModel) + { + _context.Add(beerModel); + return Save(); + } + + public bool DeleteBeer(BeerModel beerModel) + { + _context.Remove(beerModel); + return Save(); + } + + public BeerModel GetBeer(int id) + { + return _context.Beers.Where(b => b.BeerId == id).FirstOrDefault(); + } + + public ICollection GetBeers() + { + return _context.Beers.ToList(); + } + + public ICollection GetBeersByBrewery(int breweryId) + { + return _context.Beers.Where(b => b.BreweryId == breweryId).ToList(); + } + + public bool Save() + { + var saved = _context.SaveChanges(); + return saved > 0 ? true : false; + } + + public bool UpdateBeer(BeerModel beerModel) + { + _context.Update(beerModel); + return Save(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Repositories/BreweryRepository.cs b/BreweryAPI/BreweryAPI/Repositories/BreweryRepository.cs new file mode 100644 index 0000000..cca8edd --- /dev/null +++ b/BreweryAPI/BreweryAPI/Repositories/BreweryRepository.cs @@ -0,0 +1,53 @@ +using BreweryAPI.Interface; +using BreweryAPI.Models; + +namespace BreweryAPI.Repositories +{ + public class BreweryRepository : IBreweryRepository + { + private readonly Context _context; + public BreweryRepository(Context context) + { + _context = context; + } + + public bool BreweryExists(int id) + { + return _context.Breweries.Any(c => c.BreweryId == id); + } + + public bool CreateBrewery(BreweryModel breweryModel) + { + _context.Add(breweryModel); + return Save(); + } + + public bool DeleteBrewery(BreweryModel breweryModel) + { + _context.Remove(breweryModel); + return Save(); + } + + public BreweryModel GetBrewery(int id) + { + return _context.Breweries.Where(b => b.BreweryId == id).FirstOrDefault(); + } + + public bool Save() + { + var saved = _context.SaveChanges(); + return saved > 0 ? true : false; + } + + public bool UpdateBrewery(BreweryModel breweryModel) + { + _context.Update(breweryModel); + return Save(); + } + + ICollection IBreweryRepository.GetBreweries() + { + return _context.Breweries.ToList(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Repositories/BrewerySalesRepository.cs b/BreweryAPI/BreweryAPI/Repositories/BrewerySalesRepository.cs new file mode 100644 index 0000000..8697a1e --- /dev/null +++ b/BreweryAPI/BreweryAPI/Repositories/BrewerySalesRepository.cs @@ -0,0 +1,53 @@ +using BreweryAPI.Interface; +using BreweryAPI.Models; + +namespace BreweryAPI.Repositories +{ + public class BrewerySalesRepository : IBrewerySalesRepository + { + private readonly Context _context; + public BrewerySalesRepository(Context context) + { + _context = context; + } + + public bool BrewerySaleExists(int id) + { + return _context.BrewerySales.Any(bs => bs.SalesId == id); + } + + public bool CreateBrewerySale(BrewerySalesModel brewerySalesModel) + { + _context.Add(brewerySalesModel); + return Save(); + } + + public bool DeleteBrewerySales(BrewerySalesModel brewerySalesModel) + { + _context.Remove(brewerySalesModel); + return Save(); + } + + public BrewerySalesModel GetBrewerySale(int id) + { + return _context.BrewerySales.Where(bs => bs.SalesId == id).FirstOrDefault(); + } + + public ICollection GetBrewerySales() + { + return _context.BrewerySales.ToList(); + } + + public bool Save() + { + var saved = _context.SaveChanges(); + return saved > 0 ? true : false; + } + + public bool UpdateBrewerySales(BrewerySalesModel brewerySalesModel) + { + _context.Update(brewerySalesModel); + return Save(); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Repositories/WholesalerInventoryRepository.cs b/BreweryAPI/BreweryAPI/Repositories/WholesalerInventoryRepository.cs new file mode 100644 index 0000000..8f3106b --- /dev/null +++ b/BreweryAPI/BreweryAPI/Repositories/WholesalerInventoryRepository.cs @@ -0,0 +1,63 @@ +using BreweryAPI.Interface; +using BreweryAPI.Models; + +namespace BreweryAPI.Repositories +{ + public class WholesalerInventoryRepository : IWholesalerInventoryRepository + { + private readonly Context _context; + public WholesalerInventoryRepository(Context context) + { + _context = context; + } + public bool CreateWholesalerInventory(WholesalerInventory wholesalerInventory) + { + _context.Add(wholesalerInventory); + return Save(); + } + + public bool DeleteWholesalerInventory(WholesalerInventory wholesalerInventory) + { + _context.Remove(wholesalerInventory); + return Save(); + } + + public ICollection GetWholesalerInventories() + { + return _context.WholesalerInventories.ToList(); + } + + public WholesalerInventory GetWholesalerInventory(int id) + { + return _context.WholesalerInventories.Where(wi => wi.ItemId == id).FirstOrDefault(); + } + + public bool Save() + { + var saved = _context.SaveChanges(); + return saved > 0 ? true : false; + } + + public bool UpdateWholesalerInventory(WholesalerInventory wholesalerInventory) + { + _context.Update(wholesalerInventory); + return Save(); + } + + public bool WholesalerInventoryExists(int id) + { + return _context.WholesalerInventories.Any(wi => wi.ItemId == id); + } + + public WholesalerInventory SelectRecord(int wholesalerId, int beerId) + { + return _context.WholesalerInventories.Where(wi => wi.WholesalerId == wholesalerId) + .Where(wi => wi.BeerId == beerId).FirstOrDefault(); + } + public bool IsUniqueRecord(WholesalerInventory wholesalerInventory) + { + return _context.WholesalerInventories.Where(wi => wi.WholesalerId == wholesalerInventory.WholesalerId) + .Any(wi => wi.BeerId == wholesalerInventory.BeerId); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Repositories/WholesalerQuoteRepository.cs b/BreweryAPI/BreweryAPI/Repositories/WholesalerQuoteRepository.cs new file mode 100644 index 0000000..e216555 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Repositories/WholesalerQuoteRepository.cs @@ -0,0 +1,53 @@ +using BreweryAPI.Interface; +using BreweryAPI.Models; + +namespace BreweryAPI.Repositories +{ + public class WholesalerQuoteRepository : IWholesalerQuoteRepository + { + private readonly Context _context; + public WholesalerQuoteRepository(Context context) + { + _context = context; + } + + public bool CreateWholesalerQuote(WholesalerQuoteModel wholesalerQuote) + { + _context.Add(wholesalerQuote); + return Save(); + } + + public bool DeleteWholesalerQuote(WholesalerQuoteModel wholesalerQuote) + { + _context.Remove(wholesalerQuote); + return Save(); + } + + public bool UpdateWholesalerQuote(WholesalerQuoteModel wholesalerQuote) + { + _context.Update(wholesalerQuote); + return Save(); + } + + public WholesalerQuoteModel GetWholesalerQuote(int id) + { + return _context.WholesalerQuotes.Where(wq => wq.QuoteId == id).FirstOrDefault(); + } + + public ICollection GetWholesalerQuotes() + { + return _context.WholesalerQuotes.ToList(); + } + + public bool Save() + { + var saved = _context.SaveChanges(); + return saved > 0 ? true : false; + } + + public bool WholesalerQuoteExists(int id) + { + return _context.WholesalerQuotes.Any(wq => wq.QuoteId == id); + } + } +} diff --git a/BreweryAPI/BreweryAPI/Repositories/WholesalerRepository.cs b/BreweryAPI/BreweryAPI/Repositories/WholesalerRepository.cs new file mode 100644 index 0000000..78bfa72 --- /dev/null +++ b/BreweryAPI/BreweryAPI/Repositories/WholesalerRepository.cs @@ -0,0 +1,54 @@ +using BreweryAPI.Interface; +using BreweryAPI.Models; + +namespace BreweryAPI.Repositories +{ + public class WholesalerRepository : IWholesalerRepository + { + private readonly Context _context + ; + public WholesalerRepository(Context context + ) + { + _context = context; + } + public bool CreateWholesaler(WholesalerModel wholesalerModel) + { + _context.Add(wholesalerModel ); + return Save(); + } + + public bool DeleteWholesaler(WholesalerModel wholesalerModel) + { + _context.Remove(wholesalerModel); + return Save(); + } + + public WholesalerModel GetWholesaler(int id) + { + return _context.Wholesalers.Where(w => w.WholesalerID == id).FirstOrDefault(); + } + + public ICollection GetWholesalers() + { + return _context.Wholesalers.ToList(); + } + + public bool Save() + { + var saved = _context.SaveChanges(); + return saved > 0 ? true : false; + } + + public bool UpdateWholesaler(WholesalerModel wholesalerModel) + { + _context.Update(wholesalerModel); + return Save(); + } + + public bool WholesalerExists(int id) + { + return _context.Wholesalers.Any(w => w.WholesalerID ==id); + } + } +} diff --git a/BreweryAPI/BreweryAPI/SeedData.cs b/BreweryAPI/BreweryAPI/SeedData.cs new file mode 100644 index 0000000..b08a6c3 --- /dev/null +++ b/BreweryAPI/BreweryAPI/SeedData.cs @@ -0,0 +1,149 @@ +using BreweryAPI.Models; + +namespace BreweryAPI +{ + public class SeedData + { + private readonly Context _context; + + public SeedData(Context context) + { + _context = context; + } + + public void SeedDataContext() + { + _context.Database.EnsureCreated(); + + if(!_context.Breweries.Any()) + { + var brewery1 = new BreweryModel + { + BreweryName = "SuperBock Casa da Cerveja", + BreweryLocation = "Porto" + }; + var brewery2 = new BreweryModel + { + BreweryName = "Sagres", + BreweryLocation = "Algarve" + }; + + _context.Breweries.AddRange(brewery1, brewery2); + _context.SaveChanges(); + } + + if(!_context.Beers.Any()) + { + var beer1 = new BeerModel + { + BeerName = "SuperBock", + Price = 1, + BreweryId = 1, + }; + var beer2 = new BeerModel + { + BeerName = "Abadia", + Price = 2, + BreweryId = 1, + }; + var beer3 = new BeerModel + { + BeerName = "Stout", + Price = 1, + BreweryId = 1, + }; + var beer4 = new BeerModel + { + BeerName = "Original", + Price = 1, + BreweryId = 2, + }; + var beer5 = new BeerModel + { + BeerName = "Bohemia", + Price = 3, + BreweryId = 2, + }; + + _context.Beers.AddRange(beer1, beer2, beer3, beer4, beer5); + _context.SaveChanges(); + } + + if (!_context.Wholesalers.Any()) + { + var wholesaler1 = new WholesalerModel + { + WholesalerName = "Solbel", + WholesalerLocation = "Lisboa" + }; + var wholesaler2 = new WholesalerModel + { + WholesalerName = "KBE", + WholesalerLocation = "Algarve" + }; + _context.Wholesalers.AddRange(wholesaler1, wholesaler2); + _context.SaveChanges(); + } + + if (!_context.BrewerySales.Any()) + { + var brewerySale1 = new BrewerySalesModel + { + WholeSalerId = 1, + BeerId = 1, + Quantity = 10, + TotalPrice = 10 + }; + var brewerySale2 = new BrewerySalesModel + { + WholeSalerId = 2, + BeerId = 2, + Quantity = 10, + TotalPrice = 30 + }; + _context.BrewerySales.AddRange(brewerySale1, brewerySale2); + _context.SaveChanges(); + } + + if (!_context.WholesalerInventories.Any()) + { + var wholesalerInventory1 = new WholesalerInventory + { + WholesalerId = 1, + BeerId = 1, + Quantity = 10, + }; + var wholesalerInventory2 = new WholesalerInventory + { + WholesalerId = 2, + BeerId = 2, + Quantity = 10, + }; + _context.WholesalerInventories.AddRange(wholesalerInventory1, wholesalerInventory2); + _context.SaveChanges(); + } + + if (!_context.WholesalerQuotes.Any()) + { + var wholesalerQuote1 = new WholesalerQuoteModel + { + ClientName = "Cervejeria Lima", + WholesalerId = 1, + BeerId = 1, + Quantity = 10, + TotalPrice = 10 + }; + var wholesalerQuote2 = new WholesalerQuoteModel + { + ClientName = "Bar Fritos", + WholesalerId = 2, + BeerId = 2, + Quantity = 10, + TotalPrice = 30 + }; + _context.WholesalerQuotes.AddRange(wholesalerQuote1, wholesalerQuote2); + _context.SaveChanges(); + } + } + } +} diff --git a/BreweryAPI/BreweryAPI/appsettings.Development.json b/BreweryAPI/BreweryAPI/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/BreweryAPI/BreweryAPI/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/BreweryAPI/BreweryAPI/appsettings.json b/BreweryAPI/BreweryAPI/appsettings.json new file mode 100644 index 0000000..2b6e344 --- /dev/null +++ b/BreweryAPI/BreweryAPI/appsettings.json @@ -0,0 +1,13 @@ +{ + "ConnectionStrings": { + "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=BreweryDb;Trusted_connection=True;", + "TestConnection": "Server=(localdb)\\MSSQLLocalDB;Database=TestBreweryDb;Trusted_connection=True;", + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/BreweryAPI/BreweryMaui/App.xaml b/BreweryAPI/BreweryMaui/App.xaml new file mode 100644 index 0000000..de7c2b1 --- /dev/null +++ b/BreweryAPI/BreweryMaui/App.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/BreweryAPI/BreweryMaui/App.xaml.cs b/BreweryAPI/BreweryMaui/App.xaml.cs new file mode 100644 index 0000000..3ee963e --- /dev/null +++ b/BreweryAPI/BreweryMaui/App.xaml.cs @@ -0,0 +1,12 @@ +namespace BreweryMaui +{ + public partial class App : Application + { + public App() + { + InitializeComponent(); + + MainPage = new AppShell(); + } + } +} \ No newline at end of file diff --git a/BreweryAPI/BreweryMaui/AppShell.xaml b/BreweryAPI/BreweryMaui/AppShell.xaml new file mode 100644 index 0000000..0ef6964 --- /dev/null +++ b/BreweryAPI/BreweryMaui/AppShell.xaml @@ -0,0 +1,13 @@ + + + + + + diff --git a/BreweryAPI/BreweryMaui/AppShell.xaml.cs b/BreweryAPI/BreweryMaui/AppShell.xaml.cs new file mode 100644 index 0000000..df058a1 --- /dev/null +++ b/BreweryAPI/BreweryMaui/AppShell.xaml.cs @@ -0,0 +1,10 @@ +namespace BreweryMaui +{ + public partial class AppShell : Shell + { + public AppShell() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/BreweryAPI/BreweryMaui/BreweryMaui.csproj b/BreweryAPI/BreweryMaui/BreweryMaui.csproj new file mode 100644 index 0000000..800160b --- /dev/null +++ b/BreweryAPI/BreweryMaui/BreweryMaui.csproj @@ -0,0 +1,73 @@ + + + + + $(TargetFrameworks);net7.0-windows10.0.19041.0 + + + Exe + BreweryMaui + true + true + enable + + + BreweryMaui + + + com.companyname.brewerymaui + ecd6b752-e1fe-41da-8bc6-1b60255d003e + + + 1.0 + 1 + + + 10.0.17763.0 + 10.0.17763.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\BreweryAPI\bin\Debug\net7.0\BreweryAPI.dll + + + + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + + diff --git a/BreweryAPI/BreweryMaui/MauiProgram.cs b/BreweryAPI/BreweryMaui/MauiProgram.cs new file mode 100644 index 0000000..6e4439e --- /dev/null +++ b/BreweryAPI/BreweryMaui/MauiProgram.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Logging; + +namespace BreweryMaui +{ + public static class MauiProgram + { + public static MauiApp CreateMauiApp() + { + var builder = MauiApp.CreateBuilder(); + builder + .UseMauiApp() + .ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("CroissantOne-Regular.ttf", "CroissantOneRegular"); + }); + +#if DEBUG + builder.Logging.AddDebug(); +#endif + + return builder.Build(); + } + } +} \ No newline at end of file diff --git a/BreweryAPI/BreweryMaui/Pages/BreweryMainPage.xaml b/BreweryAPI/BreweryMaui/Pages/BreweryMainPage.xaml new file mode 100644 index 0000000..a1e1be2 --- /dev/null +++ b/BreweryAPI/BreweryMaui/Pages/BreweryMainPage.xaml @@ -0,0 +1,101 @@ + + + + + + + +