Skip to content

Commit

Permalink
.NET 8 RTM Update (#90)
Browse files Browse the repository at this point in the history
* .NET 8 RTM Update

* Remove commented code

* Update Todo.Web/Server/TodoApi.cs

Signed-off-by: David Fowler <[email protected]>

* Clean up

---------

Signed-off-by: David Fowler <[email protected]>
Co-authored-by: David Fowler <[email protected]>
  • Loading branch information
julioct and davidfowl authored Dec 15, 2023
1 parent 7ca46be commit 2e54de3
Show file tree
Hide file tree
Showing 20 changed files with 67 additions and 71 deletions.
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"image": "mcr.microsoft.com/dotnet/sdk:7.0",
"image": "mcr.microsoft.com/dotnet/sdk:8.0",
"extensions": [
"ms-dotnettools.csharp"
],
Expand Down
11 changes: 7 additions & 4 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
"compounds": [
{
"name": "Web and API",
"configurations": ["TodoApi", "Todo.Web (Server)"]
"configurations": [
"TodoApi",
"Todo.Web (Server)"
]
}
],
"configurations": [
Expand All @@ -12,7 +15,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Todo.Web/Server/bin/Debug/net7.0/Todo.Web.Server.dll",
"program": "${workspaceFolder}/Todo.Web/Server/bin/Debug/net8.0/Todo.Web.Server.dll",
"args": [],
"cwd": "${workspaceFolder}/Todo.Web/Server",
"launchSettingsProfile": "https",
Expand All @@ -34,7 +37,7 @@
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/TodoApi/bin/Debug/net7.0/TodoApi.dll",
"program": "${workspaceFolder}/TodoApi/bin/Debug/net8.0/TodoApi.dll",
"args": [],
"cwd": "${workspaceFolder}/TodoApi",
"stopAtEntry": false,
Expand All @@ -54,4 +57,4 @@
"request": "attach"
}
]
}
}
2 changes: 1 addition & 1 deletion .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"type": "process",
"args": [
"build",
"${workspaceFolder}/TodoApi/TodoApi.csproj",
"${workspaceFolder}/TodoApi.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
Expand Down
61 changes: 30 additions & 31 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,43 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.0-preview.6.23329.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.0-preview.6.23329.4" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.7.0-preview.23280.1" />
<PackageVersion Include="xunit" Version="2.5.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageVersion Include="xunit" Version="2.6.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.5" />
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.0-preview.6.23329.11" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="8.0.0-preview.6.23329.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0-preview.6.23329.4" PrivateAssets="all" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-preview.6.23329.4" />
<PackageVersion Include="Microsoft.NET.Build.Containers" Version="8.0.100-preview.6.23330.7" />
<PackageVersion Include="Microsoft.OpenApi" Version="1.6.5" />
<PackageVersion Include="MiniValidation" Version="0.8.0" />
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="8.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0" PrivateAssets="all" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0" />
<PackageVersion Include="Microsoft.NET.Build.Containers" Version="8.0.0" />
<PackageVersion Include="Microsoft.OpenApi" Version="1.6.11" />
<PackageVersion Include="MiniValidation" Version="0.9.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageVersion Include="AspNet.Security.OAuth.GitHub" Version="7.0.4" />
<PackageVersion Include="Auth0.AspNetCore.Authentication" Version="1.3.1" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Google" Version="8.0.0-rc.1.23421.29" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="8.0.0-rc.1.23421.29" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0-rc.1.23421.29" />
<PackageVersion Include="Yarp.ReverseProxy" Version="2.0.1" />
<PackageVersion Include="AspNet.Security.OAuth.GitHub" Version="8.0.0" />
<PackageVersion Include="Auth0.AspNetCore.Authentication" Version="1.4.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Google" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0" />
<PackageVersion Include="Yarp.ReverseProxy" Version="2.1.0" />
<PackageVersion Include="Microsoft.Tye.Extensions.Configuration" Version="0.10.0-alpha.21420.1" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.0-preview.6.23329.11" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.0-preview.6.23329.11" PrivateAssets="all" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0-preview.6.23329.7" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.0" PrivateAssets="all" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
</ItemGroup>
<!-- OpenTelemetry -->
<ItemGroup>
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.4.0-rc.3" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs" Version="1.4.0-rc.3" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.4.0-rc.3" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.4.0-rc.3" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EventCounters" Version="1.0.0-alpha.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.12" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.4" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.12" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="1.0.0-alpha.5" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.1.0-beta.4" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.7.0-rc.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EventCounters" Version="1.5.1-alpha.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.7.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.8" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.7.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="0.5.0-beta.3" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.5.1" />
</ItemGroup>
</Project>
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,10 @@ Before executing any requests, you need to create a user and get an auth token.
```json
{
"token_type": "Bearer",
"access_token": "string",
"expires_in": <seconds>,
"refresh_token": "string"
"tokenType": "Bearer",
"accessToken": "string",
"expiresIn": <seconds>,
"refreshToken": "string"
}
```
Expand Down
4 changes: 2 additions & 2 deletions Todo.Web/Client/TodoClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public async Task<bool> LoginAsync(string? username, string? password)
return false;
}

