Skip to content

Commit 8a853d0

Browse files
committed
Update to use typed client with authorizing message handler
1 parent 6e347d5 commit 8a853d0

File tree

7 files changed

+88
-67
lines changed

7 files changed

+88
-67
lines changed

src/BlazingComponents/TemplatedList.razor

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
{
55
@Loading
66
}
7-
else if (items.Count == 0)
7+
else if (!items.Any())
88
{
99
@Empty
1010
}
@@ -21,9 +21,9 @@ else
2121
}
2222

2323
@code {
24-
List<TItem> items;
24+
IEnumerable<TItem> items;
2525

26-
[Parameter] public Func<Task<List<TItem>>> Loader { get; set; }
26+
[Parameter] public Func<Task<IEnumerable<TItem>>> Loader { get; set; }
2727
[Parameter] public RenderFragment Loading { get; set; }
2828
[Parameter] public RenderFragment Empty { get; set; }
2929
[Parameter] public RenderFragment<TItem> Item { get; set; }

src/BlazingPizza.Client/BlazingPizza.Client.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<ItemGroup>
1010
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="$(BlazorVersion)" />
1111
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="$(BlazorVersion)" PrivateAssets="all" />
12+
<PackageReference Include="Microsoft.Extensions.Http" Version="$(AspNetCoreVersion)" />
1213
<PackageReference Include="System.Net.Http.Json" Version="$(SystemNetHttpJsonVersion)" />
1314
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="$(BlazorVersion)" />
1415
</ItemGroup>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Net.Http;
6+
using System.Net.Http.Json;
7+
using System.Threading.Tasks;
8+
9+
namespace BlazingPizza.Client
10+
{
11+
public class OrdersClient
12+
{
13+
private readonly HttpClient httpClient;
14+
15+
public OrdersClient(HttpClient httpClient)
16+
{
17+
this.httpClient = httpClient;
18+
}
19+
20+
public async Task<IEnumerable<OrderWithStatus>> GetOrders() =>
21+
await httpClient.GetFromJsonAsync<IEnumerable<OrderWithStatus>>("orders");
22+
23+
24+
public async Task<OrderWithStatus> GetOrder(int orderId) =>
25+
await httpClient.GetFromJsonAsync<OrderWithStatus>($"orders/{orderId}");
26+
27+
28+
public async Task<int> PlaceOrder(Order order)
29+
{
30+
var response = await httpClient.PostAsJsonAsync("orders", order);
31+
response.EnsureSuccessStatusCode();
32+
var orderId = await response.Content.ReadFromJsonAsync<int>();
33+
return orderId;
34+
}
35+
36+
public async Task SubscribeToNotifications(NotificationSubscription subscription)
37+
{
38+
var response = await httpClient.PostAsJsonAsync("notifications/subscribe", subscription);
39+
response.EnsureSuccessStatusCode();
40+
}
41+
}
42+
}

src/BlazingPizza.Client/Pages/Checkout.razor

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
@page "/checkout"
22
@attribute [Authorize]
33
@inject OrderState OrderState
4-
@inject HttpClient HttpClient
54
@inject NavigationManager NavigationManager
6-
@inject IAccessTokenProvider TokenProvider
5+
@inject OrdersClient OrdersClient
76
@inject IJSRuntime JSRuntime
87

98
<div class="main">
@@ -39,42 +38,33 @@
3938

4039
async Task RequestNotificationSubscriptionAsync()
4140
{
42-
var tokenResult = await TokenProvider.RequestAccessToken();
43-
if (tokenResult.TryGetToken(out var accessToken))
41+
var subscription = await JSRuntime.InvokeAsync<NotificationSubscription>("blazorPushNotifications.requestSubscription");
42+
if (subscription != null)
4443
{
45-
var subscription = await JSRuntime.InvokeAsync<NotificationSubscription>("blazorPushNotifications.requestSubscription");
46-
if (subscription != null)
44+
try
4745
{
48-
var request = new HttpRequestMessage(HttpMethod.Put, "notifications/subscribe");
49-
request.Content = JsonContent.Create(subscription);
50-
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Value);
51-
await HttpClient.SendAsync(request);
46+
await OrdersClient.SubscribeToNotifications(subscription);
47+
}
48+
catch (AccessTokenNotAvailableException ex)
49+
{
50+
ex.Redirect();
5251
}
53-
}
54-
else
55-
{
56-
NavigationManager.NavigateTo(tokenResult.RedirectUrl);
5752
}
5853
}
5954

