diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index a13daa35..257d4214 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,10 +3,11 @@ "isRoot": true, "tools": { "csharpier": { - "version": "0.28.0", + "version": "1.0.3", "commands": [ - "dotnet-csharpier" - ] + "csharpier" + ], + "rollForward": false } } } \ No newline at end of file diff --git a/.dockerignore b/.dockerignore index 45e467e2..4390f6e8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -282,4 +282,6 @@ Dockerfile # .env file contains default environment variables for docker .env -.git/ \ No newline at end of file +.git/ +bin/ +obj/ diff --git a/.github/copilot-csharp-best-practices.md b/.github/copilot-csharp-best-practices.md new file mode 100644 index 00000000..b9b03fba --- /dev/null +++ b/.github/copilot-csharp-best-practices.md @@ -0,0 +1,80 @@ +# C# Coding Standards and Best Practices + +## Code Style + +- **MANDATORY**: Follow the .NET coding conventions as defined by Microsoft. +- **ALWAYS** use `camelCase` for local variables and method parameters. +- **ALWAYS** use `PascalCase` for method names, property names, and class names. +- **MANDATORY**: Ensure that braces are used consistently for all control structures. Example: + ```csharp + if (x == y) + { + Foo(); + } + ``` +- **ALWAYS** keep lines of code reasonably short; lines should not exceed 120 characters. + +## Naming Conventions + +- **MANDATORY**: Use meaningful and descriptive names for classes, methods, and variables. +- **NEVER** use abbreviated names unless they are well-known (e.g., `Id` for Identifier). +- **REQUIRED**: Prefix interfaces with the letter `I`. +- **ALWAYS** name namespaces starting with the company name followed by the project and any sub-folders aligning with the project structure. + +## Error Handling + +- **MANDATORY**: Use exceptions for abnormal or unexpected program behavior. +- **ALWAYS** provide helpful error messages when throwing exceptions. +- **NEVER** use exceptions for normal flow of control. +- `recommended`: Prefer `try/catch` over returning error codes. + +## Documentation + +- **REQUIRED**: Every public class and method **MUST** have XML documentation comments for IntelliSense and documentation tools. +- **MANDATORY**: Document all parameters, exceptions thrown, and return values. +- `recommended`: Regularly update documentation to reflect changes in the codebase. + +## Security + +- **MUST** validate all inputs to avoid SQL injections and other common security threats. +- **ALWAYS** use secure methods and classes provided by the .NET framework where available. +- `recommended`: Utilize Code Analysis (FxCop) to detect security flaws. + +## Performance + +- **MANDATORY**: Avoid unnecessary object creation within loops. +- `recommended`: Utilize lazy loading where appropriate. +- `recommended`: Employ caching mechanisms to improve responsiveness and performance. + +## Source Control + +- **MANDATORY**: Check in code frequently to avoid large sets of unshared changes. +- **REQUIRED**: Include meaningful commit messages with each check-in. +- **NEVER** check in commented-out code or unnecessary files. + +## Testing + +- **MANDATORY**: Write unit tests for all new methods and classes. +- **ALWAYS** run the full test suite before committing your code to the repository. +- **REQUIRED**: Aim for at least 80% code coverage in tests for all business logic classes. + +## API Design + +- **MUST** ensure that public APIs are intuitive and well-documented. +- **ALWAYS** use consistent parameter ordering across similar methods. +- `recommended`: Avoid breaking changes to public APIs. + +## Versioning + +- **MANDATORY**: Adhere to semantic versioning rules for all public software releases. +- **ALWAYS** increment version numbers based on the extent of changes: + - **MAJOR** version when you make incompatible API changes, + - **MINOR** version when you add functionality in a backward-compatible manner, + - **PATCH** version when you make backward-compatible bug fixes. + +## Dependability + +- `recommended`: Rely on proven .NET libraries and frameworks rather than creating custom implementations. +- **NEVER** ignore deprecation notices without assessing impact. + +This set of rules defines the essential guidelines that **MUST**, **SHOULD**, and **NEVER** be violated in any professional C# project as of 2025. These standards are in place to ensure reliability, security, and maintainability of code. \ No newline at end of file diff --git a/.github/copilot-csharp-csharp.md b/.github/copilot-csharp-csharp.md new file mode 100644 index 00000000..24930d11 --- /dev/null +++ b/.github/copilot-csharp-csharp.md @@ -0,0 +1,59 @@ +# C# Coding Standards for AI Coding Assistant 'copilot' + +## General Principles +- **MANDATORY**: Adhere to the latest C# language version to ensure code uses the most current features and improvements. +- **ALWAYS** write code that is clear, understandable, and maintainable. +- **NEVER** use obsolete or deprecated C# features unless absolutely necessary for maintaining legacy systems. + +## Formatting and Style +- **MUST** follow Microsoft's C# coding conventions regarding naming, layout, and commenting. + - Use PascalCase for class names and method names. + - Use camelCase for local variables and method arguments. + - **REQUIRED**: Place opening braces on a new line for classes, methods, and control statements. +- **ALWAYS** indent code blocks with four spaces, not tabs. +- **ALWAYS** use explicit typing over implicit var declarations, except in cases of obvious typing (e.g., instantiation). + +## Error Handling +- **MANDATORY**: Handle all possible exceptions using try, catch, finally blocks where applicable. +- **NEVER** allow exceptions to go unhandled unless explicitly justified by the application logic. +- Exceptions **SHOULD** be logged with a detailed error message and, if applicable, stack trace. + +## Security Practices +- **MUST** validate all inputs to prevent injection attacks and ensure data integrity. +- **REQUIRED**: Utilize secure methods and libraries for handling sensitive data such as passwords, API keys, and personal user information. +- **NEVER** log sensitive information. + +## Performance +- **USE** async and await for asynchronous programming to improve application responsiveness and scalability. +- **RECOMMENDED**: Optimize LINQ queries by minimizing data fetching and processing operations. +- **SHOULD** prefer StringBuilder over string concatenation in loops or during extensive string manipulations. + +## Testing +- **MANDATORY**: Write unit tests for all business logic to ensure code quality and catch regressions early. +- Unit tests **SHOULD** cover both positive and negative scenarios. +- **ALWAYS** use a consistent test naming convention that clearly describes the test purpose. + +## Code Reviews and Collaboration +- **MUST** use pull requests for merging code into shared branches and repositories. +- **ALWAYS** perform thorough code reviews to catch issues early and share knowledge among team members. +- **REQUIRED**: Follow a defined Git workflow suitable for your team structure (e.g., Git flow, GitHub flow). + +## Documentation +- **REQUIRED**: Document all public classes, methods, properties, and enums. +- **ALWAYS** update documentation to reflect changes in the logic or implementation. +- **SHOULD** include inline comments to clarify complex code blocks. + +## Dependency Management +- **MANDATORY**: Keep external dependencies to a minimum to reduce potential security risks and lower the maintenance burden. +- **ALWAYS** audit dependencies for security vulnerabilities on a regular schedule. +- When new libraries are added, **SHOULD** assess their stability and support level. + +## Continuous Integration/Continuous Deployment +- **MUST** have CI/CD pipelines in place to automate testing and deployment processes. +- Deployment scripts **SHOULD** be tested regularly to prevent deployment failures. + +## Legacy Code and Migration +- **ALWAYS** aim to incrementally refactor legacy code as part of ongoing development. +- When dealing with legacy systems, **SHOULD** plan a clear migration path towards newer technologies or frameworks. + +These rules are designed to ensure that the AI coding assistant 'copilot' and its users adhere to the best practices and modern standards prevalent in C# development as of 2025. \ No newline at end of file diff --git a/.github/copilot-csharp-docker.md b/.github/copilot-csharp-docker.md new file mode 100644 index 00000000..18937375 --- /dev/null +++ b/.github/copilot-csharp-docker.md @@ -0,0 +1,48 @@ +# C# Project Rules: Docker Integration + +## General Docker Practices + +- **MANDATORY**: All Dockerfiles **MUST** be located in the root of the project repository. +- **MANDATORY**: Docker images **MUST** be built using official .NET base images from Docker Hub unless a specific need dictates otherwise. + +## Dockerfile Configuration + +- **REQUIRED**: The base image in the Dockerfile **MUST** match the .NET version used in the project. +- **ALWAYS** use multi-stage builds to reduce the size of the final Docker image. + - The `build-env` for compiling the application. + - The `runtime-env` for the execution environment. +- **NEVER** leave API keys, secrets, or other sensitive data in the Docker image. +- **MANDATORY**: Docker build context **SHOULD** be kept as small as possible by properly setting `.dockerignore` files. +- Environment variables **SHOULD** be used for application configurations that vary between environments (e.g., Development, Testing, Production). + +## Docker Compose Configurations + +- **REQUIRED**: Use Docker Compose for managing multi-container Docker applications. +- **ALWAYS** define service dependencies explicitly in `docker-compose.yml`. +- **MANDATORY**: Version of Docker Compose file **MUST** align with the latest supported Docker Engine and Compose specifications as of 2025. + +## CI/CD Integrations + +- **REQUIRED**: Integrate Docker builds into your CI/CD pipeline. +- **MANDATORY**: Pull requests **MUST NOT** be merged unless the Docker image builds successfully. +- **ALWAYS** tag Docker images with both a unique build tag and the `latest` tag in CI pipelines for easier rollback and deployment. + +## Security Best Practices + +- **MANDATORY**: Use Docker’s built-in security features such as `--cap-drop=all` and `readonly` filesystem where appropriate. +- **MANDATORY**: Update the Docker images regularly to include the latest security patches for the base images and dependencies. +- **ALWAYS** scan Docker images for vulnerabilities during CI/CD before pushing to a registry. +- **REQUIRED**: Use private Docker registries for internal or sensitive projects. + +## Performance Optimizations + +- **MANDATORY**: Minimize the number of layers in Docker images where feasible by consolidating commands. +- Images **SHOULD** leverage Docker cache layers by ordering Dockerfile instructions from least to most frequently changed. +- **REQUIRED**: Performance critical settings, like CPU and memory limits, **MUST** be configured explicitly in Docker Compose configurations or Kubernetes deployment specs. + +## Versioning and Tagging + +- **MANDATORY**: Docker images **MUST** be versioned appropriately using semantic versioning principles. +- **ALWAYS** use explicit version tags rather than relying on mutable tags like `latest` for production deployments. + +By following these rules, the Docker integration for C# projects will adhere to modern standards and best practices as of 2025, ensuring efficiency, security, and maintainability. \ No newline at end of file diff --git a/.github/copilot-csharp-polyglot.md b/.github/copilot-csharp-polyglot.md new file mode 100644 index 00000000..50ac0852 --- /dev/null +++ b/.github/copilot-csharp-polyglot.md @@ -0,0 +1,30 @@ +# C# Polyglot Coding Rules + +## General Practices +- **ALWAYS** use clear and descriptive variable names in English, as C# is most commonly written and maintained in English. +- **MANDATORY**: Maintain consistent code style and conventions across different languages used in the project to ensure readability and maintainability. +- Code documentation **MUST** be in English to support international teams and contributors. + +## Handling Language Interoperability +- **REQUIRED**: Ensure that all external libraries used for cross-language functionality are compatible with .NET standards. +- **ALWAYS** encapsulate language-specific logic within boundary classes or namespaces. + +## Error Handling +- **MANDATORY**: Handle all cross-language operation errors gracefully, ensuring the errors are logged and user-friendly messages are displayed. +- **ALWAYS** use try-catch blocks around code that calls into different programming languages. + +## Security +- **NEVER** expose direct interfaces of one language to another without appropriate security checks. +- **MUST** validate all inputs when data crosses language boundaries to prevent injection attacks. + +## Performance +- **MANDATORY**: Optimize inter-language calls to minimize performance overhead. +- **RECOMMENDED**: Profile and monitor performance when implementing cross-language functionality to identify bottlenecks. + +## Testing +- Integration tests **MUST** cover all polyglot components to ensure they work seamlessly together. +- **REQUIRED**: Use mock objects and services to simulate interactions between different languages during unit testing. + +## Continuous Integration +- **MANDATORY**: Set up CI pipelines to build and test across all targeted languages. +- Code reviews **SHOULD** focus on the integration points between different languages to catch potential issues early. \ No newline at end of file diff --git a/.github/copilot-csharp-security.md b/.github/copilot-csharp-security.md new file mode 100644 index 00000000..46145987 --- /dev/null +++ b/.github/copilot-csharp-security.md @@ -0,0 +1,46 @@ +# Security Rules for C# Projects + +## General Security Practices +- **MANDATORY** : Always validate and sanitize all user inputs to prevent SQL injections, cross-site scripting (XSS), and other injection attacks. +- **MUST** : Employ strong, up-to-date cryptographic practices for data encryption, signing, and hashing. +- **ALWAYS** : Ensure that error messages do not reveal details about the backend system, such as file paths or component versions. + +## Authentication and Session Management +- **MUST** : Implement secure authentication mechanisms like OAuth, OpenID Connect, or SAML. +- **ALWAYS** : Use HTTPS and secure cookies (HttpOnly, Secure attributes) for session management. +- **MANDATORY** : Implement multi-factor authentication for accessing sensitive data or operations. + +## Authorization +- **MUST** : Enforce the Principle of Least Privilege (PoLP) throughout the application. +- **ALWAYS** : Use role-based access control (RBAC) or attribute-based access control (ABAC) to manage user permissions. + +## Data Protection +- **MANDATORY** : Encrypt sensitive data both at rest and in transit using industry-standard protocols and algorithms. +- **MUST** : Properly manage and rotate keys and secrets using a secure vault solutions like Azure Key Vault or AWS Secrets Manager. + +## Code Security +- **NEVER** : Leave debug code or secrets (API keys, passwords) in the version control system. +- **MANDATORY** : Use static code analysis tools to automatically detect and rectify security vulnerabilities in the codebase. +- **ALWAYS** : Perform regular code reviews with a focus on security implications and vulnerabilities. + +## External Dependencies +- **REQUIRED** : Regularly update and patch all third-party libraries and frameworks to protect against known vulnerabilities. +- **ALWAYS** : Vet external libraries for security vulnerabilities before including them in the project. + +## Logging and Monitoring +- **ALWAYS** : Implement logging and monitoring to detect and respond to security breaches or irregular activity. +- **NEVER** : Log sensitive data like passwords or personal identification information. + +## Network Security +- **MUST** : Protect all network communications with TLS. +- **ALWAYS** : Implement strong network isolation and segmentation strategies to limit the blast radius in case of a network intrusion. + +## Incident Response +- **REQUIRED** : Have an incident response plan that includes immediate actions, reporting to stakeholders, and remedial steps. +- **MANDATORY** : Conduct regular security drills to ensure that all team members know their roles in case of a security incident. + +## Compliance +- **ALWAYS** : Adhere to relevant industry security standards and regulations, such as GDPR, PCI DSS, or HIPAA, depending on the project scope. +- **MANDATORY** : Undergo regular security audits and compliance checks to maintain system integrity and trust. + +By following these rules, C# projects can mitigate security risks and protect user data effectively. \ No newline at end of file diff --git a/.github/copilot-csharp-testing.md b/.github/copilot-csharp-testing.md new file mode 100644 index 00000000..7bdabca3 --- /dev/null +++ b/.github/copilot-csharp-testing.md @@ -0,0 +1,59 @@ +# C# Project Testing Guidelines + +## General Principles + +- **MANDATORY**: Use a recognized testing framework such as NUnit, xUnit, or MSTest for unit testing. +- **ALWAYS** ensure each test case is independent and can be run in any order. +- **REQUIRED**: Maintain a clean separation of test logic from production code. +- **MUST** configure Continuous Integration (CI) to run tests automatically upon code pushes or pull requests. + +## Writing Tests + +### Structure + +- **MANDATORY**: Structure tests logically using [Arrange-Act-Assert (AAA)](https://www.typemock.com/unit-test-patterns-for-net) pattern. +- **MUST** name test methods clearly to reflect the behavior being tested. + +### Assertions + +- **MUST** use assertive statements that make the test purpose clear. +- **REQUIRED**: Employ fluent assertions for more readable tests. + +### Code Coverage + +- **MANDATORY**: Aim for at least 80% code coverage to ensure most of the code is scrutinized by tests. +- **RECOMMENDED**: Use tools such as Coverlet or Visual Studio Coverage tools to measure test coverage. + +## Test Isolation + +- **ALWAYS** use mocks and stubs to isolate the unit of work and avoid external dependencies in unit tests. +- **MANDATORY**: Employ frameworks like Moq, NSubstitute, or FakeItEasy for mocking. + +## Test Data + +- **MUST** handle test data carefully, ensuring no leakage between tests. +- **ALWAYS** prefer the use of in-memory databases like EF Core InMemory provider for integration testing. + +## Performance + +- **RECOMMENDED**: Regularly review and optimize the performance of test suites. +- **SHOULD** avoid long-running tests in the primary test suite to keep the CI process efficient. + +## Security + +- **NEVER** use real data in testing environments to avoid risks of sensitive data exposure. +- **ALWAYS** ensure tests validate input sanitation and adheres to security best practices. + +## Documentation + +- **REQUIRED**: Document the testing strategy and major choices in a TESTPLAN.md file. +- Tests **SHOULD** include inline comments where necessary to explain complex logic or decisions. + +## Error Handling + +- **MANDATORY**: Tests **MUST** assert appropriate error handling in the application code and never ignore exceptions unless explicitly testing exception handling scenarios. + +## Maintenance + +- **NEVER** allow failing tests to accumulate or remain unfixed. +- **SHOULD** regularly review and refactor tests to improve clarity and maintainability. \ No newline at end of file diff --git a/.gitignore b/.gitignore index 785dd550..b4c1a537 100644 --- a/.gitignore +++ b/.gitignore @@ -286,4 +286,5 @@ tools # sqlite database *.db-shm -*.db-wal \ No newline at end of file +*.db-wal +*.db diff --git a/.rules4rc b/.rules4rc new file mode 100644 index 00000000..7ed870ad --- /dev/null +++ b/.rules4rc @@ -0,0 +1,5 @@ +[settings] +language = c# +tags = best-practices,c#,docker,security,testing +tools = copilot + diff --git a/Conduit.sln b/Conduit.sln index db504655..bb408edb 100644 --- a/Conduit.sln +++ b/Conduit.sln @@ -19,6 +19,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "config", "config", "{E0DF0C Directory.Build.props = Directory.Build.props global.json = global.json .editorconfig = .editorconfig + docker-compose.yml = docker-compose.yml + Dockerfile = Dockerfile + NuGet.config = NuGet.config + .github\workflows\dotnetcore.yml = .github\workflows\dotnetcore.yml + .dockerignore = .dockerignore + .gitignore = .gitignore + .rules4rc = .rules4rc EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{79EC8D73-8DAD-430E-93CE-C1F29DBC33FA}" diff --git a/Conduit.slnx b/Conduit.slnx new file mode 100644 index 00000000..e73d71b1 --- /dev/null +++ b/Conduit.slnx @@ -0,0 +1,24 @@ +<Solution> + <Folder Name="/build/"> + <Project Path="build\build.csproj" Type="Classic C#" /> + </Folder> + <Folder Name="/config/"> + <File Path="Directory.Packages.props" /> + <File Path="Directory.Build.props" /> + <File Path="global.json" /> + <File Path=".editorconfig" /> + <File Path="docker-compose.yml" /> + <File Path="Dockerfile" /> + <File Path="NuGet.config" /> + <File Path=".github\workflows\dotnetcore.yml" /> + <File Path=".dockerignore" /> + <File Path=".gitignore" /> + <File Path=".rules4rc" /> + </Folder> + <Folder Name="/src/"> + <Project Path="src\Conduit\Conduit.csproj" Type="Classic C#" /> + </Folder> + <Folder Name="/tests/"> + <Project Path="tests\Conduit.IntegrationTests\Conduit.IntegrationTests.csproj" Type="Classic C#" /> + </Folder> +</Solution> \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index 180ab7ff..8eaefc1c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -8,7 +8,6 @@ <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <LibSassOutputStyle>expanded</LibSassOutputStyle> - <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder> diff --git a/Directory.Packages.props b/Directory.Packages.props index 21d8a25b..3212605b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,21 +1,22 @@ <Project> <ItemGroup> - <PackageVersion Include="AutoMapper" Version="13.0.1" /> - <PackageVersion Include="Bullseye" Version="5.0.0" /> + <PackageVersion Include="AutoMapper" Version="14.0.0" /> + <PackageVersion Include="Bullseye" Version="6.0.0" /> + <PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" /> <PackageVersion Include="Glob" Version="1.1.9" /> - <PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" /> - <PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.4" /> - <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.4" /> - <PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.4" /> - <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" /> - <PackageVersion Include="Serilog" Version="3.1.1" /> + <PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.13" /> + <PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.13" /> + <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.13" /> + <PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.13" /> + <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> + <PackageVersion Include="Serilog" Version="4.3.0" /> <PackageVersion Include="Serilog.Extensions.Logging" Version="8.0.0" /> - <PackageVersion Include="Serilog.Sinks.Console" Version="5.0.1" /> - <PackageVersion Include="FluentValidation.AspNetCore" Version="11.3.0" /> - <PackageVersion Include="MediatR" Version="12.2.0" /> + <PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" /> + <PackageVersion Include="FluentValidation" Version="12.0.0" /> + <PackageVersion Include="MediatR" Version="12.5.0" /> <PackageVersion Include="SimpleExec" Version="12.0.0" /> - <PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" /> - <PackageVersion Include="xunit" Version="2.7.0" /> - <PackageVersion Include="xunit.runner.visualstudio" Version="2.5.7"/> + <PackageVersion Include="Swashbuckle.AspNetCore" Version="8.1.4" /> + <PackageVersion Include="xunit" Version="2.9.3" /> + <PackageVersion Include="xunit.runner.visualstudio" Version="3.1.1" /> </ItemGroup> </Project> diff --git a/Dockerfile b/Dockerfile index 1a800e93..ce31baaa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,15 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base -WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src -COPY ["build/build.csproj", "build/"] -RUN dotnet restore "build/build.csproj" COPY . . -WORKDIR "/src/build" -RUN dotnet build "build.csproj" -c Release -o /app/build +RUN dotnet run --project build/build.csproj -- publish -FROM build AS publish -RUN dotnet publish "build.csproj" -c Release -o /app/publish /p:UseAppHost=false +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base -FROM base AS final WORKDIR /app -EXPOSE 5000 +COPY --from=build /src/publish . +EXPOSE 8080 ENTRYPOINT ["dotnet", "Conduit.dll"] diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 00000000..e7638ce8 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,3 @@ +$ErrorActionPreference = "Stop"; + +dotnet run --project build/build.csproj -- $args \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 00000000..f75ab376 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +dotnet run --project Build/Build.csproj -- "$@" diff --git a/build/Program.cs b/build/Program.cs index fdb54a19..32956f15 100644 --- a/build/Program.cs +++ b/build/Program.cs @@ -13,7 +13,7 @@ Target( Clean, - ForEach("publish", "**/bin", "**/obj"), + ["publish", "**/bin", "**/obj"], dir => { IEnumerable<string> GetDirectories(string d) => Glob.Directories(".", d); @@ -39,15 +39,15 @@ void RemoveDirectory(string d) () => { Run("dotnet", "tool restore"); - Run("dotnet", "csharpier --check"); + Run("dotnet", "csharpier format ."); } ); -Target(Build, DependsOn(Format), () => Run("dotnet", "build . -c Release")); +Target(Build, [Format], () => Run("dotnet", "build . -c Release")); Target( Test, - DependsOn(Build), + [Build], () => { IEnumerable<string> GetFiles(string d) => Glob.Files(".", d); @@ -61,8 +61,8 @@ void RemoveDirectory(string d) Target( Publish, - DependsOn(Test), - ForEach("src/Conduit"), + [Test], + ["src/Conduit"], project => { Run( @@ -72,5 +72,5 @@ void RemoveDirectory(string d) } ); -Target("default", DependsOn(Publish), () => Console.WriteLine("Done!")); +Target("default", [Publish], () => Console.WriteLine("Done!")); await RunTargetsAndExitAsync(args); diff --git a/build/packages.lock.json b/build/packages.lock.json index 8a8fa2c0..bc1f7953 100644 --- a/build/packages.lock.json +++ b/build/packages.lock.json @@ -4,9 +4,9 @@ "net8.0": { "Bullseye": { "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "bqyt+m17ym+5aN45C5oZRAjuLDt8jKiCm/ys1XfymIXSkrTFwvI/QsbY3ucPSHDz7SF7uON7B57kXFv5H2k1ew==" + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "vgwwXfzs7jJrskWH7saHRMgPzziq/e86QZNWY1MnMxd7e+De7E7EX4K3C7yrvaK9y02SJoLxNxcLG/q5qUAghw==" }, "Glob": { "type": "Direct", diff --git a/docker-compose.yml b/docker-compose.yml index f9e158e3..e6b1ea84 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: conduit: build: . @@ -6,4 +5,4 @@ services: - ASPNETCORE_Conduit_DatabaseProvider=${ASPNETCORE_Conduit_DatabaseProvider} - ASPNETCORE_Conduit_ConnectionString=${ASPNETCORE_Conduit_ConnectionString} ports: - - "5000:5000" + - "8080:8080" diff --git a/src/Conduit/Conduit.csproj b/src/Conduit/Conduit.csproj index 3f69debc..fe9f26fc 100644 --- a/src/Conduit/Conduit.csproj +++ b/src/Conduit/Conduit.csproj @@ -1,6 +1,7 @@ <Project Sdk="Microsoft.NET.Sdk.Web"> <ItemGroup> <PackageReference Include="AutoMapper" /> + <PackageReference Include="FluentValidation.DependencyInjectionExtensions" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" /> @@ -8,7 +9,7 @@ <PackageReference Include="Serilog" /> <PackageReference Include="Serilog.Extensions.Logging" /> <PackageReference Include="Serilog.Sinks.Console" /> - <PackageReference Include="FluentValidation.AspNetCore" /> + <PackageReference Include="FluentValidation" /> <PackageReference Include="MediatR" /> <PackageReference Include="Swashbuckle.AspNetCore" /> </ItemGroup> diff --git a/src/Conduit/Features/Articles/Create.cs b/src/Conduit/Features/Articles/Create.cs index 2ef11bfe..9fdc8836 100644 --- a/src/Conduit/Features/Articles/Create.cs +++ b/src/Conduit/Features/Articles/Create.cs @@ -76,7 +76,7 @@ CancellationToken cancellationToken UpdatedAt = DateTime.UtcNow, Description = message.Article.Description, Title = message.Article.Title, - Slug = message.Article.Title.GenerateSlug() + Slug = message.Article.Title.GenerateSlug(), }; await context.Articles.AddAsync(article, cancellationToken); diff --git a/src/Conduit/Features/Articles/Edit.cs b/src/Conduit/Features/Articles/Edit.cs index 81527e9b..7d1a2b09 100644 --- a/src/Conduit/Features/Articles/Edit.cs +++ b/src/Conduit/Features/Articles/Edit.cs @@ -114,7 +114,7 @@ IEnumerable<string> articleTagList Article = article, ArticleId = article.ArticleId, Tag = new Tag { TagId = tag }, - TagId = tag + TagId = tag, }; articleTagsToCreate.Add(at); } diff --git a/src/Conduit/Features/Comments/Create.cs b/src/Conduit/Features/Comments/Create.cs index 77463cf0..4fc171fd 100644 --- a/src/Conduit/Features/Comments/Create.cs +++ b/src/Conduit/Features/Comments/Create.cs @@ -54,7 +54,7 @@ CancellationToken cancellationToken Author = author, Body = message.Model.Comment.Body ?? string.Empty, CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow + UpdatedAt = DateTime.UtcNow, }; await context.Comments.AddAsync(comment, cancellationToken); diff --git a/src/Conduit/Features/Favorites/Add.cs b/src/Conduit/Features/Favorites/Add.cs index fa5d0fbf..5de4bcef 100644 --- a/src/Conduit/Features/Favorites/Add.cs +++ b/src/Conduit/Features/Favorites/Add.cs @@ -66,7 +66,7 @@ CancellationToken cancellationToken Article = article, ArticleId = article.ArticleId, Person = person, - PersonId = person.PersonId + PersonId = person.PersonId, }; await context.ArticleFavorites.AddAsync(favorite, cancellationToken); await context.SaveChangesAsync(cancellationToken); diff --git a/src/Conduit/Features/Followers/Add.cs b/src/Conduit/Features/Followers/Add.cs index 4efae6de..b430e615 100644 --- a/src/Conduit/Features/Followers/Add.cs +++ b/src/Conduit/Features/Followers/Add.cs @@ -69,7 +69,7 @@ CancellationToken cancellationToken Observer = observer, ObserverId = observer.PersonId, Target = target, - TargetId = target.PersonId + TargetId = target.PersonId, }; await context.FollowedPeople.AddAsync(followedPeople, cancellationToken); await context.SaveChangesAsync(cancellationToken); diff --git a/src/Conduit/Features/Tags/List.cs b/src/Conduit/Features/Tags/List.cs index 19ad6237..4417d9bc 100644 --- a/src/Conduit/Features/Tags/List.cs +++ b/src/Conduit/Features/Tags/List.cs @@ -22,7 +22,7 @@ public async Task<TagsEnvelope> Handle(Query message, CancellationToken cancella .ToListAsync(cancellationToken); return new TagsEnvelope { - Tags = tags?.Select(x => x.TagId ?? string.Empty).ToList() ?? new List<string>() + Tags = tags?.Select(x => x.TagId ?? string.Empty).ToList() ?? new List<string>(), }; } } diff --git a/src/Conduit/Features/Users/Create.cs b/src/Conduit/Features/Users/Create.cs index f63ebb7b..fe339c1f 100644 --- a/src/Conduit/Features/Users/Create.cs +++ b/src/Conduit/Features/Users/Create.cs @@ -72,7 +72,7 @@ await context message.User.Password ?? throw new InvalidOperationException(), salt ), - Salt = salt + Salt = salt, }; await context.Persons.AddAsync(person, cancellationToken); diff --git a/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs b/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs index e2041f1c..e710b507 100644 --- a/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs +++ b/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs @@ -19,7 +19,7 @@ public string CreateToken(string username) JwtRegisteredClaimNames.Iat, new DateTimeOffset(_jwtOptions.IssuedAt).ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64 - ) + ), }; var jwt = new JwtSecurityToken( _jwtOptions.Issuer, diff --git a/src/Conduit/Program.cs b/src/Conduit/Program.cs index 1ea25654..4dbb239a 100644 --- a/src/Conduit/Program.cs +++ b/src/Conduit/Program.cs @@ -57,7 +57,7 @@ Description = "Please insert JWT with Bearer into field", Name = "Authorization", Type = SecuritySchemeType.ApiKey, - BearerFormat = "JWT" + BearerFormat = "JWT", } ); @@ -72,11 +72,11 @@ Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, - Id = "Bearer" - } + Id = "Bearer", + }, }, Array.Empty<string>() - } + }, } ); x.SwaggerDoc("v1", new OpenApiInfo { Title = "RealWorld API", Version = "v1" }); diff --git a/src/Conduit/ServicesExtensions.cs b/src/Conduit/ServicesExtensions.cs index ae703441..0ef3b466 100644 --- a/src/Conduit/ServicesExtensions.cs +++ b/src/Conduit/ServicesExtensions.cs @@ -5,7 +5,6 @@ using Conduit.Infrastructure; using Conduit.Infrastructure.Security; using FluentValidation; -using FluentValidation.AspNetCore; using MediatR; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Http; @@ -14,6 +13,7 @@ using Microsoft.IdentityModel.Tokens; using Serilog; using Serilog.Sinks.SystemConsole.Themes; +using Details = Conduit.Features.Users.Details; namespace Conduit; @@ -30,9 +30,7 @@ public static void AddConduit(this IServiceCollection services) typeof(DBContextTransactionPipelineBehavior<,>) ); - services.AddFluentValidationAutoValidation(); - services.AddFluentValidationClientsideAdapters(); - services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly()); + services.AddValidatorsFromAssemblyContaining<Details.QueryValidator>(); services.AddAutoMapper(typeof(Program)); @@ -75,7 +73,7 @@ public static void AddJwt(this IServiceCollection services) // Validate the token expiry ValidateLifetime = true, // If you want to allow a certain amount of clock drift, set that here: - ClockSkew = TimeSpan.Zero + ClockSkew = TimeSpan.Zero, }; services @@ -94,7 +92,7 @@ public static void AddJwt(this IServiceCollection services) } return Task.CompletedTask; - } + }, }; }); } diff --git a/src/Conduit/packages.lock.json b/src/Conduit/packages.lock.json index 32cb448e..269b54e9 100644 --- a/src/Conduit/packages.lock.json +++ b/src/Conduit/packages.lock.json @@ -4,28 +4,34 @@ "net8.0": { "AutoMapper": { "type": "Direct", - "requested": "[13.0.1, )", - "resolved": "13.0.1", - "contentHash": "/Fx1SbJ16qS7dU4i604Sle+U9VLX+WSNVJggk6MupKVkYvvBm4XqYaeFuf67diHefHKHs50uQIS2YEDFhPCakQ==", + "requested": "[14.0.0, )", + "resolved": "14.0.0", + "contentHash": "OC+1neAPM4oCCqQj3g2GJ2shziNNhOkxmNB9cVS8jtx4JbgmRzLcUOxB9Tsz6cVPHugdkHgCaCrTjjSI0Z5sCQ==", "dependencies": { - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Options": "8.0.0" } }, - "FluentValidation.AspNetCore": { + "FluentValidation": { "type": "Direct", - "requested": "[11.3.0, )", - "resolved": "11.3.0", - "contentHash": "jtFVgKnDFySyBlPS8bZbTKEEwJZnn11rXXJ2SQnjDhZ56rQqybBg9Joq4crRLz3y0QR8WoOq4iE4piV81w/Djg==", + "requested": "[12.0.0, )", + "resolved": "12.0.0", + "contentHash": "8NVLxtMUXynRHJIX3Hn1ACovaqZIJASufXIIFkD0EUbcd5PmMsL1xUD5h548gCezJ5BzlITaR9CAMrGe29aWpA==" + }, + "FluentValidation.DependencyInjectionExtensions": { + "type": "Direct", + "requested": "[12.0.0, )", + "resolved": "12.0.0", + "contentHash": "B28fBRL1UjhGsBC8fwV6YBZosh+SiU1FxdD7l7p5dGPgRlVI7UnM+Lgzmg+unZtV1Zxzpaw96UY2MYfMaAd8cg==", "dependencies": { - "FluentValidation": "11.5.1", - "FluentValidation.DependencyInjectionExtensions": "11.5.1" + "FluentValidation": "12.0.0", + "Microsoft.Extensions.Dependencyinjection.Abstractions": "2.1.0" } }, "MediatR": { "type": "Direct", - "requested": "[12.2.0, )", - "resolved": "12.2.0", - "contentHash": "8TUFrHapKi6D74PhnSNEguRsH91HNGyP3R4ZQdgDorJgl9Wac5Prh0vA33QfrniAaS6L2xNNhc6vxzg+5AIbwA==", + "requested": "[12.5.0, )", + "resolved": "12.5.0", + "contentHash": "vqm2H8/nqL5NAJHPhsG1JOPwfkmbVrPyh4svdoRzu+uZh6Ex7PRoHBGsLYC0/RWCEJFqD1ohHNpteQvql9OktA==", "dependencies": { "MediatR.Contracts": "[2.0.1, 3.0.0)", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" @@ -33,47 +39,48 @@ }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "tHnHRBgQyiVNZJ8PksNinLdGOsE8+tFFv3E9QEtmwO+iyTHRvg4bJ4X0XZG1u9KxXMTJuAdeIWKWYr2rTLEHqQ==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "EUNaX3F4fALAfvp7wsCqjqziu1lTNwYRFbIcVJEt6vInWxEpscAM/pcG6GBOx3WcmSRdB7sqtKAKSkyY6XhTig==", "dependencies": { "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.1.2" } }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "3fj0V/NKG66LLwUtoDofSyogku1ueF78uUIdGPEJJhS3MW7w3xLsizMaDYX+ooR74IM96YJI5N3tyOU5FZiiwg==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "0e/vEkQGJ7mwacknDbUsvntuoQYlSWHuYmFDSSlkuwUKf+cKu9sKCaNUA6eH/+OOH2eEyioKMMPS5yp1wN8L+Q==", "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.4" + "Microsoft.EntityFrameworkCore": "8.0.13" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "7y0Z7y1SwBNswxlNY9zduqk5I0+pWWzYIFhtJtvo55RcfomIQDmOODG/s5+iOxv0JoVHjFOgAc8AMI3DwAaoig==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "1YJXLSECbKhC5lE9VuD+MtWsx+imwC6oeUCUvHUnNAlkeDgzP4jwEmYbCTqHbgX6Tjw1mEzzq/eGUt4zNW0/uA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.4", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.13", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "/IlHNxzZGqiuVi+FPtjFZgAOfY989fTPtxw8zhmlFwv5M2WJzBSMlAP4jNVQX/k7/qu+y1YvddPxg4O5QdeRXw==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "u63lys+66IdCJKMg0eUe/SQkmbyiFXEDS81Xgw+19RiUGpzsfB3PpkCBggmYWBbC5YDnKtgthpr8R7Nljv/QXA==", "dependencies": { - "Microsoft.Data.SqlClient": "5.1.5", - "Microsoft.EntityFrameworkCore.Relational": "8.0.4" + "Microsoft.Data.SqlClient": "5.1.6", + "Microsoft.EntityFrameworkCore.Relational": "8.0.13", + "System.Formats.Asn1": "8.0.2" } }, "Serilog": { "type": "Direct", - "requested": "[3.1.1, )", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "+cDryFR0GRhsGOnZSKwaDzRRl4MupvJ42FhCE4zhQRVanX0Jpg6WuCBk59OVhVDPmab1bB+nRykAnykYELA9qQ==" }, "Serilog.Extensions.Logging": { "type": "Direct", @@ -87,31 +94,32 @@ }, "Serilog.Sinks.Console": { "type": "Direct", - "requested": "[5.0.1, )", - "resolved": "5.0.1", - "contentHash": "6Jt8jl9y2ey8VV7nVEUAyjjyxjAQuvd5+qj4XYAT9CwcsvR70HHULGBeD+K2WCALFXf7CFsNQT4lON6qXcu2AA==", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==", "dependencies": { - "Serilog": "3.1.1" + "Serilog": "4.0.0" } }, "Swashbuckle.AspNetCore": { "type": "Direct", - "requested": "[6.5.0, )", - "resolved": "6.5.0", - "contentHash": "FK05XokgjgwlCI6wCT+D4/abtQkL1X1/B9Oas6uIwHFmYrIO9WUD5aLC9IzMs9GnHfUXOtXZ2S43gN1mhs5+aA==", + "requested": "[8.1.4, )", + "resolved": "8.1.4", + "contentHash": "qYk8VHyvs6wML+KXtjyCgS9Aj18mcm0ZtnJeNCTlj/DYQ7A3pfLIztQgLuZS/LEMYsrTo1lSKR3IIZ5/HzVCWA==", "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.Swagger": "8.1.4", + "Swashbuckle.AspNetCore.SwaggerGen": "8.1.4", + "Swashbuckle.AspNetCore.SwaggerUI": "8.1.4" } }, "Azure.Core": { "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "resolved": "1.38.0", + "contentHash": "IuEgCoVA0ef7E4pQtpC3+TkPbzaoQfa77HlfJDmfuaJUCVJmn7fT0izamZiryW5sYUFKizsftIxMkXKbgIcPMQ==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.ClientModel": "1.0.0", "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", @@ -122,32 +130,18 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "resolved": "1.11.4", + "contentHash": "Sf4BoE6Q3jTgFkgBkx7qztYOFELBCo+wQgpYDwal/qJ1unBH73ywPztIJKXBXORRzAeNijsuxhk94h0TIMvfYg==", "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Azure.Core": "1.38.0", + "Microsoft.Identity.Client": "4.61.3", + "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", "System.Threading.Tasks.Extensions": "4.5.4" } }, - "FluentValidation": { - "type": "Transitive", - "resolved": "11.5.1", - "contentHash": "0h1Q5lNOLLyYTWMJmyNoMqhY4CBRvvUWvJP1R4F2CnmmzuWwvB0A8aVmw5+lOuwYnwUwCRrdeMLbc81F38ahNQ==" - }, - "FluentValidation.DependencyInjectionExtensions": { - "type": "Transitive", - "resolved": "11.5.1", - "contentHash": "iWM0LS1MDYX06pcjMEQKqHirl2zkjHlNV23mEJSoR1IZI7KQmTa0RcTtGEJpj5+iHvBCfrzP2mYKM4FtRKVb+A==", - "dependencies": { - "FluentValidation": "11.5.1", - "Microsoft.Extensions.Dependencyinjection.Abstractions": "2.1.0" - } - }, "MediatR.Contracts": { "type": "Transitive", "resolved": "2.0.1", @@ -160,12 +154,12 @@ }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.1.5", - "contentHash": "6kvhQjY5uBCdBccezFD2smfnpQjQ33cZtUZVrNvxlwoBu6uopM5INH6uSgLI7JRLtlQ3bMPwnhMq4kchsXeZ5w==", + "resolved": "5.1.6", + "contentHash": "+pz7gIPh5ydsBcQvivt4R98PwJXer86fyQBBToIBLxZ5kuhW4N13Ijz87s9WpuPtF1vh4JesYCgpDPAOgkMhdg==", "dependencies": { - "Azure.Identity": "1.10.3", + "Azure.Identity": "1.11.4", "Microsoft.Data.SqlClient.SNI.runtime": "5.1.1", - "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client": "4.61.3", "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", @@ -185,50 +179,50 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "x5FE5m1h31UIDEk0j3r38HtYvsa0fxd5jXzvE/SARI7LecXt/jm4z2SUl6TEoJGQOo9Ow2wg3a0MU2E1TVVAdA==", + "resolved": "8.0.13", + "contentHash": "OpNpA2EPMzXXnftLg2JcVGBDRbPLLmerhoTIjQ78rLTdqUfIJQ0Schn+Ev5ngmMFMD2kpN9bOqkgbS+csrn5Vg==", "dependencies": { "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "/kyu9pXuxQvhg8RO/oN5Q5Og7cDIVvZtrt1z48rX7Yido+zEGkUkp3/Bjd9u45N2uuPPF8mn2pKDlAewCvv3/Q==", + "resolved": "8.0.13", + "contentHash": "4wyLeg64sZgJcER83fkitlKuySY3OzwcOZSZcGV1TNskmThupfhcVlsQht7bNCfNpXTCZVNIOwAZChk6/OFdXQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.4", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.4", - "Microsoft.Extensions.Caching.Memory": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.13", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.13", + "Microsoft.Extensions.Caching.Memory": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "S50pjtPNOvRktacaO6UAhvGCPMT56wxqEq8fQfcjaSUySPGba6mKWo6ackw6DdeAR1cA6U+U0uj27warA2KtJA==" + "resolved": "8.0.13", + "contentHash": "a6O+v8CMStumpVoQyN0aUpx5P3/qYZP+5791sGrzJhIM+QsniQdSaJVdUSneL40M+FpBgtiC8ggqzNo2x/gVlw==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "P8hfMZECdbgle4Us8HGRUKAjqVwgbtr5JqtCxqEoiVORrNQAmcpu3g1NKwTAoUsO9Z0QRgExtYoAmdggR/DkMQ==" + "resolved": "8.0.13", + "contentHash": "ENny33QADFiRxge5ikJBs2p7JB4MQx/ZSPKPNwt2eJPO0lVUGSjTiJeunGGggkVHiaUy0yY4f625LQtNlErIsw==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "aWLT6e9a8oMzXgF0YQpYYa3mDeU+yb2UQSQ+RrIgyGgSpzPfSKgpA7v2kOVDuZr2AQ6NNAlWPaBG7wZuKQI96w==", + "resolved": "8.0.13", + "contentHash": "uQR2iTar+6ZEjEHTwgH0/7ySSRme4R9sDiupfG3w/eBub3365fPw/MjhsuOMQkdq9YzLM7veH4Qt/K9OqL26Qg==", "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.4", + "Microsoft.EntityFrameworkCore": "8.0.13", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "4XCrL6vdFQSXZY6b89cXvjYNvTKP5azMvgacI2XE+B0D7Lg3zYSjmfLZYWfR3j3izx5X8xCTkHZnaRHHfHcv+w==", + "resolved": "8.0.13", + "contentHash": "icokw+Wn2H8zbNzh+GyxeoGHl3OJ6CkGZNOHLIkfsvAOl40m2UF1Ny1m9SznrGfZc5FrSqJoxC6NlLsPQ2N5Yg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "8.0.4", - "Microsoft.EntityFrameworkCore.Relational": "8.0.4", - "Microsoft.Extensions.DependencyModel": "8.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.13", + "Microsoft.EntityFrameworkCore.Relational": "8.0.13", + "Microsoft.Extensions.DependencyModel": "8.0.2" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -246,13 +240,13 @@ }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", + "resolved": "8.0.1", + "contentHash": "HFDnhYLccngrzyGgHkjEDU5FMLn4MpOsr5ElgsBMC4yx6lJh4jeWO7fHS8+TXPq+dgxCmUa/Trl8svObmwW4QA==", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "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" } }, @@ -266,48 +260,44 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0", - "System.Text.Json": "8.0.0" - } + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "resolved": "8.0.2", + "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "Microsoft.Extensions.Primitives": "8.0.0" @@ -320,19 +310,19 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "resolved": "4.61.3", + "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "resolved": "4.61.3", + "contentHash": "PWnJcznrSGr25MN8ajlc2XIDW4zCFu0U6FkpaNLEWLgd1NgFCp5uDY3mqLDgM8zCN8hqj8yo5wHYfLB2HjcdGw==", "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", + "Microsoft.Identity.Client": "4.61.3", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -385,8 +375,8 @@ }, "Microsoft.OpenApi": { "type": "Transitive", - "resolved": "1.2.3", - "contentHash": "Nug3rO+7Kl5/SBAadzSMAVgqDlfGjJZ0GenQrLywJ84XGKO0uRqkunz5Wyl0SDwcR71bAATXvSdbdzPrYRYKGw==" + "resolved": "1.6.23", + "contentHash": "tZ1I0KXnn98CWuV8cpI247A17jaY+ILS9vvF7yhI0uPPEqF4P1d7BWL5Uwtel10w9NucllHB3nTkfYTAcHAh8g==" }, "Microsoft.SqlServer.Server": { "type": "Transitive", @@ -430,24 +420,33 @@ }, "Swashbuckle.AspNetCore.Swagger": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "XWmCmqyFmoItXKFsQSwQbEAsjDKcxlNf1l+/Ki42hcb6LjKL8m5Db69OTvz5vLonMSRntYO1XLqz0OP+n3vKnA==", + "resolved": "8.1.4", + "contentHash": "w83aYEBJYNa6ZYomziwZWwXhqQPLKhZH0n8MzqqNhF1ElCGBKm71kd7W6pgIr/yu0i6ymQzrZUFSZLdvH1kY5w==", "dependencies": { - "Microsoft.OpenApi": "1.2.3" + "Microsoft.OpenApi": "1.6.23" } }, "Swashbuckle.AspNetCore.SwaggerGen": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "Y/qW8Qdg9OEs7V013tt+94OdPxbRdbhcEbw4NiwGvf4YBcfhL/y7qp/Mjv/cENsQ2L3NqJ2AOu94weBy/h4KvA==", + "resolved": "8.1.4", + "contentHash": "aBwO2MF1HHAaWgdBwX8tlSqxycOKTKmCT6pEpb0oSY1pn7mUdmzJvHZA0HxWx9nfmKP0eOGQcLC9ZnN/MuehRQ==", "dependencies": { - "Swashbuckle.AspNetCore.Swagger": "6.5.0" + "Swashbuckle.AspNetCore.Swagger": "8.1.4" } }, "Swashbuckle.AspNetCore.SwaggerUI": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==" + "resolved": "8.1.4", + "contentHash": "mTn6OwB43ETrN6IgAZd7ojWGhTwBZ98LT3QwbAn6Gg3wJStQV4znU0mWiHaKFlD/+Qhj1uhAUOa52rmd6xmbzg==" + }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "I3CVkvxeqFYjIVEP59DnjbeoGNfo/+SZrCLpRz2v/g0gpCHaEMPtWSY0s9k/7jR1rAsLNg2z2u1JRB76tPjnIw==", + "dependencies": { + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } }, "System.Configuration.ConfigurationManager": { "type": "Transitive", @@ -476,8 +475,8 @@ }, "System.Formats.Asn1": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" + "resolved": "8.0.2", + "contentHash": "yUsFqNGa7tbwm5QOOnOR3VSoh8a0Yki39mTbhOnErdbg8hVSFtrK0EXerj286PXcegiF1LkE7lL++qqMZW5jIQ==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", @@ -488,15 +487,6 @@ "Microsoft.IdentityModel.Tokens": "7.1.2" } }, - "System.IO.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "System.Memory": { "type": "Transitive", "resolved": "4.5.4", @@ -571,16 +561,16 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } }, "System.Text.Json": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", diff --git a/src/Conduit/realworld.db b/src/Conduit/realworld.db deleted file mode 100644 index d2b623a4..00000000 Binary files a/src/Conduit/realworld.db and /dev/null differ diff --git a/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs b/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs index ff9c2495..c6e5a347 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs @@ -16,7 +16,7 @@ public async Task Expect_Create_Article() Title = "Test article dsergiu77", Description = "Description of the test article", Body = "Body of the test article", - TagList = ["tag1", "tag2"] + TagList = ["tag1", "tag2"], } ); diff --git a/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs b/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs index dc7a4852..617a6433 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs @@ -49,7 +49,7 @@ public async Task Expect_Delete_Article_With_Tags() Title = "Test article dsergiu77", Description = "Description of the test article", Body = "Body of the test article", - TagList = ["tag1", "tag2"] + TagList = ["tag1", "tag2"], } ); diff --git a/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs b/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs index 92676e36..831ba2ec 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs @@ -17,7 +17,7 @@ public async Task Expect_Edit_Article() Title = "Test article dsergiu77", Description = "Description of the test article", Body = "Body of the test article", - TagList = ["tag1", "tag2"] + TagList = ["tag1", "tag2"], } ); diff --git a/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs b/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs index 3251b74c..8ecf7ce5 100644 --- a/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs @@ -18,7 +18,7 @@ public async Task Expect_Login() Username = "username", Email = "email", Hash = await new PasswordHasher().Hash("password", salt), - Salt = salt + Salt = salt, }; await InsertAsync(person); diff --git a/tests/Conduit.IntegrationTests/packages.lock.json b/tests/Conduit.IntegrationTests/packages.lock.json index 45f1ff50..bbff08e6 100644 --- a/tests/Conduit.IntegrationTests/packages.lock.json +++ b/tests/Conduit.IntegrationTests/packages.lock.json @@ -4,37 +4,38 @@ "net8.0": { "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.9.0, )", - "resolved": "17.9.0", - "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", + "requested": "[17.14.1, )", + "resolved": "17.14.1", + "contentHash": "HJKqKOE+vshXra2aEHpi2TlxYX7Z9VFYkr+E5rwEvHC8eIXiyO+K9kNm8vmNom3e2rA56WqxU+/N9NJlLGXsJQ==", "dependencies": { - "Microsoft.CodeCoverage": "17.9.0", - "Microsoft.TestPlatform.TestHost": "17.9.0" + "Microsoft.CodeCoverage": "17.14.1", + "Microsoft.TestPlatform.TestHost": "17.14.1" } }, "xunit": { "type": "Direct", - "requested": "[2.7.0, )", - "resolved": "2.7.0", - "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", "dependencies": { - "xunit.analyzers": "1.11.0", - "xunit.assert": "2.7.0", - "xunit.core": "[2.7.0]" + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.7, )", - "resolved": "2.5.7", - "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==" + "requested": "[3.1.1, )", + "resolved": "3.1.1", + "contentHash": "gNu2zhnuwjq5vQlU4S7yK/lfaKZDLmtcu+vTjnhfTlMAUYn+Hmgu8IIX0UCwWepYkk+Szx03DHx1bDnc9Fd+9w==" }, "Azure.Core": { "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "resolved": "1.38.0", + "contentHash": "IuEgCoVA0ef7E4pQtpC3+TkPbzaoQfa77HlfJDmfuaJUCVJmn7fT0izamZiryW5sYUFKizsftIxMkXKbgIcPMQ==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.ClientModel": "1.0.0", "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", @@ -45,32 +46,18 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "resolved": "1.11.4", + "contentHash": "Sf4BoE6Q3jTgFkgBkx7qztYOFELBCo+wQgpYDwal/qJ1unBH73ywPztIJKXBXORRzAeNijsuxhk94h0TIMvfYg==", "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Azure.Core": "1.38.0", + "Microsoft.Identity.Client": "4.61.3", + "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", "System.Threading.Tasks.Extensions": "4.5.4" } }, - "FluentValidation": { - "type": "Transitive", - "resolved": "11.5.1", - "contentHash": "0h1Q5lNOLLyYTWMJmyNoMqhY4CBRvvUWvJP1R4F2CnmmzuWwvB0A8aVmw5+lOuwYnwUwCRrdeMLbc81F38ahNQ==" - }, - "FluentValidation.DependencyInjectionExtensions": { - "type": "Transitive", - "resolved": "11.5.1", - "contentHash": "iWM0LS1MDYX06pcjMEQKqHirl2zkjHlNV23mEJSoR1IZI7KQmTa0RcTtGEJpj5+iHvBCfrzP2mYKM4FtRKVb+A==", - "dependencies": { - "FluentValidation": "11.5.1", - "Microsoft.Extensions.Dependencyinjection.Abstractions": "2.1.0" - } - }, "MediatR.Contracts": { "type": "Transitive", "resolved": "2.0.1", @@ -83,17 +70,17 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" + "resolved": "17.14.1", + "contentHash": "pmTrhfFIoplzFVbhVwUquT+77CbGH+h4/3mBpdmIlYtBi9nAB+kKI6dN3A/nV4DFi3wLLx/BlHIPK+MkbQ6Tpg==" }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.1.5", - "contentHash": "6kvhQjY5uBCdBccezFD2smfnpQjQ33cZtUZVrNvxlwoBu6uopM5INH6uSgLI7JRLtlQ3bMPwnhMq4kchsXeZ5w==", + "resolved": "5.1.6", + "contentHash": "+pz7gIPh5ydsBcQvivt4R98PwJXer86fyQBBToIBLxZ5kuhW4N13Ijz87s9WpuPtF1vh4JesYCgpDPAOgkMhdg==", "dependencies": { - "Azure.Identity": "1.10.3", + "Azure.Identity": "1.11.4", "Microsoft.Data.SqlClient.SNI.runtime": "5.1.1", - "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client": "4.61.3", "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", @@ -113,50 +100,50 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "x5FE5m1h31UIDEk0j3r38HtYvsa0fxd5jXzvE/SARI7LecXt/jm4z2SUl6TEoJGQOo9Ow2wg3a0MU2E1TVVAdA==", + "resolved": "8.0.13", + "contentHash": "OpNpA2EPMzXXnftLg2JcVGBDRbPLLmerhoTIjQ78rLTdqUfIJQ0Schn+Ev5ngmMFMD2kpN9bOqkgbS+csrn5Vg==", "dependencies": { "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "/kyu9pXuxQvhg8RO/oN5Q5Og7cDIVvZtrt1z48rX7Yido+zEGkUkp3/Bjd9u45N2uuPPF8mn2pKDlAewCvv3/Q==", + "resolved": "8.0.13", + "contentHash": "4wyLeg64sZgJcER83fkitlKuySY3OzwcOZSZcGV1TNskmThupfhcVlsQht7bNCfNpXTCZVNIOwAZChk6/OFdXQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.4", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.4", - "Microsoft.Extensions.Caching.Memory": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.13", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.13", + "Microsoft.Extensions.Caching.Memory": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "S50pjtPNOvRktacaO6UAhvGCPMT56wxqEq8fQfcjaSUySPGba6mKWo6ackw6DdeAR1cA6U+U0uj27warA2KtJA==" + "resolved": "8.0.13", + "contentHash": "a6O+v8CMStumpVoQyN0aUpx5P3/qYZP+5791sGrzJhIM+QsniQdSaJVdUSneL40M+FpBgtiC8ggqzNo2x/gVlw==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "P8hfMZECdbgle4Us8HGRUKAjqVwgbtr5JqtCxqEoiVORrNQAmcpu3g1NKwTAoUsO9Z0QRgExtYoAmdggR/DkMQ==" + "resolved": "8.0.13", + "contentHash": "ENny33QADFiRxge5ikJBs2p7JB4MQx/ZSPKPNwt2eJPO0lVUGSjTiJeunGGggkVHiaUy0yY4f625LQtNlErIsw==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "aWLT6e9a8oMzXgF0YQpYYa3mDeU+yb2UQSQ+RrIgyGgSpzPfSKgpA7v2kOVDuZr2AQ6NNAlWPaBG7wZuKQI96w==", + "resolved": "8.0.13", + "contentHash": "uQR2iTar+6ZEjEHTwgH0/7ySSRme4R9sDiupfG3w/eBub3365fPw/MjhsuOMQkdq9YzLM7veH4Qt/K9OqL26Qg==", "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.4", + "Microsoft.EntityFrameworkCore": "8.0.13", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "4XCrL6vdFQSXZY6b89cXvjYNvTKP5azMvgacI2XE+B0D7Lg3zYSjmfLZYWfR3j3izx5X8xCTkHZnaRHHfHcv+w==", + "resolved": "8.0.13", + "contentHash": "icokw+Wn2H8zbNzh+GyxeoGHl3OJ6CkGZNOHLIkfsvAOl40m2UF1Ny1m9SznrGfZc5FrSqJoxC6NlLsPQ2N5Yg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "8.0.4", - "Microsoft.EntityFrameworkCore.Relational": "8.0.4", - "Microsoft.Extensions.DependencyModel": "8.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.13", + "Microsoft.EntityFrameworkCore.Relational": "8.0.13", + "Microsoft.Extensions.DependencyModel": "8.0.2" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -174,13 +161,13 @@ }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", + "resolved": "8.0.1", + "contentHash": "HFDnhYLccngrzyGgHkjEDU5FMLn4MpOsr5ElgsBMC4yx6lJh4jeWO7fHS8+TXPq+dgxCmUa/Trl8svObmwW4QA==", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "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" } }, @@ -194,48 +181,44 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0", - "System.Text.Json": "8.0.0" - } + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "resolved": "8.0.2", + "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "Microsoft.Extensions.Primitives": "8.0.0" @@ -248,19 +231,19 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "resolved": "4.61.3", + "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "resolved": "4.61.3", + "contentHash": "PWnJcznrSGr25MN8ajlc2XIDW4zCFu0U6FkpaNLEWLgd1NgFCp5uDY3mqLDgM8zCN8hqj8yo5wHYfLB2HjcdGw==", "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", + "Microsoft.Identity.Client": "4.61.3", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -313,8 +296,8 @@ }, "Microsoft.OpenApi": { "type": "Transitive", - "resolved": "1.2.3", - "contentHash": "Nug3rO+7Kl5/SBAadzSMAVgqDlfGjJZ0GenQrLywJ84XGKO0uRqkunz5Wyl0SDwcR71bAATXvSdbdzPrYRYKGw==" + "resolved": "1.6.23", + "contentHash": "tZ1I0KXnn98CWuV8cpI247A17jaY+ILS9vvF7yhI0uPPEqF4P1d7BWL5Uwtel10w9NucllHB3nTkfYTAcHAh8g==" }, "Microsoft.SqlServer.Server": { "type": "Transitive", @@ -323,19 +306,19 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "1ilw/8vgmjLyKU+2SKXKXaOqpYFJCQfGqGz+x0cosl981VzjrY74Sv6qAJv+neZMZ9ZMxF3ArN6kotaQ4uvEBw==", + "resolved": "17.14.1", + "contentHash": "xTP1W6Mi6SWmuxd3a+jj9G9UoC850WGwZUps1Wah9r1ZxgXhdJfj1QqDLJkFjHDCvN42qDL2Ps5KjQYWUU0zcQ==", "dependencies": { - "System.Reflection.Metadata": "1.6.0" + "System.Reflection.Metadata": "8.0.0" } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "Spmg7Wx49Ya3SxBjyeAR+nQpjMTKZwTwpZ7KyeOTIqI/WHNPnBU4HUvl5kuHPQAwGWqMy4FGZja1HvEwvoaDiA==", + "resolved": "17.14.1", + "contentHash": "d78LPzGKkJwsJXAQwsbJJ7LE7D1wB+rAyhHHAaODF+RDSQ0NgMjDFkSA1Djw18VrxO76GlKAjRUhl+H8NL8Z+Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.9.0", - "Newtonsoft.Json": "13.0.1" + "Microsoft.TestPlatform.ObjectModel": "17.14.1", + "Newtonsoft.Json": "13.0.3" } }, "Microsoft.Win32.SystemEvents": { @@ -345,8 +328,8 @@ }, "Newtonsoft.Json": { "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", @@ -380,24 +363,38 @@ }, "Swashbuckle.AspNetCore.Swagger": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "XWmCmqyFmoItXKFsQSwQbEAsjDKcxlNf1l+/Ki42hcb6LjKL8m5Db69OTvz5vLonMSRntYO1XLqz0OP+n3vKnA==", + "resolved": "8.1.4", + "contentHash": "w83aYEBJYNa6ZYomziwZWwXhqQPLKhZH0n8MzqqNhF1ElCGBKm71kd7W6pgIr/yu0i6ymQzrZUFSZLdvH1kY5w==", "dependencies": { - "Microsoft.OpenApi": "1.2.3" + "Microsoft.OpenApi": "1.6.23" } }, "Swashbuckle.AspNetCore.SwaggerGen": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "Y/qW8Qdg9OEs7V013tt+94OdPxbRdbhcEbw4NiwGvf4YBcfhL/y7qp/Mjv/cENsQ2L3NqJ2AOu94weBy/h4KvA==", + "resolved": "8.1.4", + "contentHash": "aBwO2MF1HHAaWgdBwX8tlSqxycOKTKmCT6pEpb0oSY1pn7mUdmzJvHZA0HxWx9nfmKP0eOGQcLC9ZnN/MuehRQ==", "dependencies": { - "Swashbuckle.AspNetCore.Swagger": "6.5.0" + "Swashbuckle.AspNetCore.Swagger": "8.1.4" } }, "Swashbuckle.AspNetCore.SwaggerUI": { "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==" + "resolved": "8.1.4", + "contentHash": "mTn6OwB43ETrN6IgAZd7ojWGhTwBZ98LT3QwbAn6Gg3wJStQV4znU0mWiHaKFlD/+Qhj1uhAUOa52rmd6xmbzg==" + }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "I3CVkvxeqFYjIVEP59DnjbeoGNfo/+SZrCLpRz2v/g0gpCHaEMPtWSY0s9k/7jR1rAsLNg2z2u1JRB76tPjnIw==", + "dependencies": { + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" }, "System.Configuration.ConfigurationManager": { "type": "Transitive", @@ -426,8 +423,8 @@ }, "System.Formats.Asn1": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" + "resolved": "8.0.2", + "contentHash": "yUsFqNGa7tbwm5QOOnOR3VSoh8a0Yki39mTbhOnErdbg8hVSFtrK0EXerj286PXcegiF1LkE7lL++qqMZW5jIQ==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", @@ -438,15 +435,6 @@ "Microsoft.IdentityModel.Tokens": "7.1.2" } }, - "System.IO.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "System.Memory": { "type": "Transitive", "resolved": "4.5.4", @@ -468,8 +456,11 @@ }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + } }, "System.Runtime.Caching": { "type": "Transitive", @@ -526,16 +517,16 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } }, "System.Text.Json": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -557,79 +548,86 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.11.0", - "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" + "resolved": "2.9.3", + "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", "dependencies": { - "xunit.extensibility.core": "[2.7.0]", - "xunit.extensibility.execution": "[2.7.0]" + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", + "resolved": "2.9.3", + "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==", "dependencies": { "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", + "resolved": "2.9.3", + "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==", "dependencies": { - "xunit.extensibility.core": "[2.7.0]" + "xunit.extensibility.core": "[2.9.3]" } }, "conduit": { "type": "Project", "dependencies": { - "AutoMapper": "[13.0.1, )", - "FluentValidation.AspNetCore": "[11.3.0, )", - "MediatR": "[12.2.0, )", - "Microsoft.AspNetCore.Authentication.JwtBearer": "[8.0.4, )", - "Microsoft.EntityFrameworkCore.InMemory": "[8.0.4, )", - "Microsoft.EntityFrameworkCore.SqlServer": "[8.0.4, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.4, )", - "Serilog": "[3.1.1, )", + "AutoMapper": "[14.0.0, )", + "FluentValidation": "[12.0.0, )", + "FluentValidation.DependencyInjectionExtensions": "[12.0.0, )", + "MediatR": "[12.5.0, )", + "Microsoft.AspNetCore.Authentication.JwtBearer": "[8.0.13, )", + "Microsoft.EntityFrameworkCore.InMemory": "[8.0.13, )", + "Microsoft.EntityFrameworkCore.SqlServer": "[8.0.13, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.13, )", + "Serilog": "[4.3.0, )", "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Console": "[5.0.1, )", - "Swashbuckle.AspNetCore": "[6.5.0, )" + "Serilog.Sinks.Console": "[6.0.0, )", + "Swashbuckle.AspNetCore": "[8.1.4, )" } }, "AutoMapper": { "type": "CentralTransitive", - "requested": "[13.0.1, )", - "resolved": "13.0.1", - "contentHash": "/Fx1SbJ16qS7dU4i604Sle+U9VLX+WSNVJggk6MupKVkYvvBm4XqYaeFuf67diHefHKHs50uQIS2YEDFhPCakQ==", + "requested": "[14.0.0, )", + "resolved": "14.0.0", + "contentHash": "OC+1neAPM4oCCqQj3g2GJ2shziNNhOkxmNB9cVS8jtx4JbgmRzLcUOxB9Tsz6cVPHugdkHgCaCrTjjSI0Z5sCQ==", "dependencies": { - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Options": "8.0.0" } }, - "FluentValidation.AspNetCore": { + "FluentValidation": { "type": "CentralTransitive", - "requested": "[11.3.0, )", - "resolved": "11.3.0", - "contentHash": "jtFVgKnDFySyBlPS8bZbTKEEwJZnn11rXXJ2SQnjDhZ56rQqybBg9Joq4crRLz3y0QR8WoOq4iE4piV81w/Djg==", + "requested": "[12.0.0, )", + "resolved": "12.0.0", + "contentHash": "8NVLxtMUXynRHJIX3Hn1ACovaqZIJASufXIIFkD0EUbcd5PmMsL1xUD5h548gCezJ5BzlITaR9CAMrGe29aWpA==" + }, + "FluentValidation.DependencyInjectionExtensions": { + "type": "CentralTransitive", + "requested": "[12.0.0, )", + "resolved": "12.0.0", + "contentHash": "B28fBRL1UjhGsBC8fwV6YBZosh+SiU1FxdD7l7p5dGPgRlVI7UnM+Lgzmg+unZtV1Zxzpaw96UY2MYfMaAd8cg==", "dependencies": { - "FluentValidation": "11.5.1", - "FluentValidation.DependencyInjectionExtensions": "11.5.1" + "FluentValidation": "12.0.0", + "Microsoft.Extensions.Dependencyinjection.Abstractions": "2.1.0" } }, "MediatR": { "type": "CentralTransitive", - "requested": "[12.2.0, )", - "resolved": "12.2.0", - "contentHash": "8TUFrHapKi6D74PhnSNEguRsH91HNGyP3R4ZQdgDorJgl9Wac5Prh0vA33QfrniAaS6L2xNNhc6vxzg+5AIbwA==", + "requested": "[12.5.0, )", + "resolved": "12.5.0", + "contentHash": "vqm2H8/nqL5NAJHPhsG1JOPwfkmbVrPyh4svdoRzu+uZh6Ex7PRoHBGsLYC0/RWCEJFqD1ohHNpteQvql9OktA==", "dependencies": { "MediatR.Contracts": "[2.0.1, 3.0.0)", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" @@ -637,47 +635,48 @@ }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "CentralTransitive", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "tHnHRBgQyiVNZJ8PksNinLdGOsE8+tFFv3E9QEtmwO+iyTHRvg4bJ4X0XZG1u9KxXMTJuAdeIWKWYr2rTLEHqQ==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "EUNaX3F4fALAfvp7wsCqjqziu1lTNwYRFbIcVJEt6vInWxEpscAM/pcG6GBOx3WcmSRdB7sqtKAKSkyY6XhTig==", "dependencies": { "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.1.2" } }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "CentralTransitive", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "3fj0V/NKG66LLwUtoDofSyogku1ueF78uUIdGPEJJhS3MW7w3xLsizMaDYX+ooR74IM96YJI5N3tyOU5FZiiwg==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "0e/vEkQGJ7mwacknDbUsvntuoQYlSWHuYmFDSSlkuwUKf+cKu9sKCaNUA6eH/+OOH2eEyioKMMPS5yp1wN8L+Q==", "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.4" + "Microsoft.EntityFrameworkCore": "8.0.13" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "CentralTransitive", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "7y0Z7y1SwBNswxlNY9zduqk5I0+pWWzYIFhtJtvo55RcfomIQDmOODG/s5+iOxv0JoVHjFOgAc8AMI3DwAaoig==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "1YJXLSECbKhC5lE9VuD+MtWsx+imwC6oeUCUvHUnNAlkeDgzP4jwEmYbCTqHbgX6Tjw1mEzzq/eGUt4zNW0/uA==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.4", + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.13", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "CentralTransitive", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "/IlHNxzZGqiuVi+FPtjFZgAOfY989fTPtxw8zhmlFwv5M2WJzBSMlAP4jNVQX/k7/qu+y1YvddPxg4O5QdeRXw==", + "requested": "[8.0.13, )", + "resolved": "8.0.13", + "contentHash": "u63lys+66IdCJKMg0eUe/SQkmbyiFXEDS81Xgw+19RiUGpzsfB3PpkCBggmYWBbC5YDnKtgthpr8R7Nljv/QXA==", "dependencies": { - "Microsoft.Data.SqlClient": "5.1.5", - "Microsoft.EntityFrameworkCore.Relational": "8.0.4" + "Microsoft.Data.SqlClient": "5.1.6", + "Microsoft.EntityFrameworkCore.Relational": "8.0.13", + "System.Formats.Asn1": "8.0.2" } }, "Serilog": { "type": "CentralTransitive", - "requested": "[3.1.1, )", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "+cDryFR0GRhsGOnZSKwaDzRRl4MupvJ42FhCE4zhQRVanX0Jpg6WuCBk59OVhVDPmab1bB+nRykAnykYELA9qQ==" }, "Serilog.Extensions.Logging": { "type": "CentralTransitive", @@ -691,23 +690,23 @@ }, "Serilog.Sinks.Console": { "type": "CentralTransitive", - "requested": "[5.0.1, )", - "resolved": "5.0.1", - "contentHash": "6Jt8jl9y2ey8VV7nVEUAyjjyxjAQuvd5+qj4XYAT9CwcsvR70HHULGBeD+K2WCALFXf7CFsNQT4lON6qXcu2AA==", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==", "dependencies": { - "Serilog": "3.1.1" + "Serilog": "4.0.0" } }, "Swashbuckle.AspNetCore": { "type": "CentralTransitive", - "requested": "[6.5.0, )", - "resolved": "6.5.0", - "contentHash": "FK05XokgjgwlCI6wCT+D4/abtQkL1X1/B9Oas6uIwHFmYrIO9WUD5aLC9IzMs9GnHfUXOtXZ2S43gN1mhs5+aA==", + "requested": "[8.1.4, )", + "resolved": "8.1.4", + "contentHash": "qYk8VHyvs6wML+KXtjyCgS9Aj18mcm0ZtnJeNCTlj/DYQ7A3pfLIztQgLuZS/LEMYsrTo1lSKR3IIZ5/HzVCWA==", "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.Swagger": "8.1.4", + "Swashbuckle.AspNetCore.SwaggerGen": "8.1.4", + "Swashbuckle.AspNetCore.SwaggerUI": "8.1.4" } } }