diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index dc9ae24a..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,17 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - # Check for updates to GitHub Actions every weekday - interval: "weekly" - - - package-ecosystem: "nuget" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "weekly" diff --git a/.github/workflows/build-test-analyse.yml b/.github/workflows/build-test-analyse.yml deleted file mode 100644 index 4a150d27..00000000 --- a/.github/workflows/build-test-analyse.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Build, Test, and Analyse - -on: - workflow_call: - -jobs: - build: - name: Build & Test - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - uses: actions/cache@v3 - with: - path: | - ~/.nuget/packages - !~/.nuget/packages/unwanted - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- - - name: Setup .NET Core - uses: actions/setup-dotnet@v3 - with: - global-json-file: global.json - - - name: Install dependencies - run: dotnet restore --locked-mode - - - name: Build - run: dotnet build -c Release --no-restore - - - name: Test - run: dotnet test -c Release --no-restore --collect:"XPlat Code Coverage" --logger "trx;LogFilePrefix=TestResults" --results-directory TestResults -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover - - - name: upload TestResults - uses: actions/upload-artifact@v3 - with: - name: test-results-${{ github.sha }} - path: | - ./TestResults/*.trx - ./TestResults/**/coverage.opencover.xml diff --git a/.github/workflows/dependabot-packagelock-update.yml b/.github/workflows/dependabot-packagelock-update.yml deleted file mode 100644 index 306c008b..00000000 --- a/.github/workflows/dependabot-packagelock-update.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Restore package-lock on Dependabot PR - -on: - pull_request: - -jobs: - restore: - name: Update packages.lock.json files - if: contains(github.head_ref, 'dependabot') && contains(github.actor, 'dependabot[bot]') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - ref: ${{ github.head_ref }} - token: ${{ secrets.DEPENDABOT_PAT }} - - uses: actions/setup-dotnet@v3 - with: - global-json-file: global.json - - - run: dotnet restore --force-evaluate - - id: diff - continue-on-error: true - run: | - git add -N . - git diff --name-only --exit-code - - if: steps.diff.outcome == 'failure' - run: | - git config user.email "49699333+dependabot[bot]@users.noreply.github.com" - git config user.name "dependabot[bot]" - git add . - git commit -m "chore(deps): update packages.lock.json" - git push diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 65ba8654..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Deploy to Amazon ECS - -on: - push: - branches: "release-*" - -env: - AWS_REGION: eu-west-2 - ECS_SERVICE: answerking-dotnet-api-ecs-service - ECS_CLUSTER: answerking-dotnet-api-ecs-cluster - ECS_TASK_DEFINITION: task-definition.json - CONTAINER_NAME: answerking-dotnet-api-container - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - -jobs: - deploy: - name: Deploy - runs-on: ubuntu-latest - environment: production - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: ${{ env.AWS_REGION }} - - - name: Log in to github registry - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set version variable - run: | - echo "VERSION=$(echo $GITHUB_REF | sed -e 's#refs/heads/release-#v#g')" >> $GITHUB_ENV - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=raw, value=latest - type=raw, value=${{ env.VERSION }} - - - name: Build image - id: build-image - uses: docker/build-push-action@v2 - with: - context: . - file: ./dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - - name: Download task definition - run: aws ecs describe-task-definition --task-definition answerking-dotnet-api-task --query taskDefinition > ${{ env.ECS_TASK_DEFINITION }} - - - name: Fill in the new image ID in the Amazon ECS task definition - id: task-def - uses: aws-actions/amazon-ecs-render-task-definition@v1 - with: - task-definition: ${{ env.ECS_TASK_DEFINITION }} - container-name: ${{ env.CONTAINER_NAME }} - image: ${{ steps.build-image.outputs.imageid }} - - - name: Deploy Amazon ECS task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: ${{ env.ECS_TASK_DEFINITION }} - service: ${{ env.ECS_SERVICE }} - cluster: ${{ env.ECS_CLUSTER }} - wait-for-service-stability: true \ No newline at end of file diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 41bb9ce1..73e94962 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -3,13 +3,32 @@ name: On Pull Request on: pull_request: branches: - - main - develop + paths: + - '**.cs' + - '**.csproj' + +env: + DOTNET_VERSION: '7.0.102' # The .NET SDK version to use jobs: - pull-request: - name: test, report, and analyse - uses: ./.github/workflows/build-test-analyse.yml - secrets: inherit + build-and-test: + + name: build-and-test + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} - # job can be expanded to handle seperate pr actions such as close/merge/conflict + - name: Install dependencies + run: dotnet restore + + - name: Build + run: dotnet build --configuration Debug --no-restore + + - name: Run NUnit tests + run: dotnet test --no-build --configuration Debug --filter Category=IntegrationTests diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index 3c854471..00000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: On Push - -on: - push - -jobs: - push-develop: - name: Build, Test & Analyse - if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch) - uses: ./.github/workflows/build-test-analyse.yml - secrets: inherit - - build: - name: Build & Test - if: github.ref != format('refs/heads/{0}', github.event.repository.default_branch) - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - uses: actions/cache@v3 - with: - path: | - ~/.nuget/packages - !~/.nuget/packages/unwanted - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- - - name: Setup .NET Core - uses: actions/setup-dotnet@v3 - with: - global-json-file: global.json - - - name: Install dependencies - run: dotnet restore --locked-mode - - - name: Build - run: dotnet build -c Release --no-restore - - - name: Test - run: dotnet test -c Release --no-restore diff --git a/.github/workflows/workflow-dispatch.yaml b/.github/workflows/workflow-dispatch.yaml new file mode 100644 index 00000000..a4a71584 --- /dev/null +++ b/.github/workflows/workflow-dispatch.yaml @@ -0,0 +1,32 @@ +name: Workflow Dispatch + +on: + push: + branches: + - develop + workflow_dispatch: # Manual Trigger + +env: + DOTNET_VERSION: '7.0.102' # The .NET SDK version to use + +jobs: + build-and-test: + + name: build-and-test + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Install dependencies + run: dotnet restore + + - name: Build + run: dotnet build --configuration Debug --no-restore -nowarn:1591 + + - name: Run NUnit tests + run: dotnet test --no-build --configuration Debug --filter Category=IntegrationTests diff --git a/Answer.King.sln b/Answer.King.sln index 1f902ca4..90b83bb9 100644 --- a/Answer.King.sln +++ b/Answer.King.sln @@ -21,13 +21,21 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Answer.King.Api.UnitTests", EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{B13B327D-8EF3-4B55-A522-648B46176A62}" ProjectSection(SolutionItems) = preProject - global.json = global.json - README.md = README.md .editorconfig = .editorconfig Directory.Build.props = Directory.Build.props + global.json = global.json + README.md = README.md EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Answer.King.Infrastructure.UnitTests", "tests\Answer.King.Infrastructure.UnitTests\Answer.King.Infrastructure.UnitTests.csproj", "{C1175B84-7518-404B-9DA7-85D0BF051C6B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Answer.King.Infrastructure.UnitTests", "tests\Answer.King.Infrastructure.UnitTests\Answer.King.Infrastructure.UnitTests.csproj", "{C1175B84-7518-404B-9DA7-85D0BF051C6B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Answer.King.IntegrationTests", "tests\Answer.King.IntegrationTests\Answer.King.IntegrationTests.csproj", "{E794D3D2-E323-48AB-A507-FA361E060618}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A7366D48-A55F-477D-AC26-8D061A839D37}" + ProjectSection(SolutionItems) = preProject + .github\workflows\pull-request.yml = .github\workflows\pull-request.yml + .github\workflows\workflow-dispatch.yaml = .github\workflows\workflow-dispatch.yaml + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -123,6 +131,18 @@ Global {C1175B84-7518-404B-9DA7-85D0BF051C6B}.Release|x64.Build.0 = Release|Any CPU {C1175B84-7518-404B-9DA7-85D0BF051C6B}.Release|x86.ActiveCfg = Release|Any CPU {C1175B84-7518-404B-9DA7-85D0BF051C6B}.Release|x86.Build.0 = Release|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Debug|x64.ActiveCfg = Debug|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Debug|x64.Build.0 = Debug|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Debug|x86.ActiveCfg = Debug|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Debug|x86.Build.0 = Debug|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Release|Any CPU.Build.0 = Release|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Release|x64.ActiveCfg = Release|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Release|x64.Build.0 = Release|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Release|x86.ActiveCfg = Release|Any CPU + {E794D3D2-E323-48AB-A507-FA361E060618}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -135,6 +155,7 @@ Global {625E8357-4943-46FB-AB0E-C25CF0A3AB02} = {F3A9A152-CBD9-4004-9745-1478B24AEB9B} {4C8C0B44-7F02-4F69-A3BA-0AD7E9231BAD} = {F3A9A152-CBD9-4004-9745-1478B24AEB9B} {C1175B84-7518-404B-9DA7-85D0BF051C6B} = {F3A9A152-CBD9-4004-9745-1478B24AEB9B} + {E794D3D2-E323-48AB-A507-FA361E060618} = {F3A9A152-CBD9-4004-9745-1478B24AEB9B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B0807BAF-430C-45E0-89FB-DB6ABAF9D5C4} diff --git a/src/Answer.King.Api/Answer.King.Api.csproj b/src/Answer.King.Api/Answer.King.Api.csproj index acb8251d..eb8ec4ba 100644 --- a/src/Answer.King.Api/Answer.King.Api.csproj +++ b/src/Answer.King.Api/Answer.King.Api.csproj @@ -53,14 +53,11 @@ + - - - - diff --git a/src/Answer.King.Api/Program.cs b/src/Answer.King.Api/Program.cs index d6035c72..b379a1e5 100644 --- a/src/Answer.King.Api/Program.cs +++ b/src/Answer.King.Api/Program.cs @@ -114,3 +114,8 @@ app.MapHealthChecks("/health"); app.Run(); + +#pragma warning disable SA1601 +public partial class Program +{ +} diff --git a/src/Answer.King.Domain/Answer.King.Domain.csproj b/src/Answer.King.Domain/Answer.King.Domain.csproj index f17dbec5..7097e66d 100644 --- a/src/Answer.King.Domain/Answer.King.Domain.csproj +++ b/src/Answer.King.Domain/Answer.King.Domain.csproj @@ -20,7 +20,7 @@ - 1701;1702 + 1701;1702;1591 diff --git a/tests/Answer.King.IntegrationTests/Answer.King.IntegrationTests.csproj b/tests/Answer.King.IntegrationTests/Answer.King.IntegrationTests.csproj new file mode 100644 index 00000000..9d469228 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Answer.King.IntegrationTests.csproj @@ -0,0 +1,47 @@ + + + + net7.0 + enable + + false + + + + true + $(NoWarn);CS1591;CS1573 + False + False + + + + CA1707;CS1591;CS1573;CS1591 + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/Answer.King.IntegrationTests/POCO/ErrorResponse.cs b/tests/Answer.King.IntegrationTests/POCO/ErrorResponse.cs new file mode 100644 index 00000000..0c9d5782 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/POCO/ErrorResponse.cs @@ -0,0 +1,12 @@ +namespace Answer.King.IntegrationTests.POCO; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +internal class ErrorResponse +{ + public required object Errors { get; set; } + public required int Status { get; set; } +} diff --git a/tests/Answer.King.IntegrationTests/TestData/DataHelper.cs b/tests/Answer.King.IntegrationTests/TestData/DataHelper.cs new file mode 100644 index 00000000..e8743b17 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/TestData/DataHelper.cs @@ -0,0 +1,16 @@ +namespace Answer.King.IntegrationTests.TestData; + +using System; +using System.Linq; +using Answer.King.Api.RequestModels; + +internal class DataHelper +{ + public static Order GetOrderData(string name) + { + var orderData = OrdersData.AllOrders.FirstOrDefault(x => x.Name.Contains(name)) ?? throw new Exception("Order data cannot be found"); + { + return orderData.Order; + } + } +} diff --git a/tests/Answer.King.IntegrationTests/TestData/OrderData.cs b/tests/Answer.King.IntegrationTests/TestData/OrderData.cs new file mode 100644 index 00000000..9a7bf626 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/TestData/OrderData.cs @@ -0,0 +1,193 @@ +namespace Answer.King.IntegrationTests.TestData; +using System.Collections.Generic; +using Answer.King.Api.RequestModels; + +public class OrderData +{ + public required string Name; + public required Order Order; +} + +public static class OrdersData +{ + public static List AllOrders = new() + { + new OrderData() + { + Name = "Single_Line_Order", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 1, + Quantity = 1, + }, + }, + }, + }, + + new OrderData() + { + Name = "Multiple_Products_Order", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 1, + Quantity = 1, + }, + new LineItem() + { + ProductId = 2, + Quantity = 1, + }, + new LineItem() + { + ProductId = 5, + Quantity = 1, + }, + }, + }, + }, + + new OrderData() + { + Name = "Multiple_Same_Product_Multiple_Lines_Order", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 2, + Quantity = 1, + }, + new LineItem() + { + ProductId = 2, + Quantity = 1, + }, + new LineItem() + { + ProductId = 2, + Quantity = 1, + }, + }, + }, + }, + + new OrderData() + { + Name = "Multiple_Same_Product_Same_Line_Order", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 5, + Quantity = 10, + }, + }, + }, + }, + + new OrderData() + { + Name = "Fail_Retired_Product_Order", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 3, + Quantity = 1, + }, + }, + }, + }, + + new OrderData() + { + Name = "Fail_Invalid_Product_Id", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 0, + Quantity = 5, + }, + }, + }, + }, + + new OrderData() + { + Name = "Fail_No_Product_Line", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + Quantity = 5, + }, + }, + }, + }, + + new OrderData() + { + Name = "Fail_No_Quantity_Line", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 2, + }, + }, + }, + }, + + new OrderData() + { + Name = "Fail_No_Quantity", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 2, + Quantity = 0, + }, + }, + }, + }, + + new OrderData() + { + Name = "Fail_Negative_Quantity", + Order = new Order() + { + LineItems = new List() + { + new LineItem() + { + ProductId = 2, + Quantity = -100, + }, + }, + }, + }, + }; +} diff --git a/tests/Answer.King.IntegrationTests/TestSettings.json b/tests/Answer.King.IntegrationTests/TestSettings.json new file mode 100644 index 00000000..35f53b79 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/TestSettings.json @@ -0,0 +1,3 @@ +{ + "baseUrl": "https://localhost:44333" +} diff --git a/tests/Answer.King.IntegrationTests/Tests/AnswerKingPostOrder.cs b/tests/Answer.King.IntegrationTests/Tests/AnswerKingPostOrder.cs new file mode 100644 index 00000000..9135d611 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/AnswerKingPostOrder.cs @@ -0,0 +1,82 @@ +using Answer.King.IntegrationTests.POCO; +using Answer.King.IntegrationTests.TestData; +using Answer.King.IntegrationTests.Utilities; +using FluentAssertions; +using Newtonsoft.Json.Linq; +using Snapshooter.NUnit; +using static RestAssured.Dsl; + +namespace Answer.King.IntegrationTests.Tests; +[TestFixture, Category("IntegrationTests")] +public class AnswerKingPostOrder : BaseTestClass +{ + [Parallelizable(scope: ParallelScope.Self)] + [Test] + public void GetAllOrders() + { + Given(this.Client) + .When() + .Get("https://localhost:44333/api/orders") + .Then() + .StatusCode(200); + } + + [TestCase("Single_Line_Order", "5.99")] + [TestCase("Multiple_Products_Order", "18.97")] + [TestCase("Multiple_Same_Product_Multiple_Lines_Order", "8.97")] + [TestCase("Multiple_Same_Product_Same_Line_Order", "99.9")] + public void ProductOrder_Success(string name, string orderTotal) + { + var orderRequest = DataHelper.GetOrderData(name); + + JObject orderResponse = (JObject)Given(this.Client) + .Body(orderRequest) + .When() + .Post("https://localhost:44333/api/orders") + .Then() + .StatusCode(201) + .DeserializeTo(typeof(JObject)); + + Snapshot.Match(orderResponse, matchOptions => matchOptions + .IgnoreField("id") + .IgnoreField("createdOn") + .IgnoreField("lastUpdated")); + + orderResponse?.SelectToken("orderTotal")?.ToString().Should().Be(orderTotal); + } + + + //[TestCase("Fail_Retired_Product_Order")] + [TestCase("Fail_Invalid_Product_Id")] + [TestCase("Fail_No_Product_Line")] + //[TestCase("Fail_No_Quantity_Line")] + //[TestCase("Fail_No_Quantity")] + [TestCase("Fail_Negative_Quantity")] + public void ProductOrder_Fail(string name) + { + var orderRequest = DataHelper.GetOrderData(name); + + var orderResponse = (ErrorResponse)Given(this.Client) + .Body(orderRequest) + .When() + .Post("https://localhost:44333/api/orders") + .Then() + .StatusCode(400) + .DeserializeTo(typeof(ErrorResponse)); + + Snapshot.Match(orderResponse); + } + + [Test] + public void ProductOrder_Fail_NoBody() + { + var response = (ErrorResponse)Given(this.Client) + .When() + .Post("https://localhost:44333/api/orders") + .Then() + .StatusCode(400) + .DeserializeTo(typeof(ErrorResponse)); + + Snapshot.Match(response); + } +} diff --git a/tests/Answer.King.IntegrationTests/Tests/DataBaseTests.cs b/tests/Answer.King.IntegrationTests/Tests/DataBaseTests.cs new file mode 100644 index 00000000..3a163cc6 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/DataBaseTests.cs @@ -0,0 +1,96 @@ +namespace Answer.King.IntegrationTests.Tests; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using FluentAssertions; +using FluentAssertions.Extensions; +using Npgsql; + +//The tests in here are mocked data to practice how I could do DB testing and assertions with a working SQL DB + +[TestFixture] +public class BeeKeeperDBTests +{ + [Test] + public async Task OrderAssertionsProductId() + { + + var connectionString = "Server=localhost;Port=5432;User Id=postgres;Password=penguin;Database=postgres;"; + await using var dataSource = NpgsqlDataSource.Create(connectionString); + await using var command = dataSource.CreateCommand("SELECT product_id from public.orders WHERE order_id = 4"); + await using var reader = await command.ExecuteReaderAsync(); + + List resultList = new List(); + + while (await reader.ReadAsync()) + { + var result = reader.GetInt32(0); + resultList.Add(result); + } + + string resultString = string.Join(", ", resultList); + + //Assertions that can be done on a int list + resultList.Count().Should().Be(3); + + //Assertions that can't be done on a list + resultString.Should().ContainAll("1", "2", "5"); + Console.WriteLine(resultString); + } + + [Test] + public async Task OrderAssertionsProductName() + { + + var connectionString = "Server=localhost;Port=5432;User Id=postgres;Password=penguin;Database=postgres;"; + await using var dataSource = NpgsqlDataSource.Create(connectionString); + await using var command = dataSource.CreateCommand("SELECT pro_name from public.orders WHERE order_id = 4"); + await using var reader = await command.ExecuteReaderAsync(); + + List resultList = new List(); + + while (await reader.ReadAsync()) + { + var result = reader.GetString(0); + resultList.Add(result); + } + + string resultString = string.Join(", ", resultList); + + //Assertions that can be done on a list + resultList.Should().Contain("Fish", "Chips", "Cheese Burger"); + resultList.Should().NotContain("Gravy"); + + //Assertions that can't be done on a list + Console.WriteLine(resultString); + } + + [Test] + public async Task OrderAssertionsProductQuantity() + { + + var connectionString = "Server=localhost;Port=5432;User Id=postgres;Password=penguin;Database=postgres;"; + await using var dataSource = NpgsqlDataSource.Create(connectionString); + await using var command = dataSource.CreateCommand("SELECT quantity from public.orders WHERE order_id = 4"); + await using var reader = await command.ExecuteReaderAsync(); + + List resultList = new List(); + + while (await reader.ReadAsync()) + { + var result = reader.GetInt32(0); + resultList.Add(result); + result.Should().Be(1); + } + + string resultString = string.Join(", ", resultList); + + //Assertions that can be done on a list + resultList.Count().Should().Be(3); + + //Assertions that can't be done on a list + resultString.Should().Contain("1", Exactly.Thrice()); + Console.WriteLine(resultString); + } +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_Invalid_Product_Id.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_Invalid_Product_Id.snap new file mode 100644 index 00000000..8a0c96e6 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_Invalid_Product_Id.snap @@ -0,0 +1,8 @@ +{ + "Errors": { + "lineItems[0].productId": [ + "'product Id' must not be empty." + ] + }, + "Status": 400 +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_Negative_Quantity.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_Negative_Quantity.snap new file mode 100644 index 00000000..30b6829b --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_Negative_Quantity.snap @@ -0,0 +1,8 @@ +{ + "Errors": { + "lineItems[0].quantity": [ + "'quantity' must be greater than or equal to '0'." + ] + }, + "Status": 400 +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_No_Product_Line.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_No_Product_Line.snap new file mode 100644 index 00000000..8a0c96e6 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_Fail_No_Product_Line.snap @@ -0,0 +1,8 @@ +{ + "Errors": { + "lineItems[0].productId": [ + "'product Id' must not be empty." + ] + }, + "Status": 400 +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_NoBody.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_NoBody.snap new file mode 100644 index 00000000..2b3c1924 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Fail_NoBody.snap @@ -0,0 +1,11 @@ +{ + "Errors": { + "": [ + "A non-empty request body is required." + ], + "createOrder": [ + "The createOrder field is required." + ] + }, + "Status": 400 +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Products_Order_18.97.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Products_Order_18.97.snap new file mode 100644 index 00000000..26bdb2a7 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Products_Order_18.97.snap @@ -0,0 +1,39 @@ +{ + "id": 4, + "createdOn": "2023-12-14T14:42:34.3890478Z", + "lastUpdated": "2023-12-14T14:42:34.3892504Z", + "orderStatus": "Created", + "orderTotal": 18.97, + "lineItems": [ + { + "product": { + "id": 1, + "name": "Fish", + "description": "Delicious and satisfying.", + "price": 5.99 + }, + "quantity": 1, + "subTotal": 5.99 + }, + { + "product": { + "id": 2, + "name": "Chips", + "description": "Nothing more to say.", + "price": 2.99 + }, + "quantity": 1, + "subTotal": 2.99 + }, + { + "product": { + "id": 5, + "name": "Cheese Burger", + "description": "Plain burger with cheese", + "price": 9.99 + }, + "quantity": 1, + "subTotal": 9.99 + } + ] +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Same_Product_Multiple_Lines_Order_8.97.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Same_Product_Multiple_Lines_Order_8.97.snap new file mode 100644 index 00000000..3ce8cbe7 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Same_Product_Multiple_Lines_Order_8.97.snap @@ -0,0 +1,19 @@ +{ + "id": 4, + "createdOn": "2023-12-14T14:42:34.498567Z", + "lastUpdated": "2023-12-14T14:42:34.4985818Z", + "orderStatus": "Created", + "orderTotal": 8.97, + "lineItems": [ + { + "product": { + "id": 2, + "name": "Chips", + "description": "Nothing more to say.", + "price": 2.99 + }, + "quantity": 3, + "subTotal": 8.97 + } + ] +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Same_Product_Same_Line_Order_99.9.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Same_Product_Same_Line_Order_99.9.snap new file mode 100644 index 00000000..98ee1a65 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Multiple_Same_Product_Same_Line_Order_99.9.snap @@ -0,0 +1,19 @@ +{ + "id": 4, + "createdOn": "2023-12-14T14:42:34.6058543Z", + "lastUpdated": "2023-12-14T14:42:34.6058679Z", + "orderStatus": "Created", + "orderTotal": 99.9, + "lineItems": [ + { + "product": { + "id": 5, + "name": "Cheese Burger", + "description": "Plain burger with cheese", + "price": 9.99 + }, + "quantity": 10, + "subTotal": 99.9 + } + ] +} diff --git a/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Single_Line_Order_5.99.snap b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Single_Line_Order_5.99.snap new file mode 100644 index 00000000..1c2c5cac --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Tests/__snapshots__/AnswerKingPostOrder.ProductOrder_Success_Single_Line_Order_5.99.snap @@ -0,0 +1,19 @@ +{ + "id": 4, + "createdOn": "2023-12-14T14:42:34.2471198Z", + "lastUpdated": "2023-12-14T14:42:34.2471326Z", + "orderStatus": "Created", + "orderTotal": 5.99, + "lineItems": [ + { + "product": { + "id": 1, + "name": "Fish", + "description": "Delicious and satisfying.", + "price": 5.99 + }, + "quantity": 1, + "subTotal": 5.99 + } + ] +} diff --git a/tests/Answer.King.IntegrationTests/Usings.cs b/tests/Answer.King.IntegrationTests/Usings.cs new file mode 100644 index 00000000..32445676 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Usings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; diff --git a/tests/Answer.King.IntegrationTests/Utilities/BaseTestClass.cs b/tests/Answer.King.IntegrationTests/Utilities/BaseTestClass.cs new file mode 100644 index 00000000..e1e1c592 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Utilities/BaseTestClass.cs @@ -0,0 +1,40 @@ +namespace Answer.King.IntegrationTests.Utilities; +using System; +using System.IO; +using System.Net.Http; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +public class BaseTestClass : IDisposable +{ + public HttpClient Client; + + public string testDb { get; set; } = $"Answer.King.{Guid.NewGuid()}.db"; + + [SetUp] + public void Setup() + { + this.Client = new WebApplicationFactory().WithWebHostBuilder(builder => + { + builder.UseSetting("ConnectionStrings:AnswerKing", $"filename=db/{this.testDb};Connection=Shared"); + }).CreateClient(); + } + + [TearDown] + public void TearDown() + { + if (Directory.Exists(Path.Combine(TestContext.CurrentContext.TestDirectory, "db"))) + { + File.Delete(Path.Combine(TestContext.CurrentContext.TestDirectory, $"db/{testDb}")); + File.Delete(Path.Combine(TestContext.CurrentContext.TestDirectory, "db/Answer.King-log.db")); + } + this.Client.Dispose(); + } + + public void Dispose() + { + GC.SuppressFinalize(this); + } +} diff --git a/tests/Answer.King.IntegrationTests/Utilities/ResponseFormatter.cs b/tests/Answer.King.IntegrationTests/Utilities/ResponseFormatter.cs new file mode 100644 index 00000000..03e811f1 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/Utilities/ResponseFormatter.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Answer.King.IntegrationTests.Utilities; + +internal static class ResponseFormatter +{ + public static string FormatResponse(string response) + { + return JToken.Parse(response).ToString(Formatting.Indented); + } +} diff --git a/tests/Answer.King.IntegrationTests/packages.lock.json b/tests/Answer.King.IntegrationTests/packages.lock.json new file mode 100644 index 00000000..bd866937 --- /dev/null +++ b/tests/Answer.King.IntegrationTests/packages.lock.json @@ -0,0 +1,1230 @@ +{ + "version": 1, + "dependencies": { + "net7.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.1.2, )", + "resolved": "3.1.2", + "contentHash": "wuLDIDKD5XMt0A7lE31JPenT7QQwZPFkP5rRpdJeblyXZ9MGLI8rYjvm5fvAKln+2/X+4IxxQDxBtwdrqKNLZw==" + }, + "Dapper": { + "type": "Direct", + "requested": "[2.1.24, )", + "resolved": "2.1.24", + "contentHash": "/2t2vsdJyZRsk13AsWigZpsuFvEwK+o3v862cEULXoww905gyKhJFSuwmZI/4Ui9COX9ZCFCI09UHyH4wVYl3A==" + }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.0, )", + "resolved": "6.12.0", + "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, + "LiteDB": { + "type": "Direct", + "requested": "[5.0.15, )", + "resolved": "5.0.15", + "contentHash": "nucyfCOGSATH553BxplxExP3BOqEwmHt0B57426EIaQjD3CC1Odb52VVCGgTxyYaD2oe3B/cJk8jDo6XiBJqPg==" + }, + "Microsoft.AspNetCore.Mvc.Testing": { + "type": "Direct", + "requested": "[7.0.14, )", + "resolved": "7.0.14", + "contentHash": "N92DFBdGQE/Uqdl4DrptnnoS2go4poPgM1BFy/oSuKfJOJWUc2wJBOwBmAlGhKvuq4gc2/Wm5Ggt1ivsDdSydQ==", + "dependencies": { + "Microsoft.AspNetCore.TestHost": "7.0.14", + "Microsoft.Extensions.DependencyModel": "7.0.0", + "Microsoft.Extensions.Hosting": "7.0.1" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.3.2, )", + "resolved": "17.3.2", + "contentHash": "apR0ha1T8FujBwq1P8i/DOZjbI5XhcP/i8As4NnVztVSpZG8GtWRPCstcmgkUkBpvEfcrrDPlJWbuZY+Hl1hSg==", + "dependencies": { + "Microsoft.CodeCoverage": "17.3.2", + "Microsoft.TestPlatform.TestHost": "17.3.2" + } + }, + "Npgsql.EntityFrameworkCore.PostgreSQL": { + "type": "Direct", + "requested": "[7.0.11, )", + "resolved": "7.0.11", + "contentHash": "cHEgEz0ldXc9wVANs8sJqC+3eilqefrkasCBgaVT0tyj8tb1p3/pwy2ngjboNkDG3M0z+xJsJ4jC5p8wySAM3w==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "[7.0.11, 8.0.0)", + "Microsoft.EntityFrameworkCore.Abstractions": "[7.0.11, 8.0.0)", + "Microsoft.EntityFrameworkCore.Relational": "[7.0.11, 8.0.0)", + "Npgsql": "7.0.6" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[3.13.3, )", + "resolved": "3.13.3", + "contentHash": "KNPDpls6EfHwC3+nnA67fh5wpxeLb3VLFAfLxrug6JMYDLHH6InaQIWR7Sc3y75d/9IKzMksH/gi08W7XWbmnQ==", + "dependencies": { + "NETStandard.Library": "2.0.0" + } + }, + "NUnit.Analyzers": { + "type": "Direct", + "requested": "[3.3.0, )", + "resolved": "3.3.0", + "contentHash": "gyRc0qmXUIjHaTcHTWZDHK5ccOF6cLEOGQJ6Fj5JWKh8/W1XzPFC6zGXRu5sDNSxfKaNeQRmkdz3M73ArQkY1A==" + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "kgH8VKsrcZZgNGQXRpVCrM7TnNz9li3b/snH+YmnXUNqsaWa1Xw9EQWHpbzq4Li2FbTjTE/E5N5HdLNXzZ8BpQ==" + }, + "RestAssured.Net": { + "type": "Direct", + "requested": "[4.2.0, )", + "resolved": "4.2.0", + "contentHash": "+Jpw19OUkGbbWQ5rn3CM4cWsKnTEFnM4FXhBsy4EOe77c2mxdL73xTOR8QsSo4zTC7k8XGJslgMehkD/bUTWAw==", + "dependencies": { + "HtmlAgilityPack": "1.11.54", + "Microsoft.AspNetCore.StaticFiles": "2.2.0", + "Microsoft.AspNetCore.WebUtilities": "2.2.0", + "NHamcrest": "3.4.0", + "NJsonSchema": "10.9.0", + "Newtonsoft.Json": "13.0.3", + "Stubble.Core": "1.10.8", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "Snapshooter.NUnit": { + "type": "Direct", + "requested": "[0.13.0, )", + "resolved": "0.13.0", + "contentHash": "V5cvmiwunt6sNgA96elmwhhUBf0/Z7nla5lXQKv9GzIMhyQbq2rhM8k50CXWi0pbyL4ZgatCWUqSbRK/ifq/FQ==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "NUnit": "3.13.3", + "Snapshooter": "0.13.0" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.435, )", + "resolved": "1.2.0-beta.435", + "contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.435" + } + }, + "AWS.Logger.AspNetCore": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "iOvXAfPfmZZ/WdOasrZVznDp76PskEd9JyVswe1c01PwkuNj2qm7EueHJmEOwdgqc3bj5jW1TIIqXnthRryGwA==", + "dependencies": { + "AWS.Logger.Core": "3.1.0", + "Microsoft.Extensions.Configuration": "2.1.0", + "Microsoft.Extensions.DependencyInjection": "2.1.0", + "Microsoft.Extensions.Logging": "2.1.0" + } + }, + "AWS.Logger.Core": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "ruKBNASE/IBnVZhyeUy0ueuxq1CuMtDHNpU2cqGUg12SxvClkqqY/PVXyM6I4ltsMh/1tF8WdpTBj9k3Fw/PgA==", + "dependencies": { + "AWSSDK.CloudWatchLogs": "3.7.0.5" + } + }, + "AWS.Logger.SeriLog": { + "type": "Transitive", + "resolved": "3.2.0", + "contentHash": "zslsNobQR3j2o+NrlcuVmrWLNyoyeZKIs5n0tO4+Hz6Z2Wcr9FqqgMxzXpKzkYBzQzfYCB/SlovOGvuWEqnnew==", + "dependencies": { + "AWS.Logger.Core": "3.1.0", + "Microsoft.Extensions.Configuration.Abstractions": "1.0.0", + "Serilog": "2.6.0" + } + }, + "AWSSDK.CloudWatchLogs": { + "type": "Transitive", + "resolved": "3.7.104.40", + "contentHash": "KDl4kHFiTkjGwtU31dgUbhS/ouYRHk/qftZZs+SR3rnR4lQFduvRYN/zWUUppti6MC1XT6uA7JTbE7UzEqjrkQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.106.4, 4.0.0)" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.106.4", + "contentHash": "U+U7j0k5NxXXjjD9yxsVN5MjRpYlTSMyaDjLqwJaaeoFhycdkJ81t3Baret6VBwIGMmYpjAerk79vLAhvwU5Wg==" + }, + "AWSSDK.Extensions.NETCore.Setup": { + "type": "Transitive", + "resolved": "3.7.5", + "contentHash": "T+JpP2dFbyAFgm5htiwx9oaGZ9+IVGz5xpBCzCbLWW4lwmVWn3o1Wzi4xUpAo+TULWlzf4CBhuJ9chO0YtAGVw==", + "dependencies": { + "AWSSDK.Core": "3.7.6", + "Microsoft.Extensions.Configuration.Abstractions": "2.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.0.0", + "Microsoft.Extensions.Logging.Abstractions": "2.0.0" + } + }, + "FluentValidation": { + "type": "Transitive", + "resolved": "11.2.1", + "contentHash": "ZrQD0TGd0mHqf/zErZOEaba8cBeInaJj02nqinO+0La3uE08sJ5ScTYqsCbdx9fLHsX8rh+5KH5RtL2eOUS+OA==" + }, + "FluentValidation.AspNetCore": { + "type": "Transitive", + "resolved": "11.2.2", + "contentHash": "jU/MHXqg9cnOU18dY75vorP2c2WDKMan4zegOPsoc34xZVjzTEtXP0fKvkDEdeaChUVooNWuRr27u9w3sYbEFA==", + "dependencies": { + "FluentValidation": "11.2.1", + "FluentValidation.DependencyInjectionExtensions": "11.2.1" + } + }, + "FluentValidation.DependencyInjectionExtensions": { + "type": "Transitive", + "resolved": "11.2.1", + "contentHash": "WqR2kt0OidUCg9xS+YOoiDmdCu7EnYLLgQb/bX+5fTTVor+90dWmr1OdJaWlLZvg2nbwV9EfxA9FZp91+JmQtg==", + "dependencies": { + "FluentValidation": "11.2.1", + "Microsoft.Extensions.Dependencyinjection.Abstractions": "2.1.0" + } + }, + "HtmlAgilityPack": { + "type": "Transitive", + "resolved": "1.11.54", + "contentHash": "bgB79N4urc4D7hrD4R+Qk6CjPiYOfs6vfXNsmw3nCcfQEQvBQGjfAcl5k/tB1ZP1hA0d7xXs0jK8xAXV36IVUg==" + }, + "Microsoft.AspNetCore.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==", + "dependencies": { + "Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0", + "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", + "Microsoft.Extensions.Hosting.Abstractions": "2.2.0" + } + }, + "Microsoft.AspNetCore.Hosting.Server.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==", + "dependencies": { + "Microsoft.AspNetCore.Http.Features": "2.2.0", + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" + } + }, + "Microsoft.AspNetCore.Http.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==", + "dependencies": { + "Microsoft.AspNetCore.Http.Features": "2.2.0", + "System.Text.Encodings.Web": "4.5.0" + } + }, + "Microsoft.AspNetCore.Http.Extensions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==", + "dependencies": { + "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", + "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", + "Microsoft.Net.Http.Headers": "2.2.0", + "System.Buffers": "4.5.0" + } + }, + "Microsoft.AspNetCore.Http.Features": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.AspNetCore.StaticFiles": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==", + "dependencies": { + "Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0", + "Microsoft.AspNetCore.Http.Extensions": "2.2.0", + "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging.Abstractions": "2.2.0", + "Microsoft.Extensions.WebEncoders": "2.2.0" + } + }, + "Microsoft.AspNetCore.TestHost": { + "type": "Transitive", + "resolved": "7.0.14", + "contentHash": "E069WhxLYu28AMo2Sa8eWUDJHP7Yt9PG5wy42WVaDaswcoTwPo0kbGXf29sNI7ftR8fro7MwDq90C2IZzqdfEA==", + "dependencies": { + "System.IO.Pipelines": "7.0.0" + } + }, + "Microsoft.AspNetCore.WebUtilities": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==", + "dependencies": { + "Microsoft.Net.Http.Headers": "2.2.0", + "System.Text.Encodings.Web": "4.5.0" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.3.2", + "contentHash": "+CeYNY9hYNRgv1wAID5koeDVob1ZOrOYfRRTLxU9Zm5ZMDMkMZ8wzXgakxVv+jtk8tPdE8Ze9vVE+czMKapv/Q==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "7.0.11", + "contentHash": "r7YGITjQ7v1hYtUXIavjSx+T1itKVPUFAIBN7HaKNjbR8x+gep8w9H3NEchglJOh1woZR4b2MhbSo2YFRZwZDg==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "7.0.11", + "Microsoft.EntityFrameworkCore.Analyzers": "7.0.11", + "Microsoft.Extensions.Caching.Memory": "7.0.0", + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "7.0.11", + "contentHash": "IoOnhycZ0/VtLowf0HgB0cujxwksokzkS3/5108AHOcbntHUTqwxtCjG4E4FCly/45G+mxb+4PxBdFZhA49lwQ==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "7.0.11", + "contentHash": "Qexum5safSSfijx6P1QSq5bVJPPTM/uf7lQmpL/shkiozEC/0FzqNaVUfFpbNN8zsO1jMFYbeDMF4cxJMlTT9w==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "7.0.11", + "contentHash": "yHEEyah1XARStV1SJOsdKj8ieoMCZ0MkNuQaLfWONMWmbqwuDohfGQZk/FuzdT4aO/lJrUYiXbBSFv0ACzphEw==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "7.0.11", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.ApiDescription.Server": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "Ckb5EDBUNJdFWyajfXzUIMRkhf52fHZOQuuZg/oiu8y7zDCVwD0iHhew6MnThjHmevanpxL3f5ci2TtHQEN6bw==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "1eRFwJBrkkncTpvh6mivB8zg4uBVm6+Y6stEJERrVEqZZc8Hvf+N1iIgj2ySYDUQko4J1Gw1rLf1M8bG83F0eA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "a8Iq8SCw5m8W5pZJcPCgBpBO4E89+NaObPng+ApIhrGSv9X4JPrcFAaGM4sDgR0X83uhLgsNJq8VnGP/wqhr8A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "RIkfqCkvrAogirjsqSrG1E1FxgrLsOZU2nhRbl07lrajnxzSU2isj2lwQah0CtCbLWo/pOIukQzM1GfneBUnxA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "xk2lRJ1RDuqe57BmgvRPyCt6zyePKUmvT6iuXqiHR+/OIIgWVR8Ff5k2p6DwmqY8a17hx/OnrekEhziEIeQP6Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0", + "Microsoft.Extensions.FileProviders.Physical": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "LDNYe3uw76W35Jci+be4LDf2lkQZe0A7EEYQVChFbc509CpZ4Iupod8li4PUXPBhEUOFI/rlQNf5xkzJRQGvtA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "7.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "33HPW1PmB2RS0ietBQyvOxjp4O3wlt+4tIs8KPyMn1kqp04goiZGa7+3mc69NRLv6bphkLDy0YR7Uw3aZyf8Zw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Json": "7.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0", + "Microsoft.Extensions.FileProviders.Physical": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "oONNYd71J3LzkWc4fUHl3SvMfiQMYUCo/mDHDEu76hYYxdhdrPYv6fvGv9nnKVyhE9P0h20AU8RZB5OOWQcAXg==", + "dependencies": { + "System.Text.Encodings.Web": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "NyawiW9ZT/liQb34k9YqBSNPLuuPkrjMgQZ24Y/xXX1RoiBkLUdPMaQTmxhZ5TYu8ZKZ9qayzil75JX95vGQUg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "K8D2MTR+EtzkbZ8z80LrG7Ur64R7ZZdRLt1J5cgpc/pUWl0C6IkAUapPuK28oionHueCPELUqq0oYEvZfalNdg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "2jONjKHiF+E92ynz2ZFcr9OvxIw+rTGMPEH+UZGeHTEComVav93jQUWGkso8yWwVBcEJGcNcZAaqY01FFJcj7w==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "7.0.1", + "contentHash": "aoeMou6XSW84wiqd895OdaGyO9PfH6nohQJ0XBcshRDafbdIU6PQIVl8TpOCssPYq3ciRseP5064hbFyCR9J9w==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.3", + "Microsoft.Extensions.Configuration.CommandLine": "7.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "7.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "7.0.0", + "Microsoft.Extensions.Configuration.Json": "7.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "7.0.0", + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0", + "Microsoft.Extensions.FileProviders.Physical": "7.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Logging.Console": "7.0.0", + "Microsoft.Extensions.Logging.Debug": "7.0.0", + "Microsoft.Extensions.Logging.EventLog": "7.0.0", + "Microsoft.Extensions.Logging.EventSource": "7.0.0", + "Microsoft.Extensions.Options": "7.0.1", + "System.Diagnostics.DiagnosticSource": "7.0.1" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "43n9Je09z0p/7ViPxfRqs5BUItRLNVh5b6JH40F2Agkh2NBsY/jpNYTtbCcxrHCsA3oRmbR6RJBzUutB4VZvNQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tFGGyPDpJ8ZdQdeckCArP7nZuoY3am9zJWuvp4OD1bHq65S0epW9BNHzAWeaIO4eYwWnGm1jRNt3vRciH8H6MA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "Rp7cYL9xQRVTgjMl77H5YDxszAaO+mlA+KT0BnLSVhuCoKQQOOs1sSK2/x8BK2dZ/lKeAC/CVF+20Ef2dpKXwg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Diagnostics.EventLog": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "MxQXndQFviIyOPqyMeLNshXnmqcfzEHE2wWcr7BF1unSisJgouZ3tItnq+aJLGPojrW8OZSC/ZdRoR6wAq+c7w==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.1", + "contentHash": "pZRDYdN1FpepOIfHU62QoBQ6zdAoTvnjxFfqAzEd9Jhb2dfhA5i6jeTdgGgcgTWFRC7oT0+3XrbQu4LjvgX1Nw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==" + }, + "Microsoft.Extensions.WebEncoders": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "System.Text.Encodings.Web": "4.5.0" + } + }, + "Microsoft.Net.Http.Headers": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0", + "System.Buffers": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==" + }, + "Microsoft.OpenApi": { + "type": "Transitive", + "resolved": "1.2.3", + "contentHash": "Nug3rO+7Kl5/SBAadzSMAVgqDlfGjJZ0GenQrLywJ84XGKO0uRqkunz5Wyl0SDwcR71bAATXvSdbdzPrYRYKGw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.3.2", + "contentHash": "DJEIfSA2GDC+2m42vKGNR2hm+Uhta4SpCsLZVVvYIiYMjxtk7GzNnv82qvE4SCW3kIYllMg2D0rr8juuj/f7AA==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.3.2", + "contentHash": "113J19v31pIx+PzmdEw67cWTZWh/YApnprbclFeat6szNbnpKOKG7Ap4PX5LT6E5Da+xONyilxvx2HZPpEaXPQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.3.2", + "Newtonsoft.Json": "9.0.1" + } + }, + "Namotion.Reflection": { + "type": "Transitive", + "resolved": "2.1.2", + "contentHash": "7tSHAzX8GWKy0qrW6OgQWD7kAZiqzhq+m1503qczuwuK6ZYhOGCQUxw+F3F4KkRM70aB6RMslsRVSCFeouIehw==", + "dependencies": { + "Microsoft.CSharp": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "NHamcrest": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "N6apzNQXrGW5PJQjpRSSK4QD5poMaVmBRpteDaSEaUUTUK6fwcQeMKZ+oOrv+LZgs481TWKMTGsQTvz5ipgGzQ==" + }, + "NJsonSchema": { + "type": "Transitive", + "resolved": "10.9.0", + "contentHash": "IBPo6Srxn2MEcIFM3HdM4QImrJbsIeujENQyzHL2Pv6wLsKSYAyAEilecRqaLOhoy3snEiPLx7hhv7opbhOxKQ==", + "dependencies": { + "Namotion.Reflection": "2.1.2", + "Newtonsoft.Json": "9.0.1" + } + }, + "Npgsql": { + "type": "Transitive", + "resolved": "7.0.6", + "contentHash": "TAqvwRnm3NJ0QvN7cvu6geJkbI0XPzGVRElVY5hF4gsgA+BnE12x6GM1TLhdeq+7ZKvvo3BD8jXKnXmr3tvdEw==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "Serilog": { + "type": "Transitive", + "resolved": "2.12.0", + "contentHash": "xaiJLIdu6rYMKfQMYUZgTy8YK7SMZjB4Yk50C/u//Z4OsvxkUfSPJy4nknfvwAC34yr13q7kcyh4grbwhSxyZg==" + }, + "Serilog.AspNetCore": { + "type": "Transitive", + "resolved": "6.1.0", + "contentHash": "iMwFUJDN+/yWIPz4TKCliagJ1Yn//SceCYCzgdPwe/ECYUwb5/WUL8cTzRKV+tFwxGjLEV/xpm0GupS5RwbhSQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Serilog": "2.10.0", + "Serilog.Extensions.Hosting": "5.0.1", + "Serilog.Formatting.Compact": "1.1.0", + "Serilog.Settings.Configuration": "3.3.0", + "Serilog.Sinks.Console": "4.0.1", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "5.0.0" + } + }, + "Serilog.Enrichers.Process": { + "type": "Transitive", + "resolved": "2.0.2", + "contentHash": "T9EjKKLsL6qC/3eOLUAKEPBLEqPDmt5BLXaQdPMaxJzuex+MeXA8DuAiPboUaftp3kbnCN4ZgZpDvs+Fa7OHuw==", + "dependencies": { + "Serilog": "2.3.0" + } + }, + "Serilog.Enrichers.Thread": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "85lWsGRJpRxvKT6j/H67no55SUBsBIvp556TKuBTGhjtoPeq+L7j/sDWbgAtvT0p7u7/phJyX6j35PQ4Vtqw0g==", + "dependencies": { + "Serilog": "2.3.0" + } + }, + "Serilog.Extensions.Hosting": { + "type": "Transitive", + "resolved": "5.0.1", + "contentHash": "o0VUyt3npAqOJaZ6CiWLFeLYs3CYJwfcAqaUqprzsmj7qYIvorcn8cZLVR8AQX6vzX7gee2bD0sQeA17iO2/Aw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Hosting.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Serilog": "2.10.0", + "Serilog.Extensions.Logging": "3.1.0" + } + }, + "Serilog.Extensions.Logging": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "IWfem7wfrFbB3iw1OikqPFNPEzfayvDuN4WP7Ue1AVFskalMByeWk3QbtUXQR34SBkv1EbZ3AySHda/ErDgpcg==", + "dependencies": { + "Microsoft.Extensions.Logging": "2.0.0", + "Serilog": "2.9.0" + } + }, + "Serilog.Extensions.Logging.File": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "bUYjMHn7NhpK+/8HDftG7+G5hpWzD49XTSvLoUFZGgappDa6FoseqFOsLrjLRjwe1zM+igH5mySFJv3ntb+qcg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Serilog": "2.10.0", + "Serilog.Extensions.Logging": "3.1.0", + "Serilog.Formatting.Compact": "1.1.0", + "Serilog.Sinks.Async": "1.5.0", + "Serilog.Sinks.RollingFile": "3.3.0" + } + }, + "Serilog.Formatting.Compact": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "pNroKVjo+rDqlxNG5PXkRLpfSCuDOBY0ri6jp9PLe505ljqwhwZz8ospy2vWhQlFu5GkIesh3FcDs4n7sWZODA==", + "dependencies": { + "Serilog": "2.8.0" + } + }, + "Serilog.Settings.Configuration": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "ULloXSiapTb3zOWodC0G4WRDQzA5RjMEfZNZzOZpH8kC3t/lrISLblklIpKC44CX0sMDF40MnJwTIQ3pFQFs4g==", + "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "2.0.0", + "Microsoft.Extensions.DependencyModel": "3.0.0", + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.Async": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", + "dependencies": { + "Serilog": "2.9.0" + } + }, + "Serilog.Sinks.AwsCloudWatch": { + "type": "Transitive", + "resolved": "4.0.171", + "contentHash": "eJ0ZKLWbrOQ38u3/+vLZwTrBt6KtWthdvR6s0SmvbuupO3kr5x93UL3klzhp0Ewe/CwfYcYZ88hygJQ+Xe89Mg==", + "dependencies": { + "AWSSDK.CloudWatchLogs": "3.7.0.13", + "Serilog": "2.10.0", + "Serilog.Sinks.PeriodicBatching": "2.3.0" + } + }, + "Serilog.Sinks.Console": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "K6N5q+5fetjnJPvCmkWOpJ/V8IEIoMIB1s86OzBrbxwTyHxdx3pmz4H+8+O/Dc/ftUX12DM1aynx/dDowkwzqg==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.Debug": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.File": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.PeriodicBatching": { + "type": "Transitive", + "resolved": "2.3.0", + "contentHash": "UYKSjTMTlUY9T3OgzMmLDLD+z0qPfgvq/RvG0rKfyz+O+Zrjw3X/Xpv14J4WMcGVsOjUaR+k8n2MdmqVpJtI6A==", + "dependencies": { + "Serilog": "2.0.0", + "System.Collections.Concurrent": "4.0.12", + "System.Threading.Timer": "4.0.1" + } + }, + "Serilog.Sinks.RollingFile": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "2lT5X1r3GH4P0bRWJfhA7etGl8Q2Ipw9AACvtAHWRUSpYZ42NGVyHoVs2ALBZ/cAkkS+tA4jl80Zie144eLQPg==", + "dependencies": { + "Serilog.Sinks.File": "3.2.0", + "System.IO": "4.1.0", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding.Extensions": "4.0.11" + } + }, + "Snapshooter": { + "type": "Transitive", + "resolved": "0.13.0", + "contentHash": "8r9eYsiZngbnGRVN72YnZqtdlybsqK8QIQMYrhSFuG9pR8pJkgk3k7Ep9VvE0+G/3bGk2hnm8OjvfDmFXd6V3w==", + "dependencies": { + "Newtonsoft.Json": "13.0.1" + } + }, + "Stubble.Core": { + "type": "Transitive", + "resolved": "1.10.8", + "contentHash": "M7pXv3xz3TwhR8PJwieVncotjdC0w8AhviKPpGn2/DHlSNuTKTQdA5Ngmu3datOoeI2jXYEi3fhgncM7UueTWw==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "System.Collections.Immutable": "5.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.435", + "contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg==" + }, + "Swashbuckle.AspNetCore": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "FK05XokgjgwlCI6wCT+D4/abtQkL1X1/B9Oas6uIwHFmYrIO9WUD5aLC9IzMs9GnHfUXOtXZ2S43gN1mhs5+aA==", + "dependencies": { + "Microsoft.Extensions.ApiDescription.Server": "6.0.5", + "Swashbuckle.AspNetCore.Swagger": "6.5.0", + "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0", + "Swashbuckle.AspNetCore.SwaggerUI": "6.5.0" + } + }, + "Swashbuckle.AspNetCore.Annotations": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "EcHd1z2pEdnpaBMTI9qjVxk6mFVGVMZ1n0ySC3fjrkXCQQ8O9fMdt9TxPJRKyjiTiTjvO9700jKjmyl+hPBinQ==", + "dependencies": { + "Swashbuckle.AspNetCore.SwaggerGen": "6.5.0" + } + }, + "Swashbuckle.AspNetCore.Swagger": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "XWmCmqyFmoItXKFsQSwQbEAsjDKcxlNf1l+/Ki42hcb6LjKL8m5Db69OTvz5vLonMSRntYO1XLqz0OP+n3vKnA==", + "dependencies": { + "Microsoft.OpenApi": "1.2.3" + } + }, + "Swashbuckle.AspNetCore.SwaggerGen": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "Y/qW8Qdg9OEs7V013tt+94OdPxbRdbhcEbw4NiwGvf4YBcfhL/y7qp/Mjv/cENsQ2L3NqJ2AOu94weBy/h4KvA==", + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "6.5.0" + } + }, + "Swashbuckle.AspNetCore.SwaggerUI": { + "type": "Transitive", + "resolved": "6.5.0", + "contentHash": "OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "7.0.1", + "contentHash": "T9SLFxzDp0SreCffRDXSAS5G+lq6E8qP4knHS2IBjwCdx2KEvGnGZsq7gFpselYOda7l6gXsJMD93TQsFj/URA==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw==" + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "DaGSsVqKsn/ia6RG8frjwmJonfos0srquhw09TlT8KRw5I43E+4gs+/bZj4K0vShJ5H9imCuXupb4RmS+dBy3w==", + "dependencies": { + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "saGfUV8uqVW6LeURiqxcGhZ24PzuRNaUBtbhVeuUAvky1naH395A/1nY0P2bWvrw/BreRtIB/EzTDkGBpqCwEw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "answer.king.api": { + "type": "Project", + "dependencies": { + "AWS.Logger.AspNetCore": "[3.3.0, )", + "AWS.Logger.SeriLog": "[3.2.0, )", + "AWSSDK.CloudWatchLogs": "[3.7.104.40, )", + "AWSSDK.Extensions.NETCore.Setup": "[3.7.5, )", + "Answer.King.Domain": "[1.0.0, )", + "Answer.King.Infrastructure": "[1.0.0, )", + "FluentValidation.AspNetCore": "[11.2.2, )", + "Serilog": "[2.12.0, )", + "Serilog.AspNetCore": "[6.1.0, )", + "Serilog.Enrichers.Process": "[2.0.2, )", + "Serilog.Enrichers.Thread": "[3.1.0, )", + "Serilog.Extensions.Logging": "[3.1.0, )", + "Serilog.Extensions.Logging.File": "[3.0.0, )", + "Serilog.Formatting.Compact": "[1.1.0, )", + "Serilog.Settings.Configuration": "[3.4.0, )", + "Serilog.Sinks.AwsCloudWatch": "[4.0.171, )", + "Serilog.Sinks.Console": "[4.1.0, )", + "Serilog.Sinks.File": "[5.0.0, )", + "Swashbuckle.AspNetCore": "[6.5.0, )", + "Swashbuckle.AspNetCore.Annotations": "[6.5.0, )" + } + }, + "answer.king.domain": { + "type": "Project" + }, + "answer.king.infrastructure": { + "type": "Project", + "dependencies": { + "Answer.King.Domain": "[1.0.0, )", + "LiteDB": "[5.0.15, )" + } + } + } + } +} \ No newline at end of file