Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions .github/workflows/codacy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,29 @@ on:
schedule:
- cron: '0 21 * * 5' # Runs at 21:00, only on Friday

permissions:
contents: read

jobs:
codacy-security-scan:
permissions:
contents: read
security-events: write
actions: read
name: Codacy Security Scan
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
# Execute Codacy Analysis CLI and generate a SARIF output with the security
# issues identified during the analysis
uses: actions/checkout@main

- name: Run Codacy Analysis CLI
uses: codacy/codacy-analysis-cli-action@master
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
verbose: true
output: results.sarif
format: sarif
# Adjust severity of non-security issues
gh-code-scanning-compat: true
# Force 0 exit code to allow SARIF file generation
# This will hand over control about PR rejection to the GitHub side
max-allowed-issues: 2147483647

# Upload the SARIF file generated in the previous step
- name: Upload SARIF results file
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@main
with:
sarif_file: results.sarif
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@
{
// Arrange
var players = PlayerFakes.CreateStarting11();
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
var value = It.IsAny<object>();

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);

// Act
var result = await service.RetrieveAsync();

Check warning on line 58 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 8 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:72
// Assert
repository.Verify(repository => repository.GetAllAsync(), Times.Once);
memoryCache.Verify(cache => cache.TryGetValue(It.IsAny<object>(), out value), Times.Once);
Expand All @@ -69,14 +69,15 @@
{
// Arrange
var players = PlayerFakes.CreateStarting11();
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks(cacheValue: players);
repository.Setup(repository => repository.GetAllAsync()).ReturnsAsync(players);
var value = It.IsAny<object>();

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);

// Act
var first = await ExecutionTimeAsync(() => service.RetrieveAsync());
var second = await ExecutionTimeAsync(() => service.RetrieveAsync());

Check warning on line 80 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 8 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:50

// Assert
memoryCache.Verify(
Expand Down Expand Up @@ -107,18 +108,18 @@

[Fact]
[Trait("Category", "Unit")]
public async Task GivenRetrieveByIdAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_TheResultShouldBePlayer()
{
// Arrange
var player = PlayerFakes.CreateOneByIdFromStarting11(9);
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(player.Id)).ReturnsAsync(player);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);

// Act
var result = await service.RetrieveByIdAsync(player.Id);

Check warning on line 122 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 11 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:184

Check warning on line 122 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 8 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:211
// Assert
result.Should().BeOfType<Player>();
result.Should().BeEquivalentTo(player);
Expand Down Expand Up @@ -180,18 +181,18 @@

[Fact]
[Trait("Category", "Unit")]
public async Task GivenUpdateAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_ThenRepositoryUpdateAsyncAndCacheRemove()
{
// Arrange
var player = PlayerFakes.CreateOneByIdFromStarting11(9);
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(player.Id)).ReturnsAsync(player);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);

// Act
await service.UpdateAsync(player);

Check warning on line 195 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 11 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:111
// Assert
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
repository.Verify(repository => repository.UpdateAsync(player), Times.Once);
Expand All @@ -207,15 +208,15 @@
public async Task GivenDeleteAsync_WhenRepositoryFindByIdAsyncReturnsPlayer_ThenRepositoryDeleteAsyncAndCacheRemove()
{
// Arrange
var player = PlayerFakes.CreateOneNew();
var (repository, logger, memoryCache) = PlayerMocks.SetupServiceMocks();
repository.Setup(repository => repository.FindByIdAsync(player.Id)).ReturnsAsync(player);

var service = new PlayerService(repository.Object, logger.Object, memoryCache.Object);

// Act
await service.DeleteAsync(player.Id);

Check warning on line 219 in Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs

View check run for this annotation

Codeac.io / Codeac Code Quality

CodeDuplication

This block of 8 lines is too similar to Dotnet.Samples.AspNetCore.WebApi.Tests/Unit/PlayerServiceTests.cs:114
// Assert
repository.Verify(repository => repository.FindByIdAsync(It.IsAny<long>()), Times.Once);
repository.Verify(repository => repository.RemoveAsync(It.IsAny<long>()), Times.Once);
Expand All @@ -230,21 +231,21 @@
await awaitable();
stopwatch.Stop();

return stopwatch.ElapsedMilliseconds;
}

protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", null);
_disposed = true;
}
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
20 changes: 16 additions & 4 deletions Dotnet.Samples.AspNetCore.WebApi.Tests/Utilities/PlayerMocks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,34 @@ public static Mock<ILogger<T>> LoggerMock<T>()

