blazing pizza - checkout and my order page

main
syneffort 1 year ago
parent b00ce845d3
commit fb834a1118
  1. 47
      MyFirstBlazor/BlazingPizza/Controllers/OrdersController.cs
  2. 12
      MyFirstBlazor/BlazingPizza/Data/PizzaStoreContext.cs
  3. 21
      MyFirstBlazor/BlazingPizza/Pages/Checkout.razor
  4. 9
      MyFirstBlazor/BlazingPizza/Pages/Index.razor
  5. 67
      MyFirstBlazor/BlazingPizza/Pages/MyOrders.razor
  6. 5
      MyFirstBlazor/BlazingPizza/Services/OrderState.cs
  7. BIN
      MyFirstBlazor/BlazingPizza/pizza.db
  8. BIN
      MyFirstBlazor/BlazingPizza/pizza.db-shm
  9. BIN
      MyFirstBlazor/BlazingPizza/pizza.db-wal

@ -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<ActionResult<List<OrderWithStatus>>> 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<ActionResult<int>> 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;
}
}
}

@ -5,10 +5,22 @@ namespace BlazingPizza.Data
public class PizzaStoreContext : DbContext
{
public DbSet<PizzaSpecial> Specials { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Pizza> Pizzas { get; set; }
public DbSet<Topping> Toppings { get; set; }
public PizzaStoreContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<PizzaTopping>().HasKey(pt => new { pt.PizzaId, pt.ToppingId });
modelBuilder.Entity<PizzaTopping>().HasOne<Pizza>().WithMany(p => p.Toppings);
modelBuilder.Entity<PizzaTopping>().HasOne(pt => pt.Topping).WithMany();
}
}
}

@ -10,10 +10,14 @@
<img src="/img/logo.svg" />
</a>
<a class="nav-tab" href="">
<NavLink class="nav-tab" href="" Match="NavLinkMatch.All">
<img src="/img/pizza-slice.svg" />
<div>Get Pizza</div>
</a>
</NavLink>
<NavLink class="nav-tab" href="myorders">
<img src="img/bike.svg" />
<div>My orders</div>
</NavLink>
</div>
<div class="main">
@ -40,11 +44,22 @@
</div>
</div>
<button class="checkout-button btn btn-warning">
<button class="checkout-button btn btn-warning" @onclick="PlaceOrder" disabled="@isSubmitting">
Place order
</button>
</div>
@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<int>();
OrderState.ResetOrder();
NavigationManager.NavigateTo("/");
}
}

@ -9,10 +9,15 @@
<a class="logo" href="">
<img src="/img/logo.svg" />
</a>
<a class="nav-tab active" href="">
<NavLink class="nav-tab" href="" Match="NavLinkMatch.All">
<img src="/img/pizza-slice.svg" />
<div>Get Pizza</div>
</a>
</NavLink>
<NavLink class="nav-tab" href="myorders">
<img src="img/bike.svg" />
<div>My orders</div>
</NavLink>
</div>
<div class="main">

@ -0,0 +1,67 @@
@page "/myorders"
@inject HttpClient HttpClient
@inject NavigationManager NavigationManager
<div class="top-bar">
<a class="logo" href="">
<img src="img/logo.svg" />
</a>
<NavLink class="nav-tab" href="" Match="NavLinkMatch.All">
<img src="/img/pizza-slice.svg" />
<div>Get Pizza</div>
</NavLink>
<NavLink class="nav-tab" href="myorders" Match="NavLinkMatch.All">
<img src="img/bike.svg" />
<div>My orders</div>
</NavLink>
</div>
<div class="main">
@if (_ordersWithStatus == null)
{
<text>Loading...</text>
}
else if (!_ordersWithStatus.Any())
{
<h2>No orders placed</h2>
<a class="btn btn-success" href="">Order some pizza</a>
}
else
{
<div class="list-group orders-list">
@foreach (var item in _ordersWithStatus)
{
<div class="list-group-item">
<div class="col">
<h5>@item.Order.CreatedTime.ToLongDateString()</h5>
Items:
<strong>@item.Order.Pizzas.Count()</strong>
Total price:
<string>@item.Order.GetFormattedTotalPrice()</string>
</div>
<div class="col">
Status: <strong>@item.StatusText</strong>
</div>
@if (item.StatusText != "Delivered")
{
<div class="col flex-grow-0">
<a class="btn btn-success" href="myorders/">
Track >
</a>
</div>
}
</div>
}
</div>
}
</div>
@code {
List<OrderWithStatus> _ordersWithStatus = new List<OrderWithStatus>();
protected override async Task OnParametersSetAsync()
{
_ordersWithStatus = await HttpClient.GetFromJsonAsync<List<OrderWithStatus>>($"{NavigationManager.BaseUri}orders");
}
}

@ -37,5 +37,10 @@
{
Order.Pizzas.Remove(pizza);
}
public void ResetOrder()
{
Order = new Order();
}
}
}

Loading…
Cancel
Save