diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 02953b75..00000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(./gradlew build:*)", - "Bash(./gradlew clean:*)", - "Bash(./gradlew compileKotlin:*)", - "Bash(./gradlew detekt:*)", - "Bash(./gradlew ktlintCheck:*)", - "Bash(./gradlew ktlintFormat:*)", - "Bash(./gradlew tasks:*)", - "Bash(./gradlew test:*)", - "Bash(./mvnw clean:*)", - "Bash(./mvnw compile:*)", - "Bash(./src/kotlin/gradlew:*)", - "Bash(chmod:*)", - "Bash(curl:*)", - "Bash(docker compose build:*)", - "Bash(docker compose config:*)", - "Bash(docker compose run:*)", - "Bash(docker compose up:*)", - "Bash(docker info:*)", - "Bash(dotnet ef migrations add:*)", - "Bash(dotnet test:*)", - "Bash(dotnet tool install:*)", - "Bash(find:*)", - "Bash(gh issue create:*)", - "Bash(gh issue view:*)", - "Bash(gh pr checks:*)", - "Bash(gh pr create:*)", - "Bash(gh run list:*)", - "Bash(gh run view:*)", - "Bash(git add:*)", - "Bash(git check-ignore:*)", - "Bash(git checkout:*)", - "Bash(git cherry-pick:*)", - "Bash(git commit:*)", - "Bash(git merge:*)", - "Bash(git pull:*)", - "Bash(git push:*)", - "Bash(git stash pop:*)", - "Bash(git stash:*)", - "Bash(golangci-lint run:*)", - "Bash(java:*)", - "Bash(make lint:*)", - "Bash(mvn clean compile:*)", - "Bash(mvn clean test:*)", - "Bash(mvn compile:*)", - "Bash(mvn pmd:check:*)", - "Bash(mvn spotbugs:check:*)", - "Bash(mvn test:*)", - "Bash(mvn:*)", - "Bash(npm install)", - "Bash(npm run build:*)", - "Bash(npm run lint:*)", - "Bash(npm run test:integration:*)", - "Bash(npm test:*)", - "Bash(npx prisma generate:*)", - "Bash(open:*)", - "Bash(pg_isready:*)", - "Bash(pip index:*)", - "Bash(pip3 install:*)", - "Bash(pkill:*)", - "Bash(poetry add:*)", - "Bash(poetry env info:*)", - "Bash(poetry export:*)", - "Bash(poetry install:*)", - "Bash(poetry lock:*)", - "Bash(poetry run black:*)", - "Bash(poetry run mypy:*)", - "Bash(poetry run pytest:*)", - "Bash(poetry run python:*)", - "Bash(poetry run python3:*)", - "Bash(poetry run ruff check:*)", - "Bash(poetry run ruff:*)", - "Bash(python -m pytest:*)", - "Bash(python3:*)", - "Bash(ruff check:*)", - "Bash(schemathesis run:*)", - "Bash(tee:*)", - "Bash(TESTCONTAINERS_HOST_OVERRIDE=localhost dotnet test:*)", - "Bash(tree:*)", - "Bash(git fetch origin main)", - "Bash(git rebase origin/main)" - ] - } -} diff --git a/.github/workflows/csharp-ci.yml b/.github/workflows/csharp-ci.yml index fb754505..2073fb8a 100644 --- a/.github/workflows/csharp-ci.yml +++ b/.github/workflows/csharp-ci.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] defaults: run: working-directory: src/csharp @@ -67,7 +67,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] defaults: run: working-directory: src/csharp @@ -113,7 +113,7 @@ jobs: needs: [code-quality, security-scan] strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] defaults: run: working-directory: src/csharp @@ -152,7 +152,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] defaults: run: working-directory: src/csharp @@ -201,7 +201,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] defaults: run: working-directory: src/csharp @@ -247,7 +247,7 @@ jobs: strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] services: postgres: @@ -302,7 +302,7 @@ jobs: needs: [code-quality] strategy: matrix: - dotnet-version: ['8.x'] + dotnet-version: ['10.x'] defaults: run: working-directory: src/csharp diff --git a/scripts/hooks/csharp.sh b/scripts/hooks/csharp.sh index 9094f531..11637e3a 100755 --- a/scripts/hooks/csharp.sh +++ b/scripts/hooks/csharp.sh @@ -13,12 +13,12 @@ echo "[pre-commit] Restoring C# dependencies" dotnet restore --locked-mode echo "[pre-commit] Running C# format auto-fix" -dotnet format +dotnet format whitespace cd "$ROOT" restage_and_fail_if_changed "src/csharp" cd "$ROOT/src/csharp" echo "[pre-commit] Running C# lint checks" -dotnet format --verify-no-changes --verbosity diagnostic dotnet build --verbosity minimal --configuration Release --no-restore +dotnet format whitespace --verify-no-changes diff --git a/src/csharp/LampControlApi.Tests/Infrastructure/LampControlDbContextTests.cs b/src/csharp/LampControlApi.Tests/Infrastructure/LampControlDbContextTests.cs index 293574b2..d294ddcd 100644 --- a/src/csharp/LampControlApi.Tests/Infrastructure/LampControlDbContextTests.cs +++ b/src/csharp/LampControlApi.Tests/Infrastructure/LampControlDbContextTests.cs @@ -51,7 +51,7 @@ public void Lamps_ShouldBeDbSet() // Assert Assert.IsNotNull(context.Lamps); - Assert.IsInstanceOfType(context.Lamps, typeof(DbSet)); + Assert.IsInstanceOfType>(context.Lamps); } /// diff --git a/src/csharp/LampControlApi.Tests/Infrastructure/PostgresLampRepositoryUnitTests.cs b/src/csharp/LampControlApi.Tests/Infrastructure/PostgresLampRepositoryUnitTests.cs index 16d87690..639a7a21 100644 --- a/src/csharp/LampControlApi.Tests/Infrastructure/PostgresLampRepositoryUnitTests.cs +++ b/src/csharp/LampControlApi.Tests/Infrastructure/PostgresLampRepositoryUnitTests.cs @@ -27,6 +27,10 @@ public class PostgresLampRepositoryUnitTests public void Initialize() { this.mockLogger = new Mock>(); + + // [LoggerMessage] source-generated methods call IsEnabled() before Log(). + // Return true so the log call is not short-circuited by the mock. + this.mockLogger.Setup(l => l.IsEnabled(LogLevel.Debug)).Returns(true); } /// @@ -147,6 +151,7 @@ public async Task Operations_ShouldLogDebugMessages() await repository.DeleteAsync(lamp.Id); // Assert - Verify debug logging was called +#pragma warning disable CA1873 // Moq.Verify lambda is not a real log call; false positive this.mockLogger.Verify( logger => logger.Log( LogLevel.Debug, @@ -155,6 +160,7 @@ public async Task Operations_ShouldLogDebugMessages() It.IsAny(), It.IsAny>()), Times.AtLeast(5)); +#pragma warning restore CA1873 } /// diff --git a/src/csharp/LampControlApi.Tests/LampControlApi.Tests.csproj b/src/csharp/LampControlApi.Tests/LampControlApi.Tests.csproj index 590b999e..1f281b78 100644 --- a/src/csharp/LampControlApi.Tests/LampControlApi.Tests.csproj +++ b/src/csharp/LampControlApi.Tests/LampControlApi.Tests.csproj @@ -1,23 +1,24 @@ - net8.0 + net10.0 enable enable false true + true all - + - + diff --git a/src/csharp/LampControlApi.Tests/LampControllerImplementationTests.cs b/src/csharp/LampControlApi.Tests/LampControllerImplementationTests.cs index 447fa054..e1c341a0 100644 --- a/src/csharp/LampControlApi.Tests/LampControllerImplementationTests.cs +++ b/src/csharp/LampControlApi.Tests/LampControllerImplementationTests.cs @@ -577,7 +577,7 @@ public async Task DeleteLampAsync_WhenLampExists_ShouldDeleteSuccessfully() var actionResult = await _controller.DeleteLampAsync(lampId.ToString()); // Assert - No exception should be thrown and check for NoContentResult - Assert.IsInstanceOfType(actionResult, typeof(Microsoft.AspNetCore.Mvc.NoContentResult)); + Assert.IsInstanceOfType(actionResult); _mockRepository.Verify(r => r.DeleteAsync(lampId, It.IsAny()), Times.Once); } } diff --git a/src/csharp/LampControlApi.Tests/packages.lock.json b/src/csharp/LampControlApi.Tests/packages.lock.json new file mode 100644 index 00000000..1d3f8677 --- /dev/null +++ b/src/csharp/LampControlApi.Tests/packages.lock.json @@ -0,0 +1,624 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "coverlet.msbuild": { + "type": "Direct", + "requested": "[6.0.4, )", + "resolved": "6.0.4", + "contentHash": "Qa7Hg+wrOMDKpXVn2dw4Wlun490bIWsFW0fdNJQFJLZnbU27MCP0HJ2mPgS+3EQBQUb0zKlkwiQzP+j38Hc3Iw==" + }, + "Microsoft.AspNetCore.Mvc.Testing": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "Gdtv34h2qvynOEu+B2+6apBiiPhEs39namGax02UgaQMRetlxQ88p2/jK1eIdz3m1NRgYszNBN/jBdXkucZhvw==", + "dependencies": { + "Microsoft.AspNetCore.TestHost": "10.0.0", + "Microsoft.Extensions.DependencyModel": "10.0.0", + "Microsoft.Extensions.Hosting": "10.0.0" + } + }, + "Microsoft.EntityFrameworkCore.InMemory": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "06yN/NR9bOM7GjUR1hnucciiK8nrr0bs7MP6RKCdHQp5BCcR4P9zemtlz6aznJms1xvybPzKwESTtoC6XMAPQQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.0", + "Microsoft.Extensions.Caching.Memory": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "[3.1.1, )", + "resolved": "3.1.1", + "contentHash": "kMvdO5dhrUR3o1qk0fzS0St0prlKyMQAfz1ChVAUdGGobTU5ehR60szOFto0+Q7rFG5iXMvTlVIthXM9EcNYnw==" + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "[3.1.1, )", + "resolved": "3.1.1", + "contentHash": "3rjkGxciNHHmPW8cl1/QVIYjOpfptjmAH5JrLBw+dnMTYDoweg3I579N7OIbar3Zd3q9dfWFrCy2LEV/AmPn3A==" + }, + "Testcontainers.PostgreSql": { + "type": "Direct", + "requested": "[3.7.0, )", + "resolved": "3.7.0", + "contentHash": "cNQsV+igxcC9W3tSH9t7FRIHGzfrSk0i1JSAoNIEECIK/fbh2TeBewAfSlOt+JY3sJUgL6G+LQkAOkJRGTIKAA==", + "dependencies": { + "Testcontainers": "3.7.0" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Docker.DotNet": { + "type": "Transitive", + "resolved": "3.125.15", + "contentHash": "XN8FKxVv8Mjmwu104/Hl9lM61pLY675s70gzwSj8KR5pwblo8HfWLcCuinh9kYsqujBkMH4HVRCEcRuU6al4BQ==", + "dependencies": { + "Newtonsoft.Json": "13.0.1" + } + }, + "Docker.DotNet.X509": { + "type": "Transitive", + "resolved": "3.125.15", + "contentHash": "ONQN7ImrL3tHStUUCCPHwrFFQVpIpE+7L6jaDAMwSF+yTEmeWBmRARQZDRuvfj/+WtB8RR0oTW0tT3qQMSyHOw==", + "dependencies": { + "Docker.DotNet": "3.125.15" + } + }, + "Microsoft.AspNetCore.OpenApi": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "0aqIF1t+sA2T62LIeMtXGSiaV7keGQaJnvwwmu+htQdjCaKYARfXAeqp4nHH9y2etpilyZ/tnQzZg4Ilmo/c4Q==", + "dependencies": { + "Microsoft.OpenApi": "2.0.0" + } + }, + "Microsoft.AspNetCore.TestHost": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "Q3ia+k+wYM3Iv/Qq5IETOdpz/R0xizs3WNAXz699vEQx5TMVAfG715fBSq9Thzopvx8dYZkxQ/mumTn6AJ/vGQ==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "hHa2amRjMyBLUH/KTML6FgIAhZ0VFYkhCKwWEax0rO6iNeM1P5MflyeQLE5dniSIOZHc3Oqyv5UIyTFO4e1Auw==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.0", + "Microsoft.Extensions.Caching.Memory": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "C+TT9k7f1GQ8agOfV512K9iwrzi76RXVSDiLx+iWC9pz3QhEpSF1Dyk+FpVvd8ULQ+rqymfM8KQ7g48ttQVyMg==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "TxHQq0kn0tpYs2ljeRl8jtmWk720B0nteqI6mAZM77HWJpYT9Zj8SkkBBlj8K3Yeq18a6NBjz6YutE+shEk4Ag==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "A3MX1ee7RDxWCUdx/KqP+74fbksz0UIhkVZh56YHvbPkEKsffCXgHU3LGkRDwqR/MrBNWLCWC/IVX79tzM30ZA==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "10.0.0", + "Microsoft.Extensions.Caching.Memory": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0" + } + }, + "Microsoft.Extensions.ApiDescription.Server": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "NCWCGiwRwje8773yzPQhvucYnnfeR+ZoB1VRIrIMp4uaeUNw7jvEPHij3HIbwCDuNCrNcphA00KSAR9yD9qmbg==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "Zcoy6H9mSoGyvr7UvlGokEZrlZkcPCICPZr8mCsSt9U/N8eeCwCXwKF5bShdA66R0obxBCwP4AxomQHvVkC/uA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "krK19MKp0BNiR9rpBDW7PKSrTMLVlifS9am3CVc4O1Jq6GWz0o4F+sw5OSL4L3mVd56W8l6JRgghUa2KB51vOw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "10.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "H4SWETCh/cC5L1WtWchHR6LntGk3rDTTznZMssr4cL8IbDmMWBxY+MOGDc/ASnqNolLKPIWHWeuC1ddiL/iNPw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "d2kDKnCsJvY7mBVhcjPSp9BkJk48DsaHPg5u+Oy4f8XaOqnEedRy/USyvnpHL92wpJ6DrTPy7htppUUzskbCXQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "tMF9wNh+hlyYDWB8mrFCQHQmWHlRosol1b/N2Jrefy1bFLnuTlgSYmPyHNmz8xVQgs7DpXytBRWxGhG+mSTp0g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "CRj5clwZciVs46GMhAthkFq3+JiNM15Bz9CRlCZLBmRdggD6RwoBphRJ+EUDK2f+cZZ1L2zqVaQrn1KueoU5Kg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "TmFegsI/uCdwMBD4yKpmO+OkjVNHQL49Dh/ep83NI5rPUEoBK9OdsJo1zURc1A2FuS/R/Pos3wsTjlyLnguBLA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "LqCTyF0twrG4tyEN6PpSC5ewRBDwCBazRUfCOdRddwaQ3n2S57GDDeYOlTLcbV/V2dxSSZWg5Ofr48h6BsBmxw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0", + "Microsoft.Extensions.FileProviders.Physical": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "BIOPTEAZoeWbHlDT9Zudu+rpecZizFwhdIFRiyZKDml7JbayXmfTXKUt+ezifsSXfBkWDdJM10oDOxo8pufEng==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "B4qHB6gQ2B3I52YRohSV7wetp01BQzi8jDmrtiVm6e4l8vH5vjqwxWcR5wumGWjdBkj1asJLLsDIocdyTQSP0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Configuration.Json": "10.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0", + "Microsoft.Extensions.FileProviders.Physical": "10.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "f0RBabswJq+gRu5a+hWIobrLWiUYPKMhCD9WO3sYBAdSy3FFH14LMvLVFZc2kPSCimBLxSuitUhsd6tb0TAY6A==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "RFYJR7APio/BiqdQunRq6DB+nDB6nc2qhHr77mlvZ0q0BT8PubMXN7XicmfzCbrDE/dzhBnUKBRXLTcqUiZDGg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "xjkxIPgrT0mKTfBwb+CVqZnRchyZgzKIfDQOp8z+WUC6vPe3WokIf71z+hJPkH0YBUYJwa7Z/al1R087ib9oiw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "SfK89ytD61S7DgzorFljSkUeluC1ncn6dtZgwc0ot39f/BEYWBl5jpgvodxduoYAs1d9HG8faCDRZxE95UMo2A==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "4x6y2Uy+g9Ou93eBCVkG/3JCwnc2AMKhrE1iuEhXT/MzNN7co/Zt6yL+q1Srt0CnOe3iLX+sVqpJI4ZGlOPfug==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "10.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "jAhZbzDa117otUBMuQQ6JzSfuDbBBrfOs5jw5l7l9hKpzt+LjYKVjSauXG2yV9u7BqUSLUtKLwcerDQDeQ+0Xw==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "ND74bTLuvcrhpEPQU8QZwOrq08zPPj76Ev/60SX1juVKLSSnbknXNoOzNYMPJn3xvhyDHmqU3Hvb/aYV3uvvhQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Relational": "10.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "10.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "/ppSdehKk3fuXjlqCDgSOtjRK/pSHU8eWgzSHfHdwVm5BP4Dgejehkw+PtxKG2j98qTDEHDst2Y99aNsmJldmw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "UZUQ74lQMmvcprlG8w+XpxBbyRDQqfb7GAnccITw32hdkUBlmm9yNC4xl4aR9YjgV3ounZcub194sdmLSfBmPA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "5hfVl/e+bx1px2UkN+1xXhd3hu7Ui6ENItBzckFaRDQXfr+SHT/7qrCDrlQekCF/PBtEu2vtk87U2+gDEF8EhQ==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "yKJiVdXkSfe9foojGpBRbuDPQI8YD71IO/aE8ehGjRHE0VkEF/YWkW6StthwuFF146pc2lypZrpk/Tks6Plwhw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Configuration.Binder": "10.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "10.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.0", + "Microsoft.Extensions.Configuration.Json": "10.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "10.0.0", + "Microsoft.Extensions.DependencyInjection": "10.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Diagnostics": "10.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0", + "Microsoft.Extensions.FileProviders.Physical": "10.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.0", + "Microsoft.Extensions.Logging.Console": "10.0.0", + "Microsoft.Extensions.Logging.Debug": "10.0.0", + "Microsoft.Extensions.Logging.EventLog": "10.0.0", + "Microsoft.Extensions.Logging.EventSource": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "KrN6TGFwCwqOkLLk/idW/XtDQh+8In+CL9T4M1Dx+5ScsjTq4TlVbal8q532m82UYrMr6RiQJF2HvYCN0QwVsA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "BStFkd5CcnEtarlcgYDBcFzGYCuuNMzPs02wN3WBsOFoYIEmYoUdAiU+au6opzoqfTYJsMTW00AeqDdnXH2CvA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "j8zcwhS6bYB6FEfaY3nYSgHdpiL2T+/V3xjpHtslVAegyI1JUbB9yAt/BFdvZdsNbY0Udm4xFtvfT/hUwcOOOg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Configuration.Binder": "10.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "treWetuksp8LVb09fCJ5zNhNJjyDkqzVm83XxcrlWQnAdXznR140UUXo8PyEPBvFlHhjKhFQZEOP3Sk/ByCvEw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "A/4vBtVaySLBGj4qluye+KSbeVCCMa6GcTbxf2YgnSDHs9b9105+VojBJ1eJPel8F1ny0JOh+Ci3vgCKn69tNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "EWda5nSXhzQZr3yJ3+XgIApOek+Hm+txhWCEzWNVPp/OfimL4qmvctgXu87m+S2RXw/AoUP8aLMNicJ2KWblVA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0", + "System.Diagnostics.EventLog": "10.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "+Qc+kgoJi1w2A/Jm+7h04LcK2JoJkwAxKg7kBakkNRcemTmRGocqPa7rVNVGorTYruFrUS25GwkFNtOECnjhXg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Logging": "10.0.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "8oCAgXOow5XDrY9HaXX1QmH3ORsyZO/ANVHBlhLyCeWTH5Sg4UuqZeOTWJi6484M+LqSx0RqQXDJtdYy2BNiLQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "tL9cSl3maS5FPzp/3MtlZI21ExWhni0nnUCF8HY4npTsINw45n9SNDbkKXBMtFyUFGSsQep25fHIDN4f/Vp3AQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.0", + "Microsoft.Extensions.Configuration.Binder": "10.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.Options": "10.0.0", + "Microsoft.Extensions.Primitives": "10.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "inRnbpCS0nwO/RuoZIAqxQUuyjaknOOnCEZB55KSMMjRhl0RQDttSmLSGsUJN3RQ3ocf5NDLFd2mOQViHqMK5w==" + }, + "Microsoft.OpenApi": { + "type": "Transitive", + "resolved": "2.4.1", + "contentHash": "u7QhXCISMQuab3flasb1hoaiERmUqyWsW7tmQODyILoQ7mJV5IRGM+2KKZYo0QUfC13evEOcHAb6TPWgqEQtrw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "Npgsql": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "xZAYhPOU2rUIFpV48xsqhCx9vXs6Y+0jX2LCoSEfDFYMw9jtAOUk3iQsCnDLrFIv9NT3JGMihn7nnuZsPKqJmA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "10.0.0" + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "E2+uSWxSB8LdsUVwPaqRWOcGOP92biry2JEwc0KJMdLJF+aZdczeIdEXVwEyv4nSVMQJH0o8tLhyAMiR6VF0lw==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "[10.0.0, 11.0.0)", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.0, 11.0.0)", + "Npgsql": "10.0.0" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" + }, + "SharpZipLib": { + "type": "Transitive", + "resolved": "1.4.2", + "contentHash": "yjj+3zgz8zgXpiiC3ZdF/iyTBbz2fFvMxZFEBPUcwZjIvXOf37Ylm+K58hqMfIBt5JgU/Z2uoUS67JmTLe973A==" + }, + "SSH.NET": { + "type": "Transitive", + "resolved": "2023.0.0", + "contentHash": "g+3VDUrYhm0sqSxmlQFgRFrmBxhQvVh4pfn4pqjkX7WXE3tTjt1tIsOtjuz3mz/5s8gFFQVRydwCJ7Ohs54sJA==", + "dependencies": { + "SshNet.Security.Cryptography": "[1.3.0]" + } + }, + "SshNet.Security.Cryptography": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "5pBIXRjcSO/amY8WztpmNOhaaCNHY/B6CcYDI7FSTgqSyo/ZUojlLiKcsl+YGbxQuLX439qIkMfP0PHqxqJi/Q==" + }, + "Swashbuckle.AspNetCore": { + "type": "Transitive", + "resolved": "10.1.4", + "contentHash": "3y9YcUdzND3E21NiGvhxEVw2/rdQSbSLDOxrAMP96ZCaDVeB8b30L8QeWA9cfkxfyeXt+F2t1umKE0kaPxm4FA==", + "dependencies": { + "Microsoft.Extensions.ApiDescription.Server": "10.0.0", + "Swashbuckle.AspNetCore.Swagger": "10.1.4", + "Swashbuckle.AspNetCore.SwaggerGen": "10.1.4", + "Swashbuckle.AspNetCore.SwaggerUI": "10.1.4" + } + }, + "Swashbuckle.AspNetCore.Swagger": { + "type": "Transitive", + "resolved": "10.1.4", + "contentHash": "4ac45rVXsgustOXx6abChvIXtWjc1gUgwEpExz8pkQTTXjVTuRtfyMCN0srgxwpIAw/UoH/LYcbgqrjRcYwhfg==", + "dependencies": { + "Microsoft.OpenApi": "2.4.1" + } + }, + "Swashbuckle.AspNetCore.SwaggerGen": { + "type": "Transitive", + "resolved": "10.1.4", + "contentHash": "gbh8gJ97lMw0ScCdbEhAzwlHSWKiTzYtHfS6/e7u4e4c0ms6mOccLFgRsWF0ekgpDh+AlA0yWc5X5ec+6cxCXQ==", + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "10.1.4" + } + }, + "Swashbuckle.AspNetCore.SwaggerUI": { + "type": "Transitive", + "resolved": "10.1.4", + "contentHash": "A1ewmv/Xq5YkjQoSW29Kc9IoIC6pu210F1Fmzmj1EO7QJLTs6w3tOJatST6s41+Y8eUr5A1JLiXZ14U5EgN6ow==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.0", + "contentHash": "uaFRda9NjtbJRkdx311eXlAA3n2em7223c1A8d1VWyl+4FL9vkG7y2lpPfBU9HYdj/9KgdRNdn1vFK8ZYCYT/A==" + }, + "Testcontainers": { + "type": "Transitive", + "resolved": "3.7.0", + "contentHash": "Nn9/mVOiYEC1mdE0Kr2xQfVAV9mssLedalC6OnC59kHOudx2IhVgenHc983LIdMIhsYF9ywVnyW7HrJE7qVuJg==", + "dependencies": { + "BouncyCastle.Cryptography": "2.2.1", + "Docker.DotNet": "3.125.15", + "Docker.DotNet.X509": "3.125.15", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4", + "SSH.NET": "2023.0.0", + "SharpZipLib": "1.4.2" + } + }, + "lampcontrolapi": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "Microsoft.AspNetCore.OpenApi": "[10.0.0, )", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[10.0.0, )", + "Newtonsoft.Json": "[13.0.3, )", + "Npgsql.EntityFrameworkCore.PostgreSQL": "[10.0.0, )", + "Swashbuckle.AspNetCore": "[10.1.4, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/csharp/LampControlApi/Extensions/ServiceCollectionExtensions.cs b/src/csharp/LampControlApi/Extensions/ServiceCollectionExtensions.cs index f7e7739c..8b865f3c 100644 --- a/src/csharp/LampControlApi/Extensions/ServiceCollectionExtensions.cs +++ b/src/csharp/LampControlApi/Extensions/ServiceCollectionExtensions.cs @@ -66,7 +66,19 @@ public static bool AddLampControlServices( services.AddScoped(); services.AddEndpointsApiExplorer(); - services.AddSwaggerGen(); + + // Swashbuckle 10.x derives the tag name by stripping the "Controller" suffix. + // The generated NSwag controller class is literally named "Controller", so + // stripping the suffix yields an empty string and throws ArgumentNullException. + // Override TagActionsBy to fall back to "Lamps" when the name would be empty. + services.AddSwaggerGen(options => + { + options.TagActionsBy(api => + { + api.ActionDescriptor.RouteValues.TryGetValue("controller", out var controller); + return new[] { string.IsNullOrEmpty(controller) ? "Lamps" : controller }; + }); + }); return usePostgres; } diff --git a/src/csharp/LampControlApi/LampControlApi.csproj b/src/csharp/LampControlApi/LampControlApi.csproj index 5cef0062..f712832b 100644 --- a/src/csharp/LampControlApi/LampControlApi.csproj +++ b/src/csharp/LampControlApi/LampControlApi.csproj @@ -1,8 +1,8 @@ - net8.0 - false - enable + net10.0 + false + enable enable false @@ -15,25 +15,24 @@ - + - + all runtime; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers - - - + + all runtime; build; native; contentfiles; analyzers - + diff --git a/src/csharp/LampControlApi/Program.cs b/src/csharp/LampControlApi/Program.cs index 3ef3ce08..8d388ac0 100644 --- a/src/csharp/LampControlApi/Program.cs +++ b/src/csharp/LampControlApi/Program.cs @@ -36,11 +36,3 @@ app.ConfigurePipeline(); app.Run(); - -/// -/// Entry point for the LampControlApi application. This partial class is used for test accessibility. -/// -public partial class Program -{ - // Intentionally left blank. Used for test accessibility. -} diff --git a/src/csharp/LampControlApi/Services/PostgresLampRepository.cs b/src/csharp/LampControlApi/Services/PostgresLampRepository.cs index 54e3d30e..b27d128c 100644 --- a/src/csharp/LampControlApi/Services/PostgresLampRepository.cs +++ b/src/csharp/LampControlApi/Services/PostgresLampRepository.cs @@ -14,7 +14,7 @@ namespace LampControlApi.Services /// /// PostgreSQL implementation of the lamp repository using Entity Framework Core. /// - public class PostgresLampRepository : ILampRepository + public partial class PostgresLampRepository : ILampRepository { private readonly LampControlDbContext context; private readonly ILogger logger; @@ -35,7 +35,7 @@ public PostgresLampRepository( /// public async Task> GetAllAsync(CancellationToken cancellationToken = default) { - this.logger.LogDebug("Getting all lamps from PostgreSQL database"); + LogGettingAllLamps(this.logger); var dbEntities = await this.context.Lamps .OrderBy(l => l.CreatedAt) @@ -58,10 +58,7 @@ public async Task> ListAsync(int limit, int offset, Canc throw new ArgumentOutOfRangeException(nameof(offset), "Offset must be greater than or equal to 0."); } - this.logger.LogDebug( - "Listing lamps from PostgreSQL database (limit: {Limit}, offset: {Offset})", - limit, - offset); + LogListingLamps(this.logger, limit, offset); var dbEntities = await this.context.Lamps .OrderBy(l => l.CreatedAt) @@ -77,7 +74,7 @@ public async Task> ListAsync(int limit, int offset, Canc /// public async Task GetByIdAsync(Guid id, CancellationToken cancellationToken = default) { - this.logger.LogDebug("Getting lamp {LampId} from PostgreSQL database", id); + LogGettingLampById(this.logger, id); var dbEntity = await this.context.Lamps .AsNoTracking() @@ -94,7 +91,7 @@ public async Task CreateAsync(LampEntity entity, CancellationToken c throw new ArgumentNullException(nameof(entity)); } - this.logger.LogDebug("Creating lamp {LampId} in PostgreSQL database", entity.Id); + LogCreatingLamp(this.logger, entity.Id); var now = DateTimeOffset.UtcNow; var dbEntity = new LampDbEntity @@ -115,14 +112,14 @@ public async Task CreateAsync(LampEntity entity, CancellationToken c /// public async Task UpdateAsync(Guid id, bool status, CancellationToken cancellationToken = default) { - this.logger.LogDebug("Updating lamp {LampId} in PostgreSQL database", id); + LogUpdatingLamp(this.logger, id); var existingEntity = await this.context.Lamps .FirstOrDefaultAsync(l => l.Id == id, cancellationToken); if (existingEntity == null) { - this.logger.LogDebug("Lamp {LampId} not found for update", id); + LogLampNotFoundForUpdate(this.logger, id); return null; } @@ -144,7 +141,7 @@ public async Task CreateAsync(LampEntity entity, CancellationToken c /// public async Task DeleteAsync(Guid id, CancellationToken cancellationToken = default) { - this.logger.LogDebug("Deleting lamp {LampId} from PostgreSQL database", id); + LogDeletingLamp(this.logger, id); var existingEntity = await this.context.Lamps .IgnoreQueryFilters() @@ -152,7 +149,7 @@ public async Task DeleteAsync(Guid id, CancellationToken cancellationToken if (existingEntity == null) { - this.logger.LogDebug("Lamp {LampId} not found for deletion", id); + LogLampNotFoundForDeletion(this.logger, id); return false; } @@ -172,6 +169,30 @@ public async Task DeleteAsync(Guid id, CancellationToken cancellationToken return true; } + [LoggerMessage(Level = LogLevel.Debug, Message = "Getting all lamps from PostgreSQL database")] + private static partial void LogGettingAllLamps(ILogger logger); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Listing lamps from PostgreSQL database (limit: {Limit}, offset: {Offset})")] + private static partial void LogListingLamps(ILogger logger, int limit, int offset); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Getting lamp {LampId} from PostgreSQL database")] + private static partial void LogGettingLampById(ILogger logger, Guid lampId); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Creating lamp {LampId} in PostgreSQL database")] + private static partial void LogCreatingLamp(ILogger logger, Guid lampId); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Updating lamp {LampId} in PostgreSQL database")] + private static partial void LogUpdatingLamp(ILogger logger, Guid lampId); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Lamp {LampId} not found for update")] + private static partial void LogLampNotFoundForUpdate(ILogger logger, Guid lampId); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Deleting lamp {LampId} from PostgreSQL database")] + private static partial void LogDeletingLamp(ILogger logger, Guid lampId); + + [LoggerMessage(Level = LogLevel.Debug, Message = "Lamp {LampId} not found for deletion")] + private static partial void LogLampNotFoundForDeletion(ILogger logger, Guid lampId); + /// /// Maps a database entity to a domain entity. /// diff --git a/src/csharp/LampControlApi/packages.lock.json b/src/csharp/LampControlApi/packages.lock.json index f87303b3..34d29b48 100644 --- a/src/csharp/LampControlApi/packages.lock.json +++ b/src/csharp/LampControlApi/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net10.0": { "BouncyCastle.Cryptography": { "type": "Direct", "requested": "[2.4.0, )", @@ -10,41 +10,45 @@ }, "Microsoft.AspNetCore.OpenApi": { "type": "Direct", - "requested": "[8.0.15, )", - "resolved": "8.0.15", - "contentHash": "Nu/I5tek+FbumgyrfNAxcPZd8uQi6VTYfZ+6Wr/JYrHFM6zb6DJx99v5QjMnsf9ePHkUto0zvUFVaA2gpiV9mQ==", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "0aqIF1t+sA2T62LIeMtXGSiaV7keGQaJnvwwmu+htQdjCaKYARfXAeqp4nHH9y2etpilyZ/tnQzZg4Ilmo/c4Q==", "dependencies": { - "Microsoft.OpenApi": "1.4.3" + "Microsoft.OpenApi": "2.0.0" } }, "Microsoft.CodeAnalysis.NetAnalyzers": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "DxiTgkCl3CGq1rYmBX2wjY7XGbxiBdL4J+/AJIAFLKy5z70NxhnVRnPghnicXZ8oF6JKVXlW3xwznRbI3ioEKg==" + "requested": "[10.0.100, )", + "resolved": "10.0.100", + "contentHash": "uj9VuyvqylnNueJfU7u2PkI/hEMpZl8Wg9BXyI0eatNEldU5jDYPdwsM8aDL18+1oLovju25MiqOPaGRBnG72A==" }, "Microsoft.EntityFrameworkCore.Design": { "type": "Direct", - "requested": "[8.0.11, )", - "resolved": "8.0.11", - "contentHash": "KxOvpbaKiUmbLvenr0T/4F1Vdm0Sq+iajLbesQK7/WKB/Dx+FQHCZ0f5jCXrVWK2QKF9eHzQ5JPA1L6hcb25FQ==", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "R7BeFniEpBrHw8kKVtWiMG4PRAwJ4K1RZoQWB32Ak8ws3uvYH98DVp9Y2UBUgbwY5lR9wPlrxp7P3GGDQ7LUSQ==", "dependencies": { "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", - "Microsoft.EntityFrameworkCore.Relational": "8.0.11", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Mono.TextTemplating": "2.2.1" + "Microsoft.Build.Framework": "17.14.28", + "Microsoft.Build.Tasks.Core": "17.14.28", + "Microsoft.Build.Utilities.Core": "17.14.28", + "Microsoft.CodeAnalysis.CSharp": "4.14.0", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.14.0", + "Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.14.0", + "Microsoft.EntityFrameworkCore.Relational": "10.0.0", + "Microsoft.Extensions.DependencyModel": "10.0.0", + "Mono.TextTemplating": "3.0.0", + "Newtonsoft.Json": "13.0.3" } }, "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { "type": "Direct", - "requested": "[8.0.11, )", - "resolved": "8.0.11", - "contentHash": "+SVpb+dITG0G7X76+VfMHX92MA0Xp4xCk+LxFjc6jJcllGzOF1B4bqyzRVw809qTIdMPuO1KmGOciwQ4ziimUQ==", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "ND74bTLuvcrhpEPQU8QZwOrq08zPPj76Ev/60SX1juVKLSSnbknXNoOzNYMPJn3xvhyDHmqU3Hvb/aYV3uvvhQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "8.0.11", - "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11" + "Microsoft.EntityFrameworkCore.Relational": "10.0.0" } }, "Newtonsoft.Json": { @@ -55,14 +59,13 @@ }, "Npgsql.EntityFrameworkCore.PostgreSQL": { "type": "Direct", - "requested": "[8.0.11, )", - "resolved": "8.0.11", - "contentHash": "leShR/O/nSIS3Jpj8yUBmkzaXzBbtlV326+MYkX2BwAj2qSNrUv/H6m8G9Hnv2zUkQYccTpmV5jIVq5vdciEUA==", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "E2+uSWxSB8LdsUVwPaqRWOcGOP92biry2JEwc0KJMdLJF+aZdczeIdEXVwEyv4nSVMQJH0o8tLhyAMiR6VF0lw==", "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11", - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", - "Microsoft.EntityFrameworkCore.Relational": "8.0.11", - "Npgsql": "8.0.6" + "Microsoft.EntityFrameworkCore": "[10.0.0, 11.0.0)", + "Microsoft.EntityFrameworkCore.Relational": "[10.0.0, 11.0.0)", + "Npgsql": "10.0.0" } }, "StyleCop.Analyzers": { @@ -73,372 +76,316 @@ }, "Swashbuckle.AspNetCore": { "type": "Direct", - "requested": "[6.6.2, )", - "resolved": "6.6.2", - "contentHash": "+NB4UYVYN6AhDSjW0IJAd1AGD8V33gemFNLPaxKTtPkHB+HaKAKf9MGAEUPivEWvqeQfcKIw8lJaHq6LHljRuw==", + "requested": "[10.1.4, )", + "resolved": "10.1.4", + "contentHash": "3y9YcUdzND3E21NiGvhxEVw2/rdQSbSLDOxrAMP96ZCaDVeB8b30L8QeWA9cfkxfyeXt+F2t1umKE0kaPxm4FA==", "dependencies": { - "Microsoft.Extensions.ApiDescription.Server": "6.0.5", - "Swashbuckle.AspNetCore.Swagger": "6.6.2", - "Swashbuckle.AspNetCore.SwaggerGen": "6.6.2", - "Swashbuckle.AspNetCore.SwaggerUI": "6.6.2" + "Microsoft.Extensions.ApiDescription.Server": "10.0.0", + "Swashbuckle.AspNetCore.Swagger": "10.1.4", + "Swashbuckle.AspNetCore.SwaggerGen": "10.1.4", + "Swashbuckle.AspNetCore.SwaggerUI": "10.1.4" } }, - "System.Text.Json": { - "type": "Direct", - "requested": "[8.0.5, )", - "resolved": "8.0.5", - "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" - }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.14.1", "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.3", - "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" - }, - "Microsoft.CodeAnalysis.Common": { + "Microsoft.Build": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "resolved": "17.7.2", + "contentHash": "AmWnumxsMiRycFfE3kq/XnFFTAoPpCWl3UuiKQWCa5Z0+hBKVoiydzS2iXJGd3x+jry+qaTR9GzoezjV9NFT5A==", "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.3", - "System.Collections.Immutable": "6.0.0", - "System.Reflection.Metadata": "6.0.1", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "6.0.0" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.5.0]" - } - }, - "Microsoft.CodeAnalysis.CSharp.Workspaces": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", - "Microsoft.CodeAnalysis.Common": "[4.5.0]", - "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + "Microsoft.Build.Framework": "17.7.2", + "Microsoft.NET.StringTools": "17.7.2", + "System.Configuration.ConfigurationManager": "7.0.0", + "System.Reflection.MetadataLoadContext": "7.0.0", + "System.Security.Permissions": "7.0.0" } }, - "Microsoft.CodeAnalysis.Workspaces.Common": { + "Microsoft.Build.Framework": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "Microsoft.CodeAnalysis.Common": "[4.5.0]", - "System.Composition": "6.0.0", - "System.IO.Pipelines": "6.0.3", - "System.Threading.Channels": "6.0.0" - } + "resolved": "17.14.28", + "contentHash": "wRcyTzGV0LRAtFdrddtioh59Ky4/zbvyraP0cQkDzRSRkhgAQb0K88D/JNC6VHLIXanRi3mtV1jU0uQkBwmiVg==" }, - "Microsoft.EntityFrameworkCore": { + "Microsoft.Build.Tasks.Core": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "stbjWBTtpQ1HtqXMFyKnXFTr76PvaOHI2b2h85JqBi3eZr00nspvR/a90Zwh8CQ4rVawqLiTG0+0yZQWaav+sQ==", + "resolved": "17.14.28", + "contentHash": "jk3O0tXp9QWPXhLJ7Pl8wm/eGtGgA1++vwHGWEmnwMU6eP//ghtcCUpQh9CQMwEKGDnH0aJf285V1s8yiSlKfQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.11", - "Microsoft.Extensions.Caching.Memory": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1" + "Microsoft.Build.Framework": "17.14.28", + "Microsoft.Build.Utilities.Core": "17.14.28", + "Microsoft.NET.StringTools": "17.14.28", + "System.CodeDom": "9.0.0", + "System.Configuration.ConfigurationManager": "9.0.0", + "System.Formats.Nrbf": "9.0.0", + "System.Resources.Extensions": "9.0.0", + "System.Security.Cryptography.Pkcs": "9.0.0", + "System.Security.Cryptography.ProtectedData": "9.0.0" } }, - "Microsoft.EntityFrameworkCore.Abstractions": { + "Microsoft.Build.Utilities.Core": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "++zY0Ea724ku1jptWJmF7jm3I4IXTexfT4qi1ETcSFFF7qj+qm6rRgN7mTuKkwIETuXk0ikfzudryRjUGrrNKQ==" - }, - "Microsoft.EntityFrameworkCore.Analyzers": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "NI/AJQjtC7qgWM8Nr85sRkwlog2AnFer5RKP8xTUH0RuPF3nN0tGXBEeYJOLZWp+/+M/C6O7MMDRhKRE8bZwIA==" - }, - "Microsoft.EntityFrameworkCore.Relational": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "3TuuW3i5I4Ro0yoaHmi2MqEDGObOVuhLaMEnd/heaLB1fcvm4fu4PevmC4BOWnI0vo176AIlV5o4rEQciLoohw==", + "resolved": "17.14.28", + "contentHash": "rhSdPo8QfLXXWM+rY0x0z1G4KK4ZhMoIbHROyDj8MUBFab9nvHR0NaMnjzOgXldhmD2zi2ir8d6xCatNzlhF5g==", "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + "Microsoft.Build.Framework": "17.14.28", + "Microsoft.NET.StringTools": "17.14.28", + "System.Configuration.ConfigurationManager": "9.0.0", + "System.Security.Cryptography.ProtectedData": "9.0.0" } }, - "Microsoft.Extensions.ApiDescription.Server": { + "Microsoft.CodeAnalysis.Analyzers": { "type": "Transitive", - "resolved": "6.0.5", - "contentHash": "Ckb5EDBUNJdFWyajfXzUIMRkhf52fHZOQuuZg/oiu8y7zDCVwD0iHhew6MnThjHmevanpxL3f5ci2TtHQEN6bw==" + "resolved": "3.11.0", + "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" }, - "Microsoft.Extensions.Caching.Abstractions": { + "Microsoft.CodeAnalysis.Common": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", + "resolved": "4.14.0", + "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.CodeAnalysis.Analyzers": "3.11.0" } }, - "Microsoft.Extensions.Caching.Memory": { + "Microsoft.CodeAnalysis.CSharp": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "HFDnhYLccngrzyGgHkjEDU5FMLn4MpOsr5ElgsBMC4yx6lJh4jeWO7fHS8+TXPq+dgxCmUa/Trl8svObmwW4QA==", + "resolved": "4.14.0", + "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Common": "[4.14.0]" } }, - "Microsoft.Extensions.Configuration.Abstractions": { + "Microsoft.CodeAnalysis.CSharp.Workspaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "resolved": "4.14.0", + "contentHash": "QkgCEM4qJo6gdtblXtNgHqtykS61fxW+820hx5JN6n9DD4mQtqNB+6fPeJ3GQWg6jkkGz6oG9yZq7H3Gf0zwYw==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.CSharp": "[4.14.0]", + "Microsoft.CodeAnalysis.Common": "[4.14.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.14.0]", + "System.Composition": "9.0.0" } }, - "Microsoft.Extensions.DependencyInjection": { + "Microsoft.CodeAnalysis.Workspaces.Common": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "resolved": "4.14.0", + "contentHash": "wNVK9JrqjqDC/WgBUFV6henDfrW87NPfo98nzah/+M/G1D6sBOPtXwqce3UQNn+6AjTnmkHYN1WV9XmTlPemTw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Common": "[4.14.0]", + "System.Composition": "9.0.0" } }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, - "Microsoft.Extensions.Diagnostics.Abstractions": { + "Microsoft.CodeAnalysis.Workspaces.MSBuild": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", + "resolved": "4.14.0", + "contentHash": "YU7Sguzm1Cuhi2U6S0DRKcVpqAdBd2QmatpyE0KqYMJogJ9E27KHOWGUzAOjsyjAM7sNaUk+a8VPz24knDseFw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" + "Humanizer.Core": "2.14.1", + "Microsoft.Build": "17.7.2", + "Microsoft.Build.Framework": "17.7.2", + "Microsoft.Build.Tasks.Core": "17.7.2", + "Microsoft.Build.Utilities.Core": "17.7.2", + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.14.0]", + "Newtonsoft.Json": "13.0.3", + "System.CodeDom": "7.0.0", + "System.Composition": "9.0.0", + "System.Configuration.ConfigurationManager": "9.0.0", + "System.Resources.Extensions": "9.0.0", + "System.Security.Cryptography.Pkcs": "7.0.2", + "System.Security.Cryptography.ProtectedData": "9.0.0", + "System.Security.Permissions": "9.0.0", + "System.Windows.Extensions": "9.0.0" } }, - "Microsoft.Extensions.Diagnostics.HealthChecks": { + "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "zLgN22Zp9pk8RHlwssRTexw4+a6wqOnKWN+VejdPn5Yhjql4XiBhkFo35Nu8mmqHIk/UEmmCnMGLWq75aFfkOw==", + "resolved": "10.0.0", + "contentHash": "hHa2amRjMyBLUH/KTML6FgIAhZ0VFYkhCKwWEax0rO6iNeM1P5MflyeQLE5dniSIOZHc3Oqyv5UIyTFO4e1Auw==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" + "Microsoft.EntityFrameworkCore.Abstractions": "10.0.0", + "Microsoft.EntityFrameworkCore.Analyzers": "10.0.0" } }, - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "So3JUdRxozRjvQ3cxU6F3nI/i4emDnjane6yMYcJhvTTTu29ltlIdoXjkFGRceIWz8yKvuEpzXItZ0x5GvN2nQ==" + "resolved": "10.0.0", + "contentHash": "C+TT9k7f1GQ8agOfV512K9iwrzi76RXVSDiLx+iWC9pz3QhEpSF1Dyk+FpVvd8ULQ+rqymfM8KQ7g48ttQVyMg==" }, - "Microsoft.Extensions.FileProviders.Abstractions": { + "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - } + "resolved": "10.0.0", + "contentHash": "TxHQq0kn0tpYs2ljeRl8jtmWk720B0nteqI6mAZM77HWJpYT9Zj8SkkBBlj8K3Yeq18a6NBjz6YutE+shEk4Ag==" }, - "Microsoft.Extensions.Hosting.Abstractions": { + "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", + "resolved": "10.0.0", + "contentHash": "A3MX1ee7RDxWCUdx/KqP+74fbksz0UIhkVZh56YHvbPkEKsffCXgHU3LGkRDwqR/MrBNWLCWC/IVX79tzM30ZA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", - "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + "Microsoft.EntityFrameworkCore": "10.0.0" } }, - "Microsoft.Extensions.Logging": { + "Microsoft.Extensions.ApiDescription.Server": { "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.1", - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", - "Microsoft.Extensions.Options": "8.0.2" - } + "resolved": "10.0.0", + "contentHash": "NCWCGiwRwje8773yzPQhvucYnnfeR+ZoB1VRIrIMp4uaeUNw7jvEPHij3HIbwCDuNCrNcphA00KSAR9yD9qmbg==" }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" - } - }, - "Microsoft.Extensions.Options": { + "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } + "resolved": "10.0.0", + "contentHash": "RFYJR7APio/BiqdQunRq6DB+nDB6nc2qhHr77mlvZ0q0BT8PubMXN7XicmfzCbrDE/dzhBnUKBRXLTcqUiZDGg==" }, - "Microsoft.Extensions.Primitives": { + "Microsoft.NET.StringTools": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + "resolved": "17.14.28", + "contentHash": "DMIeWDlxe0Wz0DIhJZ2FMoGQAN2yrGZOi5jjFhRYHWR5ONd0CS6IpAHlRnA7uA/5BF+BADvgsETxW2XrPiFc1A==" }, "Microsoft.OpenApi": { "type": "Transitive", - "resolved": "1.6.14", - "contentHash": "tTaBT8qjk3xINfESyOPE2rIellPvB7qpVqiWiyA/lACVvz+xOGiXhFUfohcx82NLbi5avzLW0lx+s6oAqQijfw==" + "resolved": "2.4.1", + "contentHash": "u7QhXCISMQuab3flasb1hoaiERmUqyWsW7tmQODyILoQ7mJV5IRGM+2KKZYo0QUfC13evEOcHAb6TPWgqEQtrw==" }, "Mono.TextTemplating": { "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "resolved": "3.0.0", + "contentHash": "YqueG52R/Xej4VVbKuRIodjiAhV0HR/XVbLbNrJhCZnzjnSjgMJ/dCdV0akQQxavX6hp/LC6rqLGLcXeQYU7XA==", "dependencies": { - "System.CodeDom": "4.4.0" + "System.CodeDom": "6.0.0" } }, "Npgsql": { "type": "Transitive", - "resolved": "8.0.6", - "contentHash": "KaS6CY5kY2Sd0P00MSeFcOI3t2DiQ4UWG8AuRpVOUeDWITOKfoEEG91DP3cmT6aerixPkjwKgXxnpDxIkDpO6g==", - "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" - } + "resolved": "10.0.0", + "contentHash": "xZAYhPOU2rUIFpV48xsqhCx9vXs6Y+0jX2LCoSEfDFYMw9jtAOUk3iQsCnDLrFIv9NT3JGMihn7nnuZsPKqJmA==" }, "Swashbuckle.AspNetCore.Swagger": { "type": "Transitive", - "resolved": "6.6.2", - "contentHash": "ovgPTSYX83UrQUWiS5vzDcJ8TEX1MAxBgDFMK45rC24MorHEPQlZAHlaXj/yth4Zf6xcktpUgTEBvffRQVwDKA==", + "resolved": "10.1.4", + "contentHash": "4ac45rVXsgustOXx6abChvIXtWjc1gUgwEpExz8pkQTTXjVTuRtfyMCN0srgxwpIAw/UoH/LYcbgqrjRcYwhfg==", "dependencies": { - "Microsoft.OpenApi": "1.6.14" + "Microsoft.OpenApi": "2.4.1" } }, "Swashbuckle.AspNetCore.SwaggerGen": { "type": "Transitive", - "resolved": "6.6.2", - "contentHash": "zv4ikn4AT1VYuOsDCpktLq4QDq08e7Utzbir86M5/ZkRaLXbCPF11E1/vTmOiDzRTl0zTZINQU2qLKwTcHgfrA==", + "resolved": "10.1.4", + "contentHash": "gbh8gJ97lMw0ScCdbEhAzwlHSWKiTzYtHfS6/e7u4e4c0ms6mOccLFgRsWF0ekgpDh+AlA0yWc5X5ec+6cxCXQ==", "dependencies": { - "Swashbuckle.AspNetCore.Swagger": "6.6.2" + "Swashbuckle.AspNetCore.Swagger": "10.1.4" } }, "Swashbuckle.AspNetCore.SwaggerUI": { "type": "Transitive", - "resolved": "6.6.2", - "contentHash": "mBBb+/8Hm2Q3Wygag+hu2jj69tZW5psuv0vMRXY07Wy+Rrj40vRP8ZTbKBhs91r45/HXT4aY4z0iSBYx1h6JvA==" + "resolved": "10.1.4", + "contentHash": "A1ewmv/Xq5YkjQoSW29Kc9IoIC6pu210F1Fmzmj1EO7QJLTs6w3tOJatST6s41+Y8eUr5A1JLiXZ14U5EgN6ow==" }, "System.CodeDom": { "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } + "resolved": "9.0.0", + "contentHash": "oTE5IfuMoET8yaZP/vdvy9xO47guAv/rOhe4DODuFBN3ySprcQOlXqO3j+e/H/YpKKR5sglrxRaZ2HYOhNJrqA==" }, "System.Composition": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "resolved": "9.0.0", + "contentHash": "3Djj70fFTraOarSKmRnmRy/zm4YurICm+kiCtI0dYRqGJnLX6nJ+G3WYuFJ173cAPax/gh96REcbNiVqcrypFQ==", "dependencies": { - "System.Composition.AttributedModel": "6.0.0", - "System.Composition.Convention": "6.0.0", - "System.Composition.Hosting": "6.0.0", - "System.Composition.Runtime": "6.0.0", - "System.Composition.TypedParts": "6.0.0" + "System.Composition.AttributedModel": "9.0.0", + "System.Composition.Convention": "9.0.0", + "System.Composition.Hosting": "9.0.0", + "System.Composition.Runtime": "9.0.0", + "System.Composition.TypedParts": "9.0.0" } }, "System.Composition.AttributedModel": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + "resolved": "9.0.0", + "contentHash": "iri00l/zIX9g4lHMY+Nz0qV1n40+jFYAmgsaiNn16xvt2RDwlqByNG4wgblagnDYxm3YSQQ0jLlC/7Xlk9CzyA==" }, "System.Composition.Convention": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "resolved": "9.0.0", + "contentHash": "+vuqVP6xpi582XIjJi6OCsIxuoTZfR0M7WWufk3uGDeCl3wGW6KnpylUJ3iiXdPByPE0vR5TjJgR6hDLez4FQg==", "dependencies": { - "System.Composition.AttributedModel": "6.0.0" + "System.Composition.AttributedModel": "9.0.0" } }, "System.Composition.Hosting": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "resolved": "9.0.0", + "contentHash": "OFqSeFeJYr7kHxDfaViGM1ymk7d4JxK//VSoNF9Ux0gpqkLsauDZpu89kTHHNdCWfSljbFcvAafGyBoY094btQ==", "dependencies": { - "System.Composition.Runtime": "6.0.0" + "System.Composition.Runtime": "9.0.0" } }, "System.Composition.Runtime": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + "resolved": "9.0.0", + "contentHash": "w1HOlQY1zsOWYussjFGZCEYF2UZXgvoYnS94NIu2CBnAGMbXFAX8PY8c92KwUItPmowal68jnVLBCzdrWLeEKA==" }, "System.Composition.TypedParts": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "resolved": "9.0.0", + "contentHash": "aRZlojCCGEHDKqh43jaDgaVpYETsgd7Nx4g1zwLKMtv4iTo0627715ajEFNpEEBTgLmvZuv8K0EVxc3sM4NWJA==", + "dependencies": { + "System.Composition.AttributedModel": "9.0.0", + "System.Composition.Hosting": "9.0.0", + "System.Composition.Runtime": "9.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "PdkuMrwDhXoKFo/JxISIi9E8L+QGn9Iquj2OKDWHB6Y/HnUOuBouF7uS3R4Hw3FoNmwwMo6hWgazQdyHIIs27A==", "dependencies": { - "System.Composition.AttributedModel": "6.0.0", - "System.Composition.Hosting": "6.0.0", - "System.Composition.Runtime": "6.0.0" + "System.Security.Cryptography.ProtectedData": "9.0.0" } }, - "System.IO.Pipelines": { + "System.Formats.Nrbf": { "type": "Transitive", - "resolved": "6.0.3", - "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + "resolved": "9.0.0", + "contentHash": "F/6tNE+ckmdFeSQAyQo26bQOqfPFKEfZcuqnp4kBE6/7jP26diP+QTHCJJ6vpEfaY6bLy+hBLiIQUSxSmNwLkA==" }, - "System.Reflection.Metadata": { + "System.Reflection.MetadataLoadContext": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==", + "resolved": "7.0.0", + "contentHash": "z9PvtMJra5hK8n+g0wmPtaG7HQRZpTmIPRw5Z0LEemlcdQMHuTD5D7OAY/fZuuz1L9db++QOcDF0gJTLpbMtZQ==" + }, + "System.Resources.Extensions": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "tvhuT1D2OwPROdL1kRWtaTJliQo0WdyhvwDpd8RM997G7m3Hya5nhbYhNTS75x6Vu+ypSOgL5qxDCn8IROtCxw==", "dependencies": { - "System.Collections.Immutable": "6.0.0" + "System.Formats.Nrbf": "9.0.0" } }, - "System.Runtime.CompilerServices.Unsafe": { + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "8tluJF8w9si+2yoHeL8rgVJS6lKvWomTDC8px65Z8MCzzdME5eaPtEQf4OfVGrAxB5fW93ncucy1+221O9EQaw==" + }, + "System.Security.Cryptography.ProtectedData": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + "resolved": "9.0.0", + "contentHash": "CJW+x/F6fmRQ7N6K8paasTw9PDZp4t7G76UjGNlSDgoHPF0h08vTzLYbLZpOLEJSg35d5wy2jCXGo84EN05DpQ==" }, - "System.Text.Encoding.CodePages": { + "System.Security.Permissions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", + "resolved": "9.0.0", + "contentHash": "H2VFD4SFVxieywNxn9/epb63/IOcPPfA0WOtfkljzNfu7GCcHIBQNuwP6zGCEIi7Ci/oj8aLPUNK9sYImMFf4Q==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "System.Windows.Extensions": "9.0.0" } }, - "System.Threading.Channels": { + "System.Windows.Extensions": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + "resolved": "9.0.0", + "contentHash": "U9msthvnH2Fsw7xwAvIhNHOdnIjOQTwOc8Vd0oGOsiRcGMGoBFlUD6qtYawRUoQdKH9ysxesZ9juFElt1Jw/7A==" } } } diff --git a/src/csharp/LampControlApi/global.json b/src/csharp/global.json similarity index 66% rename from src/csharp/LampControlApi/global.json rename to src/csharp/global.json index 501e79a8..d92a2949 100644 --- a/src/csharp/LampControlApi/global.json +++ b/src/csharp/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "10.0.103", "rollForward": "latestFeature" } } \ No newline at end of file