var response = await client.PostAsJsonAsync("auth/login", new UserInfo { Username = username, Password = password });
var response = await client.PostAsJsonAsync("auth/login", new UserInfo { Email = username, Password = password });
return response.IsSuccessStatusCode;
}

Expand All @@ -68,7 +68,7 @@ public async Task<bool> CreateUserAsync(string? username, string? password)
return false;
}

var response = await client.PostAsJsonAsync("auth/register", new UserInfo { Username = username, Password = password });
var response = await client.PostAsJsonAsync("auth/register", new UserInfo { Email = username, Password = password });
return response.IsSuccessStatusCode;
}

Expand Down
2 changes: 1 addition & 1 deletion Todo.Web/Server/App.razor
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<body>
<div class="container">
<main role="main" class="pb-3">
<TodoApp CurrentUser="@userName" SocialProviders="@providerNames" @rendermode="@RenderMode.WebAssembly" />
<TodoApp CurrentUser="@userName" SocialProviders="@providerNames" @rendermode="@RenderMode.InteractiveWebAssembly" />
</main>
</div>

Expand Down
2 changes: 1 addition & 1 deletion Todo.Web/Server/AuthApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public static RouteGroupBuilder MapAuth(this IEndpointRouteBuilder routes)

private static IResult SignIn(UserInfo userInfo, string token)
{
return SignIn(userInfo.Username, userInfo.Username, token, providerName: null);
return SignIn(userInfo.Email, userInfo.Email, token, providerName: null);
}

private static IResult SignIn(string userId, string userName, string token, string? providerName)
Expand Down
2 changes: 1 addition & 1 deletion Todo.Web/Server/Authentication/TokenNames.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

public class TokenNames
{
public static readonly string AccessToken = "access_token";
public static readonly string AccessToken = "accessToken";
}
5 changes: 3 additions & 2 deletions Todo.Web/Server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
builder.Services.AddScoped<TodoClient>();

builder.Services.AddRazorComponents()
.AddWebAssemblyComponents();
.AddInteractiveWebAssemblyComponents();

// Add the forwarder to make sending requests to the backend easier
builder.Services.AddHttpForwarder();
Expand Down Expand Up @@ -41,9 +41,10 @@

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();

app.MapRazorComponents<App>()
.AddWebAssemblyRenderMode();
.AddInteractiveWebAssemblyRenderMode();

// Configure the APIs
app.MapAuth();
Expand Down
7 changes: 1 addition & 6 deletions Todo.Web/Server/TodoApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,15 @@ public static RouteGroupBuilder MapTodos(this IEndpointRouteBuilder routes, stri

group.RequireAuthorization();

// TODO: Remove when new YARP is released, see https://github.com/microsoft/reverse-proxy/issues/2131
var transformBuilder = routes.ServiceProvider.GetRequiredService<ITransformBuilder>();
var transform = transformBuilder.Create(b =>
group.MapForwarder("{*path}", todoUrl, new ForwarderRequestConfig(), b =>
{
b.AddRequestTransform(async c =>
{
var accessToken = await c.HttpContext.GetTokenAsync(TokenNames.AccessToken);

c.ProxyRequest.Headers.Authorization = new("Bearer", accessToken);
});
});

group.MapForwarder("{*path}", todoUrl, new ForwarderRequestConfig(), transform);

return group;
}
}
4 changes: 2 additions & 2 deletions Todo.Web/Shared/SharedClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class TodoItem
public class UserInfo
{
[Required]
public string Username { get; set; } = default!;
public string Email { get; set; } = default!;

[Required]
public string Password { get; set; } = default!;
Expand All @@ -28,4 +28,4 @@ public class ExternalUserInfo
public string ProviderKey { get; set; } = default!;
}

