News features

This commit is contained in:
Jean Gatto
2024-12-18 09:32:02 -03:00
parent d3c3a2ab91
commit 43f76a64da
7 changed files with 30 additions and 48 deletions
+9 -8
View File
@@ -23,6 +23,7 @@
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="11.11.0" /> <PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="11.11.0" />
<PackageVersion Include="MediatR" Version="12.4.1" /> <PackageVersion Include="MediatR" Version="12.4.1" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.0" /> <PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.0" /> <PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Analyzers" Version="9.0.0" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Analyzers" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0" />
@@ -57,18 +58,18 @@
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" /> <PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />
<PackageVersion Include="OwaspHeaders.Core" Version="9.4.3" /> <PackageVersion Include="OwaspHeaders.Core" Version="9.4.3" />
<PackageVersion Include="Polly" Version="8.5.0" /> <PackageVersion Include="Polly" Version="8.5.0" />
<PackageVersion Include="Roslynator.Analyzers" Version="4.12.9" /> <PackageVersion Include="Roslynator.Analyzers" Version="4.12.10" />
<PackageVersion Include="Roslynator.CodeAnalysis.Analyzers" Version="4.12.9" /> <PackageVersion Include="Roslynator.CodeAnalysis.Analyzers" Version="4.12.10" />
<PackageVersion Include="Roslynator.CodeFixes" Version="4.12.9" /> <PackageVersion Include="Roslynator.CodeFixes" Version="4.12.10" />
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.12.9" /> <PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.12.10" />
<PackageVersion Include="Roslynator.Refactorings" Version="4.12.9" /> <PackageVersion Include="Roslynator.Refactorings" Version="4.12.10" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="7.2.0" /> <PackageVersion Include="Scalar.AspNetCore" Version="1.2.63" />
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="9.0.0" /> <PackageVersion Include="System.Configuration.ConfigurationManager" Version="9.0.0" />
<PackageVersion Include="System.Text.Json" Version="9.0.0" /> <PackageVersion Include="System.Text.Json" Version="9.0.0" />
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" /> <PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
<PackageVersion Include="xunit" Version="2.9.2" /> <PackageVersion Include="xunit" Version="2.9.2" />
<PackageVersion Include="xunit.analyzers" Version="1.17.0" /> <PackageVersion Include="xunit.analyzers" Version="1.18.0" />
<PackageVersion Include="xunit.categories" Version="2.0.8" /> <PackageVersion Include="xunit.categories" Version="2.0.8" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" /> <PackageVersion Include="xunit.runner.visualstudio" Version="3.0.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>
+7 -2
View File
@@ -26,14 +26,19 @@ If you liked this project, learned something, give it a star. Thank you!
## **Technologies** ## **Technologies**
- ~~ASP.NET Core 8~~
- ASP.NET Core 9 - ASP.NET Core 9
- ~~Entity Framework Core 8~~
- Entity Framework Core 9 - Entity Framework Core 9
- **EF Compiled Queries** (https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/compiled-queries-linq-to-entities)
- Unit & Integration Tests + xUnit + FluentAssertions - Unit & Integration Tests + xUnit + FluentAssertions
- Polly - Polly
- AutoMapper - AutoMapper
- FluentValidator - FluentValidator
- MediatR - MediatR
- Swagger UI - ~~Swagger UI~~
- OpenApi
- **Scalar** - Interactive API Reference from OpenAPI/Swagger (https://github.com/scalar/scalar)
- HealthChecks - HealthChecks
- SQL Server - SQL Server
- MongoDB - MongoDB
@@ -73,7 +78,7 @@ docker-compose up --build --abort-on-container-exit --remove-orphans
Now just open the url in the browser: Now just open the url in the browser:
```csharp ```csharp
http://localhost:{port}/swagger/ http://localhost:{port}/scalar/v1
``` ```
+1 -1
View File
@@ -5,7 +5,7 @@
<DockerTargetOS>Linux</DockerTargetOS> <DockerTargetOS>Linux</DockerTargetOS>
<ProjectGuid>24ef58f6-cbf8-4910-a17c-e8de7ed96a87</ProjectGuid> <ProjectGuid>24ef58f6-cbf8-4910-a17c-e8de7ed96a87</ProjectGuid>
<DockerLaunchAction>LaunchBrowser</DockerLaunchAction> <DockerLaunchAction>LaunchBrowser</DockerLaunchAction>
<DockerServiceUrl>{Scheme}://localhost:{ServicePort}/swagger</DockerServiceUrl> <DockerServiceUrl>{Scheme}://localhost:{ServicePort}/scalar/v1</DockerServiceUrl>
<DockerServiceName>shop-webapi</DockerServiceName> <DockerServiceName>shop-webapi</DockerServiceName>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -1,7 +1,5 @@
using System; using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Reflection;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Diagnostics;
@@ -9,7 +7,6 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using Shop.Core.AppSettings; using Shop.Core.AppSettings;
using Shop.Core.Extensions; using Shop.Core.Extensions;
using Shop.Infrastructure; using Shop.Infrastructure;
@@ -28,32 +25,6 @@ internal static class ServicesCollectionExtensions
private static readonly string[] DbRelationalTags = ["database", "ef-core", "sql-server", "relational"]; private static readonly string[] DbRelationalTags = ["database", "ef-core", "sql-server", "relational"];
private static readonly string[] DbNoSqlTags = ["database", "mongodb", "no-sql"]; private static readonly string[] DbNoSqlTags = ["database", "mongodb", "no-sql"];
public static void AddSwagger(this IServiceCollection services)
{
services.AddSwaggerGen(swaggerOptions =>
{
swaggerOptions.SwaggerDoc("v1", new OpenApiInfo
{
Version = "v1",
Title = "Shop (e-commerce)",
Description = "ASP.NET Core C# CQRS Event Sourcing, REST API, DDD, SOLID Principles and Clean Architecture",
Contact = new OpenApiContact
{
Name = "Jean Gatto",
Email = "jean_gatto@hotmail.com"
},
License = new OpenApiLicense
{
Name = "MIT License"
}
});
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
swaggerOptions.IncludeXmlComments(xmlPath, true);
});
}
public static void AddHealthChecks(this IServiceCollection services, IConfiguration configuration) public static void AddHealthChecks(this IServiceCollection services, IConfiguration configuration)
{ {
var options = configuration.GetOptions<ConnectionOptions>(); var options = configuration.GetOptions<ConnectionOptions>();
+6 -3
View File
@@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using OwaspHeaders.Core.Extensions; using OwaspHeaders.Core.Extensions;
using Scalar.AspNetCore;
using Shop.Application; using Shop.Application;
using Shop.Core; using Shop.Core;
using Shop.Core.Extensions; using Shop.Core.Extensions;
@@ -49,7 +50,7 @@ builder.Services
explorerOptions.SubstituteApiVersionInUrl = true; explorerOptions.SubstituteApiVersionInUrl = true;
}); });
builder.Services.AddSwagger(); builder.Services.AddOpenApi();
builder.Services.AddDataProtection(); builder.Services.AddDataProtection();
builder.Services.AddControllers() builder.Services.AddControllers()
.ConfigureApiBehaviorOptions(behaviorOptions => .ConfigureApiBehaviorOptions(behaviorOptions =>
@@ -104,7 +105,9 @@ var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
}
app.UseHealthChecks("/health", new HealthCheckOptions app.UseHealthChecks("/health", new HealthCheckOptions
{ {
@@ -112,9 +115,9 @@ app.UseHealthChecks("/health", new HealthCheckOptions
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
}); });
app.MapOpenApi();
app.MapScalarApiReference();
app.UseErrorHandling(); app.UseErrorHandling();
app.UseSwagger();
app.UseSwaggerUI();
app.UseResponseCompression(); app.UseResponseCompression();
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseSecureHeadersMiddleware(); app.UseSecureHeadersMiddleware();
@@ -4,7 +4,7 @@
"http": { "http": {
"commandName": "Project", "commandName": "Project",
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "scalar/v1",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, },
@@ -15,7 +15,7 @@
"https": { "https": {
"commandName": "Project", "commandName": "Project",
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "scalar/v1",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, },
@@ -26,7 +26,7 @@
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "scalar/v1",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, },
@@ -35,7 +35,7 @@
"Docker": { "Docker": {
"commandName": "Docker", "commandName": "Docker",
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/scalar/v1",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_URLS": "https://+:443;http://+:80" "ASPNETCORE_URLS": "https://+:443;http://+:80"
}, },
+3 -1
View File
@@ -21,6 +21,7 @@
<PackageReference Include="AutoMapper" /> <PackageReference Include="AutoMapper" />
<PackageReference Include="CorrelationId" /> <PackageReference Include="CorrelationId" />
<PackageReference Include="MediatR" /> <PackageReference Include="MediatR" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@@ -60,7 +61,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Swashbuckle.AspNetCore" /> <PackageReference Include="Scalar.AspNetCore" />
<PackageReference Include="System.Text.RegularExpressions" /> <PackageReference Include="System.Text.RegularExpressions" />
</ItemGroup> </ItemGroup>
@@ -78,6 +79,7 @@
<ItemGroup> <ItemGroup>
<Content Remove="D:\.nuget\packages\owaspheaders.core\8.1.0\contentFiles\any\net9.0\README.md" /> <Content Remove="D:\.nuget\packages\owaspheaders.core\8.1.0\contentFiles\any\net9.0\README.md" />
<Content Remove="D:\.nuget\packages\owaspheaders.core\9.4.3\contentFiles\any\net9.0\README.md" />
</ItemGroup> </ItemGroup>
</Project> </Project>