From fb834a11187cc8be90b048ae2b226807a45ed6d3 Mon Sep 17 00:00:00 2001 From: syneffort Date: Fri, 8 Mar 2024 17:16:52 +0900 Subject: [PATCH] blazing pizza - checkout and my order page --- .../Controllers/OrdersController.cs | 47 ++++++++++++ .../BlazingPizza/Data/PizzaStoreContext.cs | 12 ++++ .../BlazingPizza/Pages/Checkout.razor | 21 +++++- MyFirstBlazor/BlazingPizza/Pages/Index.razor | 9 ++- .../BlazingPizza/Pages/MyOrders.razor | 67 ++++++++++++++++++ .../BlazingPizza/Services/OrderState.cs | 5 ++ MyFirstBlazor/BlazingPizza/pizza.db | Bin 12288 -> 4096 bytes MyFirstBlazor/BlazingPizza/pizza.db-shm | Bin 32768 -> 32768 bytes MyFirstBlazor/BlazingPizza/pizza.db-wal | Bin 0 -> 148352 bytes 9 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 MyFirstBlazor/BlazingPizza/Controllers/OrdersController.cs create mode 100644 MyFirstBlazor/BlazingPizza/Pages/MyOrders.razor 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 e70c7e0960bd9b92ccb3000555ed932cf1352d96..e2a2455a104f1cf6a5d6b143f3ac8831aaaf3ab5 100644 GIT binary patch delta 32 mcmZojXi%6S&C1BYz`!`M(4L!-LC?RI7sz7}*es|pjUNDQNd_PQ literal 12288 zcmeI&(QeZ^7zgmQgAO6O9SK#tK$AXt1JkOGa#W!TA!tX0!n&?>8JyjKywpv6md3$$ zs5G6xcFdQaQO__l|oj;s% z*?9usI8GV2HQb6)!XHQakvh5tJeWb-5b}z8~E-scLakY9|kA=KI|V2 zj{Q*=k3)TU@aEfD!;yE`9i75~dkWnX|HvC){-HbY8_T!>URND__pe1#ak$4cA1V=C zwk=00+MjYAD3KZ=lb@XJO3%hD#F?fc>f+diOiwg!b zVInXRU(HIcfhA)&V_L*w8t&yC^xpI`srh#r9;{cKo!UYBB@aWv;VF+r7@1b9+4jsG z4Y4@qpjphu4LHjT$OPD8q?N?H-G-f9tvI{2R}T*}9VscN(3kJH(wKJ7GY~Ni(`Acp zf~S)^226x6k>%MtAv67WC9~*gW7U;)XLsxU&2}%FOjs--h(vJClh*y_gZ6PMf_ZVI z0g*I#y;;B)_a5^M+c?*}0b#}zOAO~@1cDh;Q<%#PvUGJ=&dl77IbN$cdo}rJKW18s z08*Z&T**YV?k#Cd#FyqaB~*NdQMvzusu!~hk%ab&Zm*1R8DvL!UdBC zG*XERsgSJGS(>>oU0nK~3!FJr&XIhz%@T!?|y#MFtiVaePZ(2 z%q8Zz%ory+u;@*A70qELvv_Rh!`{mbm2jr{>U=B^?KpP*U)ucQ;D-tckN^pg011!) c36KB@kN^pg011%5|3=_OX>Gey{2AfeSK6Ug5dZ)H diff --git a/MyFirstBlazor/BlazingPizza/pizza.db-shm b/MyFirstBlazor/BlazingPizza/pizza.db-shm index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..17063f4fec369a1641731d229372341b5400f10d 100644 GIT binary patch literal 32768 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