Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added BreweryAPI/BreweryAPI schema.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 39 additions & 0 deletions BreweryAPI/BreweryAPI.sln
Original file line number Diff line number Diff line change
@@ -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
25 changes: 25 additions & 0 deletions BreweryAPI/BreweryAPI/BreweryAPI.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="Microsoft.AspNet.Mvc" Version="5.2.9" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.9" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="7.0.0" />
</ItemGroup>

</Project>
19 changes: 19 additions & 0 deletions BreweryAPI/BreweryAPI/Context.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using BreweryAPI.Models;
using Microsoft.EntityFrameworkCore;

namespace BreweryAPI
{
public class Context : DbContext
{
public DbSet<BreweryModel> Breweries { get; set; }
public DbSet<BeerModel> Beers { get; set; }
public DbSet<BrewerySalesModel> BrewerySales { get; set; }
public DbSet<WholesalerModel> Wholesalers { get; set; }
public DbSet<WholesalerInventory> WholesalerInventories { get; set; }
public DbSet<WholesalerQuoteModel> WholesalerQuotes { get; set; }

public Context (DbContextOptions<Context> options) : base (options)
{
}
}
}
156 changes: 156 additions & 0 deletions BreweryAPI/BreweryAPI/Controllers/BeerController.cs
Original file line number Diff line number Diff line change
@@ -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<BeerModel>))]
public IActionResult GetBeers()
{
var beers = _mapper.Map<List<BeerDTO>>(_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<BeerDTO>(_beerRepository.GetBeer(beerId));

if (!ModelState.IsValid)
return BadRequest(ModelState);

return Ok(beer);
}

[HttpGet("{breweryId}")]
[ProducesResponseType(200, Type = typeof(IEnumerable<BeerModel>))]
[ProducesResponseType(400)]
public IActionResult GetBeersByBrewery(int breweryId)
{
if (!_breweryRepository.BreweryExists(breweryId))
return NotFound();

var beersByBrewery = _mapper.Map<List<BeerDTO>>(_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<BeerModel>(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<BeerModel>(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();
}
}
}
135 changes: 135 additions & 0 deletions BreweryAPI/BreweryAPI/Controllers/BreweryController.cs
Original file line number Diff line number Diff line change
@@ -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<BreweryModel>))]
public IActionResult GetBreweries()
{
var breweries = _mapper.Map<List<BreweryDTO>>(_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<BreweryDTO>(_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<BreweryModel>(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<BreweryModel>(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();
}
}
}
Loading