diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..a7b60b5
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,17 @@
+{
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Launch and Debug Hosted Blazor WebAssembly App",
+ "type": "blazorwasm",
+ "request": "launch",
+ "hosted": true,
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/Server/bin/Debug/netcoreapp3.1/ShoppingCartStarter.Server.dll",
+ "cwd": "${workspaceFolder}/Server"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..ed120a7
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,42 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/Server/ShoppingCartStarter.Server.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/Server/ShoppingCartStarter.Server.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "${workspaceFolder}/Server/ShoppingCartStarter.Server.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Client/Pages/Cart/Cart.razor b/Client/Pages/Cart/Cart.razor
new file mode 100644
index 0000000..e0b21d4
--- /dev/null
+++ b/Client/Pages/Cart/Cart.razor
@@ -0,0 +1,11 @@
+@inherits CartBase
+@page "/cart"
+
+
Your Shopping Cart
+
+@if(Model != null){
+ @foreach (var line in Model.Items)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/Client/Pages/Cart/Cart.razor.cs b/Client/Pages/Cart/Cart.razor.cs
new file mode 100644
index 0000000..650deef
--- /dev/null
+++ b/Client/Pages/Cart/Cart.razor.cs
@@ -0,0 +1,30 @@
+using System.Net.Http;
+using System.Net.Http.Json;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components;
+using ShoppingCartStarter.Shared.Cart;
+
+namespace ShoppingCartStarter.Client.Pages.Cart
+{
+ public class CartBase : ComponentBase
+ {
+ [Inject] private HttpClient Http { get; set; }
+
+ protected Details.Model Model { get; set; }
+
+ protected override async Task OnInitializedAsync()
+ {
+ await ReloadCart();
+ }
+
+ protected void RemoveItem(Details.Model.LineItem item)
+ {
+ Model.Items.Remove(item);
+ }
+
+ protected async Task ReloadCart()
+ {
+ Model = await Http.GetFromJsonAsync("api/cart");
+ }
+ }
+}
\ No newline at end of file
diff --git a/Client/Pages/Cart/Item.razor b/Client/Pages/Cart/Item.razor
new file mode 100644
index 0000000..8b363c1
--- /dev/null
+++ b/Client/Pages/Cart/Item.razor
@@ -0,0 +1,20 @@
+@inherits ItemBase
+
+
+
+
+ £@Details.Price
+
+
\ No newline at end of file
diff --git a/Client/Pages/Cart/Item.razor.cs b/Client/Pages/Cart/Item.razor.cs
new file mode 100644
index 0000000..5d32688
--- /dev/null
+++ b/Client/Pages/Cart/Item.razor.cs
@@ -0,0 +1,42 @@
+using Microsoft.AspNetCore.Components;
+using ShoppingCartStarter.Shared.Cart;
+using ShoppingCartStarter.Shared.Cart.LineItem;
+using System;
+using System.Net.Http;
+using System.Net.Http.Json;
+using System.Threading.Tasks;
+
+namespace ShoppingCartStarter.Client.Pages.Cart
+{
+ public class ItemBase : ComponentBase
+ {
+ [Parameter]
+ public Details.Model.LineItem Details { get; set; }
+
+ [Inject]
+ public HttpClient Http { get; set; }
+
+ [Parameter]
+ public EventCallback OnDeleted { get; set; }
+
+ [Parameter]
+ public EventCallback OnQuantityChanged { get; set; }
+
+ protected async Task OnDeleteClicked()
+ {
+ await Http.DeleteAsync($"api/cart/lines/{Details.Id}");
+ await OnDeleted.InvokeAsync(Details);
+ }
+
+ protected async Task QuantityChanged(int value)
+ {
+ await Http.PutAsJsonAsync("api/cart/lines", new Update.Command
+ {
+ Id = Details.Id,
+ Quantity = value
+ });
+
+ await OnQuantityChanged.InvokeAsync(EventArgs.Empty);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Client/Pages/Cart/Quantity.razor b/Client/Pages/Cart/Quantity.razor
new file mode 100644
index 0000000..be13714
--- /dev/null
+++ b/Client/Pages/Cart/Quantity.razor
@@ -0,0 +1,9 @@
+@inherits QuantityBase
+
+
\ No newline at end of file
diff --git a/Client/Pages/Cart/Quantity.razor.cs b/Client/Pages/Cart/Quantity.razor.cs
new file mode 100644
index 0000000..9051736
--- /dev/null
+++ b/Client/Pages/Cart/Quantity.razor.cs
@@ -0,0 +1,19 @@
+using Microsoft.AspNetCore.Components;
+using System;
+using System.Threading.Tasks;
+
+namespace ShoppingCartStarter.Client.Pages.Cart
+{
+ public class QuantityBase : ComponentBase
+ {
+ [Parameter] public EventCallback ValueChanged { get; set; }
+
+ [Parameter] public int Value { get; set; }
+
+ protected Task OnChange(ChangeEventArgs e)
+ {
+ Value = Convert.ToInt32(e.Value);
+ return ValueChanged.InvokeAsync(Value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Server/Data/Database.cs b/Server/Data/Database.cs
index ec78c10..47c1505 100644
--- a/Server/Data/Database.cs
+++ b/Server/Data/Database.cs
@@ -17,14 +17,14 @@ namespace ShoppingCartStarter.Server.Data
{
using var serviceScope = app.ApplicationServices.GetService().CreateScope();
using var context = serviceScope.ServiceProvider.GetRequiredService();
-
+
context.Database.Migrate();
ShoppingCart cart;
if (context.Carts.Any())
{
cart = context.Carts
- .Include(x=>x.LineItems)
+ .Include(x => x.LineItems)
.FirstOrDefault();
}
else
diff --git a/Server/Properties/launchSettings.json b/Server/Properties/launchSettings.json
index d591409..6f5995f 100644
--- a/Server/Properties/launchSettings.json
+++ b/Server/Properties/launchSettings.json
@@ -20,7 +20,7 @@
"commandName": "Project",
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "applicationUrl": "https://localhost:5004;http://localhost:5005",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}