6055
async Task PlaceOrder()
6156
{
6257
isSubmitting = true;
6358

64-
var tokenResult = await TokenProvider.RequestAccessToken();
65-
if (tokenResult.TryGetToken(out var accessToken))
59+
try
6660
{
67-
var request = new HttpRequestMessage(HttpMethod.Post, "orders");
68-
request.Content = JsonContent.Create(OrderState.Order);
69-
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Value);
70-
var response = await HttpClient.SendAsync(request);
71-
var newOrderId = await response.Content.ReadFromJsonAsync<int>();
61+
var newOrderId = await OrdersClient.PlaceOrder(OrderState.Order);
7262
OrderState.ResetOrder();
7363
NavigationManager.NavigateTo($"myorders/{newOrderId}");
7464
}
75-
else
65+
catch (AccessTokenNotAvailableException ex)
7666
{
77-
NavigationManager.NavigateTo(tokenResult.RedirectUrl);
67+
ex.Redirect();
7868
}
7969
}
8070
}

src/BlazingPizza.Client/Pages/MyOrders.razor

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
@page "/myorders"
22
@attribute [Authorize]
3-
@inject HttpClient HttpClient
4-
@inject NavigationManager NavigationManager
5-
@inject IAccessTokenProvider TokenProvider
3+
@inject OrdersClient OrdersClient
64

75
<div class="main">
86
<TemplatedList Loader="@LoadOrders" ListGroupClass="orders-list">
@@ -32,20 +30,16 @@
3230
</div>
3331

3432
@code {
35-
async Task<List<OrderWithStatus>> LoadOrders()
33+
async Task<IEnumerable<OrderWithStatus>> LoadOrders()
3634
{
37-
var ordersWithStatus = new List<OrderWithStatus>();
38-
var tokenResult = await TokenProvider.RequestAccessToken();
39-
if (tokenResult.TryGetToken(out var accessToken))
35+
var ordersWithStatus = Enumerable.Empty<OrderWithStatus>();
36+
try
4037
{
41-
var request = new HttpRequestMessage(HttpMethod.Get, "orders");
42-
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Value);
43-
var response = await HttpClient.SendAsync(request);
44-
ordersWithStatus = await response.Content.ReadFromJsonAsync<List<OrderWithStatus>>();
38+
ordersWithStatus = await OrdersClient.GetOrders();
4539
}
46-
else
40+
catch (AccessTokenNotAvailableException ex)
4741
{
48-
NavigationManager.NavigateTo(tokenResult.RedirectUrl);
42+
ex.Redirect();
4943
}
5044
return ordersWithStatus;
5145
}

src/BlazingPizza.Client/Pages/OrderDetails.razor

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
@page "/myorders/{orderId:int}"
22
@attribute [Authorize]
33
@using System.Threading
4-
@inject HttpClient HttpClient
5-
@inject NavigationManager NavigationManager
6-
@inject IAccessTokenProvider TokenProvider
4+
@inject OrdersClient OrdersClient
75
@implements IDisposable
86

97
<div class="main">
@@ -57,35 +55,28 @@
5755

5856
private async void PollForUpdates()
5957
{
60-
var tokenResult = await TokenProvider.RequestAccessToken();
61-
if (tokenResult.TryGetToken(out var accessToken))
58+
invalidOrder = false;
59+
pollingCancellationToken = new CancellationTokenSource();
60+
while (!pollingCancellationToken.IsCancellationRequested)
6261
{
63-
pollingCancellationToken = new CancellationTokenSource();
64-
while (!pollingCancellationToken.IsCancellationRequested)
62+
try
6563
{
66-
try
67-
{
68-
invalidOrder = false;
69-
var request = new HttpRequestMessage(HttpMethod.Get, $"orders/{OrderId}");
70-
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Value);
71-
var response = await HttpClient.SendAsync(request);
72-
orderWithStatus = await response.Content.ReadFromJsonAsync<OrderWithStatus>();
73-
}
74-
catch (Exception ex)
75-
{
76-
invalidOrder = true;
77-
pollingCancellationToken.Cancel();
78-
Console.Error.WriteLine(ex);
79-
}
80-
64+
orderWithStatus = await OrdersClient.GetOrder(OrderId);
8165
StateHasChanged();
82-
8366
await Task.Delay(4000);
8467
}
85-
}
86-
else
87-
{
88-
NavigationManager.NavigateTo(tokenResult.RedirectUrl);
68+
catch (AccessTokenNotAvailableException ex)
69+
{
70+
pollingCancellationToken.Cancel();
71+
ex.Redirect();
72+
}
73+
catch (Exception ex)
74+
{
75+
invalidOrder = true;
76+
pollingCancellationToken.Cancel();
77+
Console.Error.WriteLine(ex);
78+
StateHasChanged();
79+
}
8980
}
9081
}
9182

src/BlazingPizza.Client/Program.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
1+
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
2+
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
23
using Microsoft.Extensions.DependencyInjection;
34
using System;
45
using System.Net.Http;
@@ -14,6 +15,8 @@ public static async Task Main(string[] args)
1415
builder.RootComponents.Add<App>("app");
1516

1617
builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
18+
builder.Services.AddHttpClient<OrdersClient>(client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
19+
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
1720
builder.Services.AddScoped<OrderState>();
1821

1922
// Add auth services

0 commit comments

Comments
 (0)