build out checkout form
This commit is contained in:
12
FakePieShop/Controllers/ContactController.cs
Normal file
12
FakePieShop/Controllers/ContactController.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace FakePieShop.Controllers
|
||||
{
|
||||
public class ContactController : Controller
|
||||
{
|
||||
public IActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
}
|
||||
22
FakePieShop/Controllers/OrderController.cs
Normal file
22
FakePieShop/Controllers/OrderController.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using FakePieShop.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace BethanysPieShop.Controllers
|
||||
{
|
||||
public class OrderController : Controller
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly IShoppingCart _shoppingCart;
|
||||
|
||||
public OrderController(IOrderRepository orderRepository, IShoppingCart shoppingCart)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
_shoppingCart = shoppingCart;
|
||||
}
|
||||
|
||||
public IActionResult Checkout()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
}
|
||||
266
FakePieShop/Migrations/20231103202102_AddOrderSupport.Designer.cs
generated
Normal file
266
FakePieShop/Migrations/20231103202102_AddOrderSupport.Designer.cs
generated
Normal file
@@ -0,0 +1,266 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using FakePieShop.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace FakePieShop.Migrations
|
||||
{
|
||||
[DbContext(typeof(FakePieShopDbContext))]
|
||||
[Migration("20231103202102_AddOrderSupport")]
|
||||
partial class AddOrderSupport
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "7.0.13")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||
|
||||
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Category", b =>
|
||||
{
|
||||
b.Property<int>("CategoryId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("CategoryId"));
|
||||
|
||||
b.Property<string>("CategoryName")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.HasKey("CategoryId");
|
||||
|
||||
b.ToTable("Categories");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Order", b =>
|
||||
{
|
||||
b.Property<int>("OrderId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("OrderId"));
|
||||
|
||||
b.Property<string>("AddressLine1")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<string>("AddressLine2")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("City")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("Country")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("FirstName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("LastName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<DateTime>("OrderPlaced")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<decimal>("OrderTotal")
|
||||
.HasColumnType("decimal(18,2)");
|
||||
|
||||
b.Property<string>("PhoneNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(25)
|
||||
.HasColumnType("nvarchar(25)");
|
||||
|
||||
b.Property<string>("State")
|
||||
.HasMaxLength(10)
|
||||
.HasColumnType("nvarchar(10)");
|
||||
|
||||
b.Property<string>("ZipCode")
|
||||
.IsRequired()
|
||||
.HasMaxLength(10)
|
||||
.HasColumnType("nvarchar(10)");
|
||||
|
||||
b.HasKey("OrderId");
|
||||
|
||||
b.ToTable("Orders");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.OrderDetail", b =>
|
||||
{
|
||||
b.Property<int>("OrderDetailId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("OrderDetailId"));
|
||||
|
||||
b.Property<int>("Amount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("OrderId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("PieId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<decimal>("Price")
|
||||
.HasColumnType("decimal(18,2)");
|
||||
|
||||
b.HasKey("OrderDetailId");
|
||||
|
||||
b.HasIndex("OrderId");
|
||||
|
||||
b.HasIndex("PieId");
|
||||
|
||||
b.ToTable("OrderDetails");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Pie", b =>
|
||||
{
|
||||
b.Property<int>("PieId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("PieId"));
|
||||
|
||||
b.Property<string>("AllergyInformation")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<int>("CategoryId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("ImageThumbnailUrl")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("ImageUrl")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<bool>("InStock")
|
||||
.HasColumnType("bit");
|
||||
|
||||
b.Property<bool>("IsPieOfTheWeek")
|
||||
.HasColumnType("bit");
|
||||
|
||||
b.Property<string>("LongDescription")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<decimal>("Price")
|
||||
.HasColumnType("decimal(18,2)");
|
||||
|
||||
b.Property<string>("ShortDescription")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.HasKey("PieId");
|
||||
|
||||
b.HasIndex("CategoryId");
|
||||
|
||||
b.ToTable("Pies");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.ShoppingCartItem", b =>
|
||||
{
|
||||
b.Property<int>("ShoppingCartItemId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ShoppingCartItemId"));
|
||||
|
||||
b.Property<int>("Amount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("PieId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("ShoppingCartId")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.HasKey("ShoppingCartItemId");
|
||||
|
||||
b.HasIndex("PieId");
|
||||
|
||||
b.ToTable("ShoppingCartItems");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.OrderDetail", b =>
|
||||
{
|
||||
b.HasOne("FakePieShop.Models.Order", "Order")
|
||||
.WithMany("OrderDetails")
|
||||
.HasForeignKey("OrderId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("FakePieShop.Models.Pie", "Pie")
|
||||
.WithMany()
|
||||
.HasForeignKey("PieId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Order");
|
||||
|
||||
b.Navigation("Pie");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Pie", b =>
|
||||
{
|
||||
b.HasOne("FakePieShop.Models.Category", "Category")
|
||||
.WithMany("Pies")
|
||||
.HasForeignKey("CategoryId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Category");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.ShoppingCartItem", b =>
|
||||
{
|
||||
b.HasOne("FakePieShop.Models.Pie", "Pie")
|
||||
.WithMany()
|
||||
.HasForeignKey("PieId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Pie");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Category", b =>
|
||||
{
|
||||
b.Navigation("Pies");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Order", b =>
|
||||
{
|
||||
b.Navigation("OrderDetails");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
||||
87
FakePieShop/Migrations/20231103202102_AddOrderSupport.cs
Normal file
87
FakePieShop/Migrations/20231103202102_AddOrderSupport.cs
Normal file
@@ -0,0 +1,87 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace FakePieShop.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddOrderSupport : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Orders",
|
||||
columns: table => new
|
||||
{
|
||||
OrderId = table.Column<int>(type: "int", nullable: false)
|
||||
.Annotation("SqlServer:Identity", "1, 1"),
|
||||
FirstName = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||
LastName = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||
AddressLine1 = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
||||
AddressLine2 = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
||||
ZipCode = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false),
|
||||
City = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||
State = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: true),
|
||||
Country = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||
PhoneNumber = table.Column<string>(type: "nvarchar(25)", maxLength: 25, nullable: false),
|
||||
Email = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
||||
OrderTotal = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
|
||||
OrderPlaced = table.Column<DateTime>(type: "datetime2", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Orders", x => x.OrderId);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "OrderDetails",
|
||||
columns: table => new
|
||||
{
|
||||
OrderDetailId = table.Column<int>(type: "int", nullable: false)
|
||||
.Annotation("SqlServer:Identity", "1, 1"),
|
||||
OrderId = table.Column<int>(type: "int", nullable: false),
|
||||
PieId = table.Column<int>(type: "int", nullable: false),
|
||||
Amount = table.Column<int>(type: "int", nullable: false),
|
||||
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_OrderDetails", x => x.OrderDetailId);
|
||||
table.ForeignKey(
|
||||
name: "FK_OrderDetails_Orders_OrderId",
|
||||
column: x => x.OrderId,
|
||||
principalTable: "Orders",
|
||||
principalColumn: "OrderId",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_OrderDetails_Pies_PieId",
|
||||
column: x => x.PieId,
|
||||
principalTable: "Pies",
|
||||
principalColumn: "PieId",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_OrderDetails_OrderId",
|
||||
table: "OrderDetails",
|
||||
column: "OrderId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_OrderDetails_PieId",
|
||||
table: "OrderDetails",
|
||||
column: "PieId");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "OrderDetails");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Orders");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using FakePieShop.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
@@ -41,6 +42,101 @@ namespace FakePieShop.Migrations
|
||||
b.ToTable("Categories");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Order", b =>
|
||||
{
|
||||
b.Property<int>("OrderId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("OrderId"));
|
||||
|
||||
b.Property<string>("AddressLine1")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<string>("AddressLine2")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("City")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("Country")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("FirstName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<string>("LastName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<DateTime>("OrderPlaced")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<decimal>("OrderTotal")
|
||||
.HasColumnType("decimal(18,2)");
|
||||
|
||||
b.Property<string>("PhoneNumber")
|
||||
.IsRequired()
|
||||
.HasMaxLength(25)
|
||||
.HasColumnType("nvarchar(25)");
|
||||
|
||||
b.Property<string>("State")
|
||||
.HasMaxLength(10)
|
||||
.HasColumnType("nvarchar(10)");
|
||||
|
||||
b.Property<string>("ZipCode")
|
||||
.IsRequired()
|
||||
.HasMaxLength(10)
|
||||
.HasColumnType("nvarchar(10)");
|
||||
|
||||
b.HasKey("OrderId");
|
||||
|
||||
b.ToTable("Orders");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.OrderDetail", b =>
|
||||
{
|
||||
b.Property<int>("OrderDetailId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("OrderDetailId"));
|
||||
|
||||
b.Property<int>("Amount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("OrderId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("PieId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<decimal>("Price")
|
||||
.HasColumnType("decimal(18,2)");
|
||||
|
||||
b.HasKey("OrderDetailId");
|
||||
|
||||
b.HasIndex("OrderId");
|
||||
|
||||
b.HasIndex("PieId");
|
||||
|
||||
b.ToTable("OrderDetails");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Pie", b =>
|
||||
{
|
||||
b.Property<int>("PieId")
|
||||
@@ -111,6 +207,25 @@ namespace FakePieShop.Migrations
|
||||
b.ToTable("ShoppingCartItems");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.OrderDetail", b =>
|
||||
{
|
||||
b.HasOne("FakePieShop.Models.Order", "Order")
|
||||
.WithMany("OrderDetails")
|
||||
.HasForeignKey("OrderId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("FakePieShop.Models.Pie", "Pie")
|
||||
.WithMany()
|
||||
.HasForeignKey("PieId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Order");
|
||||
|
||||
b.Navigation("Pie");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Pie", b =>
|
||||
{
|
||||
b.HasOne("FakePieShop.Models.Category", "Category")
|
||||
@@ -137,6 +252,11 @@ namespace FakePieShop.Migrations
|
||||
{
|
||||
b.Navigation("Pies");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("FakePieShop.Models.Order", b =>
|
||||
{
|
||||
b.Navigation("OrderDetails");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,5 +12,7 @@ namespace FakePieShop.Models
|
||||
public DbSet<Category> Categories { get; set; }
|
||||
public DbSet<Pie> Pies { get; set; }
|
||||
public DbSet<ShoppingCartItem> ShoppingCartItems { get; set; }
|
||||
public DbSet<Order> Orders { get; set; }
|
||||
public DbSet<OrderDetail> OrderDetails { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
7
FakePieShop/Models/IOrderRepository.cs
Normal file
7
FakePieShop/Models/IOrderRepository.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace FakePieShop.Models
|
||||
{
|
||||
public interface IOrderRepository
|
||||
{
|
||||
void CreateOrder(Order order);
|
||||
}
|
||||
}
|
||||
66
FakePieShop/Models/Order.cs
Normal file
66
FakePieShop/Models/Order.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace FakePieShop.Models
|
||||
{
|
||||
public class Order
|
||||
{
|
||||
[BindNever]
|
||||
public int OrderId { get; set; }
|
||||
|
||||
public List<OrderDetail>? OrderDetails { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "Please enter your first name")]
|
||||
[Display(Name = "First name")]
|
||||
[StringLength(50)]
|
||||
public string FirstName { get; set; } = string.Empty;
|
||||
|
||||
[Required(ErrorMessage = "Please enter your last name")]
|
||||
[Display(Name = "Last name")]
|
||||
[StringLength(50)]
|
||||
public string LastName { get; set; } = string.Empty;
|
||||
|
||||
[Required(ErrorMessage = "Please enter your address")]
|
||||
[StringLength(100)]
|
||||
[Display(Name = "Address Line 1")]
|
||||
public string AddressLine1 { get; set; } = string.Empty;
|
||||
|
||||
[Display(Name = "Address Line 2")]
|
||||
public string? AddressLine2 { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "Please enter your zip code")]
|
||||
[Display(Name = "Zip code")]
|
||||
[StringLength(10, MinimumLength = 4)]
|
||||
public string ZipCode { get; set; } = string.Empty;
|
||||
|
||||
[Required(ErrorMessage = "Please enter your city")]
|
||||
[StringLength(50)]
|
||||
public string City { get; set; } = string.Empty;
|
||||
|
||||
[StringLength(10)]
|
||||
public string? State { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "Please enter your country")]
|
||||
[StringLength(50)]
|
||||
public string Country { get; set; } = string.Empty;
|
||||
|
||||
[Required(ErrorMessage = "Please enter your phone number")]
|
||||
[StringLength(25)]
|
||||
[DataType(DataType.PhoneNumber)]
|
||||
[Display(Name = "Phone number")]
|
||||
public string PhoneNumber { get; set; } = string.Empty;
|
||||
|
||||
[Required]
|
||||
[StringLength(50)]
|
||||
[DataType(DataType.EmailAddress)]
|
||||
[RegularExpression(@"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])",
|
||||
ErrorMessage = "The email address is not entered in a correct format")]
|
||||
public string Email { get; set; } = string.Empty;
|
||||
|
||||
[BindNever]
|
||||
public decimal OrderTotal { get; set; }
|
||||
|
||||
[BindNever]
|
||||
public DateTime OrderPlaced { get; set; }
|
||||
}
|
||||
}
|
||||
13
FakePieShop/Models/OrderDetail.cs
Normal file
13
FakePieShop/Models/OrderDetail.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
namespace FakePieShop.Models
|
||||
{
|
||||
public class OrderDetail
|
||||
{
|
||||
public int OrderDetailId { get; set; }
|
||||
public int OrderId { get; set; }
|
||||
public int PieId { get; set; }
|
||||
public int Amount { get; set; }
|
||||
public decimal Price { get; set; }
|
||||
public Pie Pie { get; set; } = default!;
|
||||
public Order Order { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
40
FakePieShop/Models/OrderRepository.cs
Normal file
40
FakePieShop/Models/OrderRepository.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
namespace FakePieShop.Models
|
||||
{
|
||||
public class OrderRepository : IOrderRepository
|
||||
{
|
||||
private readonly FakePieShopDbContext _fakePieShopDbContext;
|
||||
private readonly IShoppingCart _shoppingCart;
|
||||
|
||||
public OrderRepository(FakePieShopDbContext fakePieShopDbContext, IShoppingCart shoppingCart)
|
||||
{
|
||||
_fakePieShopDbContext = fakePieShopDbContext;
|
||||
_shoppingCart = shoppingCart;
|
||||
}
|
||||
|
||||
public void CreateOrder(Order order)
|
||||
{
|
||||
order.OrderPlaced = DateTime.Now;
|
||||
|
||||
List<ShoppingCartItem>? shoppingCartItems = _shoppingCart.ShoppingCartItems;
|
||||
order.OrderTotal = _shoppingCart.GetShoppingCartTotal();
|
||||
|
||||
order.OrderDetails = new List<OrderDetail>();
|
||||
|
||||
foreach (ShoppingCartItem? shoppingCartItem in shoppingCartItems)
|
||||
{
|
||||
var orderDetail = new OrderDetail
|
||||
{
|
||||
Amount = shoppingCartItem.Amount,
|
||||
PieId = shoppingCartItem.Pie.PieId,
|
||||
Price = shoppingCartItem.Pie.Price
|
||||
};
|
||||
|
||||
order.OrderDetails.Add(orderDetail);
|
||||
}
|
||||
|
||||
_fakePieShopDbContext.Orders.Add(order);
|
||||
|
||||
_fakePieShopDbContext.SaveChanges();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
|
||||
// add services to application
|
||||
builder.Services.AddScoped<IPieRepository, PieRepository>();
|
||||
builder.Services.AddScoped<ICategoryRepository, CategoryRepository>();
|
||||
builder.Services.AddScoped<IOrderRepository, OrderRepository>();
|
||||
builder.Services.AddScoped<IShoppingCart, ShoppingCart>(services => ShoppingCart.GetCart(services));
|
||||
|
||||
// include support for sessions and http context
|
||||
|
||||
18
FakePieShop/TagHelpers/EmailTagHelper.cs
Normal file
18
FakePieShop/TagHelpers/EmailTagHelper.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||
|
||||
namespace FakePieShop.TagHelpers
|
||||
{
|
||||
public class EmailTagHelper : TagHelper
|
||||
{
|
||||
public string? Address { get; set; }
|
||||
public string? Content { get; set; }
|
||||
public override void Process(TagHelperContext context, TagHelperOutput output)
|
||||
{
|
||||
output.TagName = "a";
|
||||
output.Attributes.SetAttribute("href", $"mailto:{Address}");
|
||||
output.Content.SetContent(Content);
|
||||
|
||||
//base.Process(context, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
14
FakePieShop/Views/Contact/Index.cshtml
Normal file
14
FakePieShop/Views/Contact/Index.cshtml
Normal file
@@ -0,0 +1,14 @@
|
||||
<h3 class="my-5">
|
||||
Contact Us
|
||||
</h3>
|
||||
|
||||
<div class="row gx-5">
|
||||
<img src="~/Images/contact/contact.jpg" class="img-fluid col-5" />
|
||||
<div class="col-7">
|
||||
<h1>We'd love to hear from you</h1>
|
||||
<h5>
|
||||
Please send us your comments, questions, or feedback.
|
||||
</h5>
|
||||
<email address="info@@fakepieshop.com" content="Contact us"></email>
|
||||
</div>
|
||||
</div>
|
||||
79
FakePieShop/Views/Order/Checkout.cshtml
Normal file
79
FakePieShop/Views/Order/Checkout.cshtml
Normal file
@@ -0,0 +1,79 @@
|
||||
@model Order
|
||||
|
||||
<form asp-action="Checkout" method="post" role="form">
|
||||
<h3 class="my-5">
|
||||
You're just one step away from your delicious pies.
|
||||
</h3>
|
||||
|
||||
<div asp-validation-summary="All" class="text-danger"></div>
|
||||
|
||||
<div class="col-6">
|
||||
<div class="row g-2">
|
||||
<div class="col-12">
|
||||
<label asp-for="FirstName" class="form-label"></label>
|
||||
<input asp-for="FirstName" class="form-control" />
|
||||
<span asp-validation-for="FirstName" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<label asp-for="LastName" class="form-label"></label>
|
||||
<input asp-for="LastName" class="form-control" />
|
||||
<span asp-validation-for="LastName" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<label asp-for="AddressLine1" class="form-label"></label>
|
||||
<input asp-for="AddressLine1" class="form-control" />
|
||||
<span asp-validation-for="AddressLine1" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<label asp-for="AddressLine2" class="form-label"></label>
|
||||
<input asp-for="AddressLine2" class="form-control" />
|
||||
<span asp-validation-for="AddressLine2" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<label asp-for="City" class="form-label"></label>
|
||||
<input asp-for="City" class="form-control" />
|
||||
<span asp-validation-for="City" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<label asp-for="State" class="form-label"></label>
|
||||
<input asp-for="State" class="form-control" />
|
||||
<span asp-validation-for="State" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<label asp-for="ZipCode" class="form-label"></label>
|
||||
<input asp-for="ZipCode" class="form-control" />
|
||||
<span asp-validation-for="ZipCode" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<label asp-for="Country" class="form-label"></label>
|
||||
<input asp-for="Country" class="form-control" />
|
||||
<span asp-validation-for="Country" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<label asp-for="Email" class="form-label"></label>
|
||||
<input asp-for="Email" class="form-control" />
|
||||
<span asp-validation-for="Email" class="text-danger"></span>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<label asp-for="PhoneNumber" class="form-label"></label>
|
||||
<input asp-for="PhoneNumber" class="form-control" />
|
||||
<span asp-validation-for="PhoneNumber" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-2">
|
||||
<div class="col-md-offset-2 col-md-5">
|
||||
<input type="submit" class="btn btn-secondary" value="Complete order" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -2,22 +2,21 @@
|
||||
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle"
|
||||
data-toggle="dropdown"
|
||||
href="#"
|
||||
role="button"
|
||||
data-bs-toggle="dropdown"
|
||||
id="nav-dropdown"
|
||||
aria-expanded="false">
|
||||
data-toggle="dropdown"
|
||||
href="#"
|
||||
role="button"
|
||||
data-bs-toggle="dropdown"
|
||||
id="nav-dropdown"
|
||||
aria-expanded="false">
|
||||
Shop
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="nav-dropdown">
|
||||
@foreach (var category in Model)
|
||||
{
|
||||
<li>
|
||||
<a class="dropdown-item"
|
||||
asp-controller="Pie"
|
||||
asp-action="List"
|
||||
asp-route-category="@category.CategoryName">
|
||||
<a asp-controller="Pie" asp-action="List"
|
||||
asp-route-category="@category.CategoryName"
|
||||
class="dropdown-item">
|
||||
@category.CategoryName
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -32,13 +32,11 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" asp-controller="Home" asp-action="Index">Home</a>
|
||||
</li>
|
||||
<vc:category-menu></vc:category-menu>
|
||||
<vc:shopping-cart-summary></vc:shopping-cart-summary>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" asp-controller="Pie" asp-action="List">Pie List</a>
|
||||
</li>
|
||||
<vc:vc:shopping-cart-summary></vc:vc:shopping-cart-summary>
|
||||
<!-- <li class="nav-item">
|
||||
<a class="nav-link" asp-controller="Contact" asp-action="Index">Contact</a>
|
||||
</li> -->
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
</div>
|
||||
<hr />
|
||||
<div class="text-center d-grid">
|
||||
<a class="btn btn-secondary"
|
||||
asp-controller="Order"
|
||||
asp-action="Checkout">Checkout</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,4 +3,5 @@
|
||||
@using FakePieShop.Components
|
||||
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
@addTagHelper *, FakePieShop
|
||||
@addTagHelper *, FakePieShop
|
||||
@addTagHelper FakePieShop.TagHelpers.*, FakePieShop
|
||||
Binary file not shown.
Binary file not shown.
@@ -16,10 +16,18 @@ build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = C:\Users\mikay\source\repos\FakePieShop\FakePieShop
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Contact/Index.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQ29udGFjdFxJbmRleC5jc2h0bWw=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Home/Index.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcSG9tZVxJbmRleC5jc2h0bWw=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Order/Checkout.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcT3JkZXJcQ2hlY2tvdXQuY3NodG1s
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Pie/Details.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUGllXERldGFpbHMuY3NodG1s
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@@ -16,10 +16,18 @@ build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = C:\Users\mikay\source\repos\FakePieShop\FakePieShop
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Contact/Index.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQ29udGFjdFxJbmRleC5jc2h0bWw=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Home/Index.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcSG9tZVxJbmRleC5jc2h0bWw=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Order/Checkout.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcT3JkZXJcQ2hlY2tvdXQuY3NodG1s
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/Users/mikay/source/repos/FakePieShop/FakePieShop/Views/Pie/Details.cshtml]
|
||||
build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUGllXERldGFpbHMuY3NodG1s
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
Reference in New Issue
Block a user