diff --git a/MyFirstBlazor/BlazingPizza/Controllers/OrdersController.cs b/MyFirstBlazor/BlazingPizza/Controllers/OrdersController.cs new file mode 100644 index 0000000..077bbd2 --- /dev/null +++ b/MyFirstBlazor/BlazingPizza/Controllers/OrdersController.cs @@ -0,0 +1,47 @@ +using BlazingPizza.Data; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace BlazingPizza.Controllers +{ + [Route("orders")] + [ApiController] + public class OrdersController : Controller + { + private readonly PizzaStoreContext _db; + + public OrdersController(PizzaStoreContext db) + { + _db = db; + } + + [HttpGet] + public async Task>> GetOrders() + { + var orders = await _db.Orders + .Include(o => o.Pizzas).ThenInclude(p => p.Special) + .Include(o => o.Pizzas).ThenInclude(p => p.Toppings).ThenInclude(t => t.Topping) + .OrderByDescending(o => o.CreatedTime) + .ToListAsync(); + + return orders.Select(o => OrderWithStatus.FromOrder(o)).ToList(); + } + + [HttpPost] + public async Task> PlaceOrder(Order order) + { + order.CreatedTime = DateTime.Now; + + foreach (var pizza in order.Pizzas) + { + pizza.SpecialId = pizza.Special.Id; + pizza.Special = null; + } + + _db.Orders.Attach(order); + await _db.SaveChangesAsync(); + + return order.OrderId; + } + } +} diff --git a/MyFirstBlazor/BlazingPizza/Data/PizzaStoreContext.cs b/MyFirstBlazor/BlazingPizza/Data/PizzaStoreContext.cs index 0a0cad5..aad8d9a 100644 --- a/MyFirstBlazor/BlazingPizza/Data/PizzaStoreContext.cs +++ b/MyFirstBlazor/BlazingPizza/Data/PizzaStoreContext.cs @@ -5,10 +5,22 @@ namespace BlazingPizza.Data public class PizzaStoreContext : DbContext { public DbSet Specials { get; set; } + public DbSet Orders { get; set; } + public DbSet Pizzas { get; set; } + public DbSet Toppings { get; set; } public PizzaStoreContext(DbContextOptions options) : base(options) { } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity().HasKey(pt => new { pt.PizzaId, pt.ToppingId }); + modelBuilder.Entity().HasOne().WithMany(p => p.Toppings); + modelBuilder.Entity().HasOne(pt => pt.Topping).WithMany(); + } } } diff --git a/MyFirstBlazor/BlazingPizza/Pages/Checkout.razor b/MyFirstBlazor/BlazingPizza/Pages/Checkout.razor index 8f4bdaa..164480d 100644 --- a/MyFirstBlazor/BlazingPizza/Pages/Checkout.razor +++ b/MyFirstBlazor/BlazingPizza/Pages/Checkout.razor @@ -10,10 +10,14 @@ - +
Get Pizza
-
+ + + +
My orders
+
@@ -40,11 +44,22 @@
- @code { Order Order => OrderState.Order; + bool isSubmitting; + + async Task PlaceOrder() + { + isSubmitting = true; + var response = await HttpClient.PostAsJsonAsync(NavigationManager.BaseUri + "orders", OrderState.Order); + var newOrderId = await response.Content.ReadFromJsonAsync(); + OrderState.ResetOrder(); + + NavigationManager.NavigateTo("/"); + } } diff --git a/MyFirstBlazor/BlazingPizza/Pages/Index.razor b/MyFirstBlazor/BlazingPizza/Pages/Index.razor index dc48366..35971d9 100644 --- a/MyFirstBlazor/BlazingPizza/Pages/Index.razor +++ b/MyFirstBlazor/BlazingPizza/Pages/Index.razor @@ -9,10 +9,15 @@ - + +
Get Pizza
-
+ + + +
My orders
+
diff --git a/MyFirstBlazor/BlazingPizza/Pages/MyOrders.razor b/MyFirstBlazor/BlazingPizza/Pages/MyOrders.razor new file mode 100644 index 0000000..da619f8 --- /dev/null +++ b/MyFirstBlazor/BlazingPizza/Pages/MyOrders.razor @@ -0,0 +1,67 @@ +@page "/myorders" +@inject HttpClient HttpClient +@inject NavigationManager NavigationManager + +
+ + + + +
Get Pizza
+
+ + +
My orders
+
+
+ +
+ @if (_ordersWithStatus == null) + { + Loading... + } + else if (!_ordersWithStatus.Any()) + { +

No orders placed

+ Order some pizza + } + else + { +
+ @foreach (var item in _ordersWithStatus) + { +
+
+
@item.Order.CreatedTime.ToLongDateString()
+ Items: + @item.Order.Pizzas.Count() + Total price: + @item.Order.GetFormattedTotalPrice() +
+
+ Status: @item.StatusText +
+ @if (item.StatusText != "Delivered") + { + + } +
+ } +
+ } +
+ +@code { + List _ordersWithStatus = new List(); + + protected override async Task OnParametersSetAsync() + { + _ordersWithStatus = await HttpClient.GetFromJsonAsync>($"{NavigationManager.BaseUri}orders"); + } +} diff --git a/MyFirstBlazor/BlazingPizza/Services/OrderState.cs b/MyFirstBlazor/BlazingPizza/Services/OrderState.cs index 4e3a4df..6b52a16 100644 --- a/MyFirstBlazor/BlazingPizza/Services/OrderState.cs +++ b/MyFirstBlazor/BlazingPizza/Services/OrderState.cs @@ -37,5 +37,10 @@ { Order.Pizzas.Remove(pizza); } + + public void ResetOrder() + { + Order = new Order(); + } } } diff --git a/MyFirstBlazor/BlazingPizza/pizza.db b/MyFirstBlazor/BlazingPizza/pizza.db index e70c7e0..e2a2455 100644 Binary files a/MyFirstBlazor/BlazingPizza/pizza.db and b/MyFirstBlazor/BlazingPizza/pizza.db differ diff --git a/MyFirstBlazor/BlazingPizza/pizza.db-shm b/MyFirstBlazor/BlazingPizza/pizza.db-shm index fe9ac28..17063f4 100644 Binary files a/MyFirstBlazor/BlazingPizza/pizza.db-shm and b/MyFirstBlazor/BlazingPizza/pizza.db-shm differ diff --git a/MyFirstBlazor/BlazingPizza/pizza.db-wal b/MyFirstBlazor/BlazingPizza/pizza.db-wal index e69de29..6f5d03e 100644 Binary files a/MyFirstBlazor/BlazingPizza/pizza.db-wal and b/MyFirstBlazor/BlazingPizza/pizza.db-wal differ