public record AuthToken([property:JsonPropertyName("access_token")]string Token);
public record AuthToken([property: JsonPropertyName("accessToken")] string Token);
14 changes: 7 additions & 7 deletions TodoApi.Tests/UserApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ public async Task CanCreateAUser()
await using var db = application.CreateTodoDbContext();

var client = application.CreateClient();
var response = await client.PostAsJsonAsync("/users/register", new UserInfo { Username = "todouser", Password = "@pwd" });
var response = await client.PostAsJsonAsync("/users/register", new UserInfo { Email = "todouser@todoapp.com", Password = "@pwd" });

Assert.True(response.IsSuccessStatusCode);

var user = db.Users.Single();
Assert.NotNull(user);

Assert.Equal("todouser", user.UserName);
Assert.Equal("todouser@todoapp.com", user.UserName);
}

[Fact]
Expand All @@ -28,7 +28,7 @@ public async Task MissingUserOrPasswordReturnsBadRequest()
await using var db = application.CreateTodoDbContext();

var client = application.CreateClient();
var response = await client.PostAsJsonAsync("/users/register", new UserInfo { Username = "todouser", Password = "" });
var response = await client.PostAsJsonAsync("/users/register", new UserInfo { Email = "todouser", Password = "" });

Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);

Expand All @@ -40,7 +40,7 @@ public async Task MissingUserOrPasswordReturnsBadRequest()
// TODO: Follow up on the new errors
// Assert.Equal(new[] { "The Password field is required." }, problemDetails.Errors["Password"]);

response = await client.PostAsJsonAsync("/users/register", new UserInfo { Username = "", Password = "password" });
response = await client.PostAsJsonAsync("/users/register", new UserInfo { Email = "", Password = "password" });

Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);

Expand Down Expand Up @@ -92,7 +92,7 @@ public async Task CanGetATokenForValidUser()
await application.CreateUserAsync("todouser", "p@assw0rd1");

var client = application.CreateClient();
var response = await client.PostAsJsonAsync("/users/login", new UserInfo { Username = "todouser", Password = "p@assw0rd1" });
var response = await client.PostAsJsonAsync("/users/login", new UserInfo { Email = "todouser", Password = "p@assw0rd1" });

Assert.True(response.IsSuccessStatusCode);

Expand Down Expand Up @@ -147,14 +147,14 @@ public async Task UnauthorizedForInvalidCredentials()
await application.CreateUserAsync("todouser", "p@assw0rd1");

var client = application.CreateClient();
var response = await client.PostAsJsonAsync("/users/login", new UserInfo { Username = "todouser", Password = "prd1" });
var response = await client.PostAsJsonAsync("/users/login", new UserInfo { Email = "todouser", Password = "prd1" });

Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
}

class AuthToken
{
[JsonPropertyName("access_token")]
[JsonPropertyName("accessToken")]
public string? Token { get; set; }
}
}
3 changes: 1 addition & 2 deletions TodoApi/Extensions/OpenTelemetryExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ public static WebApplicationBuilder AddOpenTelemetry(this WebApplicationBuilder
{
tracing.AddOtlpExporter();
}
})
.StartWithHost();
});

return builder;
}
Expand Down
2 changes: 1 addition & 1 deletion TodoApi/Migrations/20221123071234_Initial.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion TodoApi/Migrations/TodoDbContextModelSnapshot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ partial class TodoDbContextModelSnapshot : ModelSnapshot
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.0-preview.6.23329.4");
modelBuilder.HasAnnotation("ProductVersion", "8.0.0");

modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
Expand Down
1 change: 0 additions & 1 deletion TodoApi/TodoApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

<ItemGroup>
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs" />
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.EventCounters" />
Expand Down
2 changes: 1 addition & 1 deletion TodoApi/Users/TodoUser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class TodoUser : IdentityUser { }
public class UserInfo
{
[Required]
public string Username { get; set; } = default!;
public string Email { get; set; } = default!;

[Required]
public string Password { get; set; } = default!;
Expand Down

0 comments on commit 2e54de3

Please sign in to comment.