public static Mock<IMemoryCache> MemoryCacheMock(object? value)
{
var fromCache = false;
var cachedValue = false;
var mock = new Mock<IMemoryCache>();
mock.Setup(cache => cache.TryGetValue(It.IsAny<object>(), out value))

mock.Setup(cache => cache.TryGetValue(It.IsAny<object>(), out It.Ref<object>.IsAny!))
.Callback(
new TryGetValueDelegate(
(object _, out object? output) =>
{
output = cachedValue ? value : null;
}
)
)
.Returns(() =>
{
bool hasValue = fromCache;
fromCache = true; // Subsequent invocations will return true
bool hasValue = cachedValue;
cachedValue = true; // Subsequent invocations will return true
return hasValue;
});

mock.Setup(cache => cache.CreateEntry(It.IsAny<object>()))
.Returns(Mock.Of<ICacheEntry>);
mock.Setup(cache => cache.Remove(It.IsAny<object>()));

return mock;
}

private delegate void TryGetValueDelegate(object key, out object? value);

public static Mock<IUrlHelper> UrlHelperMock()
{
var mock = new Mock<IUrlHelper>();
Expand Down
199 changes: 186 additions & 13 deletions Dotnet.Samples.AspNetCore.WebApi.Tests/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,15 @@
"Microsoft.Extensions.Primitives": "9.0.3"
}
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "9.0.3",
"contentHash": "RIEeZxWYm77+OWLwgik7DzSVSONjqkmcbuCb1koZdGAV7BgOUWnLz80VMyHZMw3onrVwFCCMHBBdruBPuQTvkg==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "9.0.3",
"Microsoft.Extensions.Primitives": "9.0.3"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "9.0.3",
Expand All @@ -858,6 +867,38 @@
"Microsoft.Extensions.Primitives": "9.0.3"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "RiScL99DcyngY9zJA2ROrri7Br8tn5N4hP4YNvGdTN/bvg1A3dwvDOxHnNZ3Im7x2SJ5i4LkX1uPiR/MfSFBLQ==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "9.0.0"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
"resolved": "9.0.3",
"contentHash": "tBNMSDJ2q7WQK2zwPhHY5I/q95t7sf6dT079mGrNm0yOZF/gM9JvR/LtCb/rwhRmh7A6XMnzv5WbpCh9KLq9EQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "9.0.3",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.3",
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.3",
"Microsoft.Extensions.FileProviders.Physical": "9.0.3",
"Microsoft.Extensions.Primitives": "9.0.3"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
"resolved": "9.0.3",
"contentHash": "mjkp3ZwynNacZk4uq93I0DyCY48FZmi3yRV0xlfeDuWh44KcDunPXHwt8IWr4kL7cVM6eiFVe6YTJg97KzUAUA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "9.0.3",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.3",
"Microsoft.Extensions.Configuration.FileExtensions": "9.0.3",
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.3",
"System.Text.Json": "9.0.3"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "9.0.3",
Expand All @@ -880,6 +921,51 @@
"System.Text.Json": "9.0.3"
}
},
"Microsoft.Extensions.Diagnostics.Abstractions": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "1K8P7XzuzX8W8pmXcZjcrqS6x5eSSdvhQohmcpgiQNY/HlDAlnrhR9dvlURfFz428A+RTCJpUyB+aKTA6AgVcQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
"Microsoft.Extensions.Options": "9.0.0",
"System.Diagnostics.DiagnosticSource": "9.0.0"
}
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
"resolved": "9.0.3",
"contentHash": "umczZ3+QPpzlrW/lkvy+IB0p52+qZ5w++aqx2lTCMOaPKzwcbVdrJgiQ3ajw5QWBp7gChLUiCYkSlWUpfjv24g==",
"dependencies": {
"Microsoft.Extensions.Primitives": "9.0.3"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
"resolved": "9.0.3",
"contentHash": "th2+tQBV5oWjgKhip9GjiIv2AEK3QvfAO3tZcqV3F3dEt5D6Gb411RntCj1+8GS9HaRRSxjSGx/fCrMqIjkb1Q==",
"dependencies": {
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.3",
"Microsoft.Extensions.FileSystemGlobbing": "9.0.3",
"Microsoft.Extensions.Primitives": "9.0.3"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
"resolved": "9.0.3",
"contentHash": "Rec77KHk4iNpFznHi5/6wF3MlUDcKqg26t8gRYbUm1PSukZ4B6mrXpZsJSNOiwyhhQVkjYbaoZxi5XJgRQ5lFg=="
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "yUKJgu81ExjvqbNWqZKshBbLntZMbMVz/P7Way2SBx7bMqA08Mfdc9O7hWDKAiSp+zPUGT6LKcSCQIPeDK+CCw==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "9.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
"Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0",
"Microsoft.Extensions.FileProviders.Abstractions": "9.0.0",
"Microsoft.Extensions.Logging.Abstractions": "9.0.0"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
"resolved": "9.0.3",
Expand Down Expand Up @@ -1292,6 +1378,88 @@
"resolved": "6.11.0",
"contentHash": "v/GGlIj2dd7svplFmASWEueu62veKW0MrMtBaZ7QG8aJTSGv2yE+pgUGhXRcQ4nxNOEq/wLBrz1vkth/1SND7A=="
},
"Serilog": {
"type": "Transitive",
"resolved": "4.2.0",
"contentHash": "gmoWVOvKgbME8TYR+gwMf7osROiWAURterc6Rt2dQyX7wtjZYpqFiA/pY6ztjGQKKV62GGCyOcmtP1UKMHgSmA=="
},
"Serilog.AspNetCore": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "JslDajPlBsn3Pww1554flJFTqROvK9zz9jONNQgn0D8Lx2Trw8L0A8/n6zEQK1DAZWXrJwiVLw8cnTR3YFuYsg==",
"dependencies": {
"Serilog": "4.2.0",
"Serilog.Extensions.Hosting": "9.0.0",
"Serilog.Formatting.Compact": "3.0.0",
"Serilog.Settings.Configuration": "9.0.0",
"Serilog.Sinks.Console": "6.0.0",
"Serilog.Sinks.Debug": "3.0.0",
"Serilog.Sinks.File": "6.0.0"
}
},
"Serilog.Extensions.Hosting": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "u2TRxuxbjvTAldQn7uaAwePkWxTHIqlgjelekBtilAGL5sYyF3+65NWctN4UrwwGLsDC7c3Vz3HnOlu+PcoxXg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
"Microsoft.Extensions.Hosting.Abstractions": "9.0.0",
"Microsoft.Extensions.Logging.Abstractions": "9.0.0",
"Serilog": "4.2.0",
"Serilog.Extensions.Logging": "9.0.0"
}
},
"Serilog.Extensions.Logging": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "NwSSYqPJeKNzl5AuXVHpGbr6PkZJFlNa14CdIebVjK3k/76kYj/mz5kiTRNVSsSaxM8kAIa1kpy/qyT9E4npRQ==",
"dependencies": {
"Microsoft.Extensions.Logging": "9.0.0",
"Serilog": "4.2.0"
}
},
"Serilog.Formatting.Compact": {
"type": "Transitive",
"resolved": "3.0.0",
"contentHash": "wQsv14w9cqlfB5FX2MZpNsTawckN4a8dryuNGbebB/3Nh1pXnROHZov3swtu3Nj5oNG7Ba+xdu7Et/ulAUPanQ==",
"dependencies": {
"Serilog": "4.0.0"
}
},
"Serilog.Settings.Configuration": {
"type": "Transitive",
"resolved": "9.0.0",
"contentHash": "4/Et4Cqwa+F88l5SeFeNZ4c4Z6dEAIKbu3MaQb2Zz9F/g27T5a3wvfMcmCOaAiACjfUb4A6wrlTVfyYUZk3RRQ==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "9.0.0",
"Microsoft.Extensions.DependencyModel": "9.0.0",
"Serilog": "4.2.0"
}
},
"Serilog.Sinks.Console": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==",
"dependencies": {
"Serilog": "4.0.0"
}
},
"Serilog.Sinks.Debug": {
"type": "Transitive",
"resolved": "3.0.0",
"contentHash": "4BzXcdrgRX7wde9PmHuYd9U6YqycCC28hhpKonK7hx0wb19eiuRj16fPcPSVp0o/Y1ipJuNLYQ00R3q2Zs8FDA==",
"dependencies": {
"Serilog": "4.0.0"
}
},
"Serilog.Sinks.File": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "lxjg89Y8gJMmFxVkbZ+qDgjl+T4yC5F7WSLTvA+5q0R04tfKVLRL/EHpYoJ/MEQd2EeCKDuylBIVnAYMotmh2A==",
"dependencies": {
"Serilog": "4.0.0"
}
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.10",
Expand Down Expand Up @@ -1324,35 +1492,35 @@
},
"Swashbuckle.AspNetCore": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "K9FzGTxmwfD+7sVf/FTq/TZFHBTXcROgdcg7gLFwKwgvXwaqTtjGVdam27j0kYfgZZyWlOKr+abmtyd2nAd5eA==",
"resolved": "8.1.0",
"contentHash": "8NJwXskWNBhX4IntitP1VP68hzhQ9Sex4mR9ZbqCuuUsaWlfrMA+yDIYDFsbHlB2NQ6Gt27AT15BWo9jxHj1tg==",
"dependencies": {
"Microsoft.Extensions.ApiDescription.Server": "6.0.5",
"Swashbuckle.AspNetCore.Swagger": "8.0.0",
"Swashbuckle.AspNetCore.SwaggerGen": "8.0.0",
"Swashbuckle.AspNetCore.SwaggerUI": "8.0.0"
"Swashbuckle.AspNetCore.Swagger": "8.1.0",
"Swashbuckle.AspNetCore.SwaggerGen": "8.1.0",
"Swashbuckle.AspNetCore.SwaggerUI": "8.1.0"
}
},
"Swashbuckle.AspNetCore.Swagger": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "+8Y4pVTWbnzotIk6d6rcwsHGpCchPDqqrvYkyGlI3go+pFaKM+4eX30iCyI0hvr0RMtObJCFhK6aDtlQFbEF1g==",
"resolved": "8.1.0",
"contentHash": "TRpBDdWh/6IzXHOLKVEuZSuhcdc8OIwhr8dyLnWvEh6FO4f0KiATAzr8yzHspcCFzCc/CONpvUCq4DzazpP6Og==",
"dependencies": {
"Microsoft.OpenApi": "1.6.23"
}
},
"Swashbuckle.AspNetCore.SwaggerGen": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "skCeIQ93yMcUm1PQby5qitFM6KLIlLMj4/i8JHy86x2OFzxTNaaas2kUg6rNV3JvucFvYCNyImg7NMtZHErSzQ==",
"resolved": "8.1.0",
"contentHash": "sXAUNodmnzrJb1qmgdLY6HgTDsgagXCn6p+qygW2wP0BjcvdZZA6GdDgtuc8iQON9ekrp7m5G0Zc09lvuNhc/A==",
"dependencies": {
"Swashbuckle.AspNetCore.Swagger": "8.0.0"
"Swashbuckle.AspNetCore.Swagger": "8.1.0"
}
},
"Swashbuckle.AspNetCore.SwaggerUI": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "IMqmgclFiZL2QIfopOmWYofZzckrl+SdMt1h4mKC0jc94F+uzt3IHA3YFC0CGlwBqTTSnxHqNUKomNTeAhZbYA=="
"resolved": "8.1.0",
"contentHash": "PYyTbYrEz1q8N8ZpCFzY5hOkvP5gv9oIml06wrrrjGRFvVXyCF/b58FRI/9mnRKRBAmWKZR5pqhmJBzvsVveSQ=="
},
"System.ClientModel": {
"type": "Transitive",
Expand Down Expand Up @@ -1642,8 +1810,13 @@
"Microsoft.EntityFrameworkCore.InMemory": "[9.0.3, )",
"Microsoft.EntityFrameworkCore.SqlServer": "[9.0.3, )",
"Microsoft.EntityFrameworkCore.Sqlite": "[9.0.3, )",
"Microsoft.Extensions.Configuration.Json": "[9.0.3, )",
"Microsoft.VisualStudio.Web.CodeGeneration.Design": "[9.0.0, )",
"Swashbuckle.AspNetCore": "[8.0.0, )"
"Serilog.AspNetCore": "[9.0.0, )",
"Serilog.Settings.Configuration": "[9.0.0, )",
"Serilog.Sinks.Console": "[6.0.0, )",
"Serilog.Sinks.File": "[6.0.0, )",
"Swashbuckle.AspNetCore": "[8.1.0, )"
Comment on lines +1813 to +1819
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Updated project dependencies for logging and documentation.
Within the project dependency section for dotnet.samples.aspnetcore.webapi, new dependencies have been added or updated:
"Microsoft.Extensions.Configuration.Json": "[9.0.3, )"
"Serilog.AspNetCore": "[9.0.0, )"
"Serilog.Settings.Configuration": "[9.0.0, )"
"Serilog.Sinks.Console": "[6.0.0, )"
"Serilog.Sinks.File": "[6.0.0, )"
"Swashbuckle.AspNetCore": "[8.1.0, )"

These updates are consistent with the move toward Serilog for logging and improved API documentation via Swashbuckle. Ensure that your application’s startup routines have been revised to configure Serilog as the primary logging framework and that no legacy code inadvertently calls the older Microsoft logging abstractions.

}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.3" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand All @@ -17,6 +18,10 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.3" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.14" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.0" />
</ItemGroup>

Expand Down
Loading
Loading