/
BeerDetailController.cs
110 lines (100 loc) · 4.41 KB
/
BeerDetailController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WebApi.Hal.Web.Api.Resources;
using WebApi.Hal.Web.Data;
namespace WebApi.Hal.Web.Api
{
[Route("[controller]")]
public class BeerDetailController : Controller
{
readonly IBeerDbContext beerDbContext;
public BeerDetailController(IBeerDbContext beerDbContext)
{
this.beerDbContext = beerDbContext;
}
[HttpGet("{id}")]
// GET beerdetail/5
public BeerDetailRepresentation Get(int id)
{
var beer = beerDbContext.Beers
.Include("Brewery") // lazy loading isn't on for this query; force loading
.Include("BeerStyle")
.Single(br => br.Id == id);
var reviews = beerDbContext.Reviews
.Where(r => r.Beer_Id == id)
.ToList()
.Select(s => new ReviewRepresentation
{
Id = s.Id,
Beer_Id = s.Beer_Id,
Title = s.Title,
Content = s.Content
})
.ToList();
var detail = new BeerDetailRepresentation
{
Id = beer.Id,
Name = beer.Name,
Style = new BeerStyleRepresentation {Id = beer.Style.Id, Name = beer.Style.Name},
Brewery = new BreweryRepresentation {Id = beer.Brewery.Id, Name = beer.Brewery.Name}
};
if (reviews.Count > 0)
{
detail.Reviews = new List<ReviewRepresentation>();
foreach (var review in reviews)
detail.Reviews.Add(review);
}
return detail;
}
[HttpPut("{id}")]
// PUT beerdetail/5
public void Put(int id, BeerDetailRepresentation beer)
{
// this is here just to see how the deserializer is working
// we should get the links and all the embedded objects deserialized
// we'd be better off creating a client to test the full deserializing, but this way is cheap for now
}
[HttpGet("largeset")]
public async Task<BeerDetailListRepresentation> GetLargeSet(int setSize = 500)
{
var random = new Random();
var largeSet = new BeerDetailRepresentation[setSize];
Parallel.For(0, setSize, index =>
{
largeSet[index] = new BeerDetailRepresentation
{
Id = index + 1,
Name = $"Test beer name {Guid.NewGuid()}",
Reviews = new List<ReviewRepresentation>(),
Style = new BeerStyleRepresentation
{
Id = random.Next(1, 50),
Name = $"Test beer style name {Guid.NewGuid()}"
},
Brewery = new BreweryRepresentation
{
Id = random.Next(1, 10),
Name = $"Test brewery name {Guid.NewGuid()}"
}
};
var numberOfReviews = random.Next(2, 20);
for (var reviewIndex = 0; reviewIndex < numberOfReviews; reviewIndex++)
{
largeSet[index].Reviews.Add(new ReviewRepresentation
{
Id = random.Next(setSize * 10, setSize * 100) + largeSet[index].Id,
Content = $"Test beer review content {Guid.NewGuid()}",
Title = $"Test beer review title {Guid.NewGuid()}",
Beer_Id = largeSet[index].Id
});
}
});
await Task.CompletedTask;
return new BeerDetailListRepresentation(largeSet, largeSet.Length, 1, 1, LinkTemplates.BeerDetails.GetBeerDetail);
}
}
}