From b864cc9693111b9d60881a6643e5b16638c15894 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sat, 15 Jun 2024 18:17:21 +0200 Subject: [PATCH 01/17] Refactor and enhance JWT handling and security This commit represents a significant overhaul of the JWT handling and security features within the codebase. Key changes include: - General refactoring for improved readability and maintainability, including updates to comments, variable types, and class names. - Introduction of the `JwtSettings` class, replacing `JwtOptions`, to provide a more flexible configuration setup for JWT handling. - Enhanced null safety with the addition of nullable annotations across various properties. - Creation of the `Genocs.Auth.Options` namespace to centralize authentication-related configurations. - Addition of the `SecurityKeyBuilder` class for generating RSA security keys from XML strings, enhancing security capabilities. - Updates to `JwtHandler` and related classes to work with the new `JwtSettings` class, indicating an overhaul of JWT handling logic. - New features or integrations for authentication, including methods and properties related to OpenID Connect and Firebase authentication. - Code quality improvements through added summaries and better parameter documentation. - Introduction of conditional `ItemGroup` elements in the `.csproj` file to support multiple .NET versions and optimize dependencies. - Configuration and deployment adjustments, including a new `secrets` section in `appsettings.json` and updates in the `README.md` to reflect the library's new focus on security. - Removal of the deprecated `JwtOptions` class and cleanup of outdated comments and code segments. These changes collectively aim to enhance the security features, improve code quality, and ensure compatibility with multiple .NET versions, marking a significant update to the library's authentication and security configurations. --- .../AccessTokenValidatorMiddleware.cs | 21 +++--- src/Genocs.Auth/Builders/JwtOptionsBuilder.cs | 6 +- src/Genocs.Auth/Extensions.cs | 59 +++++++++++++-- src/Genocs.Auth/Handlers/JwtHandler.cs | 7 +- src/Genocs.Auth/IJwtOptionsBuilder.cs | 4 +- .../{JwtOptions.cs => Options/JwtSettings.cs} | 40 +++++----- .../Services/InMemoryAccessTokenService.cs | 8 +- src/Genocs.Core.Demo.WebApi/appsettings.json | 3 + src/Genocs.Security/Genocs.Security.csproj | 13 ++++ src/Genocs.Security/README.md | 63 +++++----------- .../Services/SecurityKeyBuilder.cs | 73 +++++++++++++++++++ 11 files changed, 209 insertions(+), 88 deletions(-) rename src/Genocs.Auth/{JwtOptions.cs => Options/JwtSettings.cs} (50%) create mode 100644 src/Genocs.Security/Services/SecurityKeyBuilder.cs diff --git a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs index 94c54a7b..bf4b93cb 100644 --- a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs +++ b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs @@ -1,11 +1,11 @@ +using Genocs.Auth.Options; using Microsoft.AspNetCore.Http; using System.Net; namespace Genocs.Auth; - /// -/// The access token validator middleware +/// The access token validator middleware. /// public class AccessTokenValidatorMiddleware : IMiddleware { @@ -13,25 +13,26 @@ public class AccessTokenValidatorMiddleware : IMiddleware private readonly IEnumerable _endpoints; /// - /// The AccessTokenValidatorMiddleware constructor + /// The AccessTokenValidatorMiddleware constructor. /// - /// The access token service - /// The options - public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, JwtOptions options) + /// The access token service. + /// The options. + public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, JwtSettings options) { _accessTokenService = accessTokenService; _endpoints = options.AllowAnonymousEndpoints ?? Enumerable.Empty(); } /// - /// The InvokeAsync method + /// The InvokeAsync method. /// - /// The http context - /// The request delegate + /// The http context. + /// The request delegate. /// public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - var path = context.Request.Path.HasValue ? context.Request.Path.Value : string.Empty; + string path = context.Request.Path.HasValue ? context.Request.Path.Value : string.Empty; + if (_endpoints.Contains(path)) { await next(context); diff --git a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs index 0ab9ce28..9ef51792 100644 --- a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs +++ b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs @@ -1,8 +1,10 @@ +using Genocs.Auth.Options; + namespace Genocs.Auth.Builders; internal sealed class JwtOptionsBuilder : IJwtOptionsBuilder { - private readonly JwtOptions _options = new(); + private readonly JwtSettings _options = new(); public IJwtOptionsBuilder WithIssuerSigningKey(string issuerSigningKey) { @@ -46,6 +48,6 @@ public IJwtOptionsBuilder WithValidAudience(string validAudience) return this; } - public JwtOptions Build() + public JwtSettings Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index bd55671a..cd62769c 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -5,10 +5,14 @@ using Microsoft.AspNetCore.Authorization.Policy; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.IdentityModel.Protocols.OpenIdConnect; +using Microsoft.IdentityModel.Protocols; using Microsoft.IdentityModel.Tokens; using System.Security.Cryptography.X509Certificates; using System.Text; +using Genocs.Auth.Options; namespace Genocs.Auth; @@ -17,20 +21,24 @@ public static class Extensions private const string SectionName = "jwt"; private const string RegistryName = "auth"; - public static IGenocsBuilder AddJwt(this IGenocsBuilder builder, string sectionName = SectionName, - Action? optionsFactory = null) + public static IGenocsBuilder AddJwt( + this IGenocsBuilder builder, + string sectionName = SectionName, + Action? optionsFactory = null) { if (string.IsNullOrWhiteSpace(sectionName)) { sectionName = SectionName; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); return builder.AddJwt(options, optionsFactory); } - private static IGenocsBuilder AddJwt(this IGenocsBuilder builder, JwtOptions options, - Action? optionsFactory = null) + private static IGenocsBuilder AddJwt( + this IGenocsBuilder builder, + JwtSettings options, + Action? optionsFactory = null) { if (!builder.TryRegister(RegistryName)) { @@ -74,7 +82,7 @@ private static IGenocsBuilder AddJwt(this IGenocsBuilder builder, JwtOptions opt bool hasCertificate = false; if (options.Certificate is not null) { - X509Certificate2 certificate = null; + X509Certificate2? certificate = null; string password = options.Certificate.Password; bool hasPassword = !string.IsNullOrWhiteSpace(password); if (!string.IsNullOrWhiteSpace(options.Certificate.Location)) @@ -162,6 +170,45 @@ private static IGenocsBuilder AddJwt(this IGenocsBuilder builder, JwtOptions opt return builder; } + /// + /// Enable OpenId Connect Authentication. + /// It can be used with Firebase Authentication. + /// + /// The Genocs builder. + /// The configuration name. Default value is 'FirebaseAuthentication'. + /// The Genocs builder you can use for chain. + public static IGenocsBuilder AddOpenIdJwt( + this IGenocsBuilder builder, + string sectionName = "openIdAuth") + { + + + var jwtSettings = new JwtSettings(); + builder.Configuration.GetSection(sectionName).Bind(jwtSettings); + + // Enable Firebase Authentication + string metadataAddress = $"{jwtSettings.Issuer}{jwtSettings.MetadataAddress}"; + var configurationManager = new ConfigurationManager(metadataAddress, new OpenIdConnectConfigurationRetriever()); + + builder.Services + .AddAuthentication(o => + { + o.DefaultAuthenticateScheme = jwtSettings.Challenge; + o.DefaultChallengeScheme = jwtSettings.Challenge; + o.DefaultScheme = jwtSettings.Challenge; + }) + .AddJwtBearer(o => + { + o.IncludeErrorDetails = jwtSettings.IncludeErrorDetails; + o.RefreshOnIssuerKeyNotFound = jwtSettings.RefreshOnIssuerKeyNotFound; + o.MetadataAddress = metadataAddress; + o.ConfigurationManager = configurationManager; + o.Audience = jwtSettings.Audience; + }); + + return builder; + } + public static IApplicationBuilder UseAccessTokenValidator(this IApplicationBuilder app) => app.UseMiddleware(); } diff --git a/src/Genocs.Auth/Handlers/JwtHandler.cs b/src/Genocs.Auth/Handlers/JwtHandler.cs index c06eae7c..f3ce917b 100644 --- a/src/Genocs.Auth/Handlers/JwtHandler.cs +++ b/src/Genocs.Auth/Handlers/JwtHandler.cs @@ -1,3 +1,4 @@ +using Genocs.Auth.Options; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; @@ -19,12 +20,12 @@ internal sealed class JwtHandler : IJwtHandler }; private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler = new(); - private readonly JwtOptions _options; + private readonly JwtSettings _options; private readonly TokenValidationParameters _tokenValidationParameters; private readonly SigningCredentials _signingCredentials; - private readonly string _issuer; + private readonly string? _issuer; - public JwtHandler(JwtOptions options, TokenValidationParameters tokenValidationParameters) + public JwtHandler(JwtSettings options, TokenValidationParameters tokenValidationParameters) { var issuerSigningKey = tokenValidationParameters.IssuerSigningKey; if (issuerSigningKey is null) diff --git a/src/Genocs.Auth/IJwtOptionsBuilder.cs b/src/Genocs.Auth/IJwtOptionsBuilder.cs index 49e358f5..d3aa7cef 100644 --- a/src/Genocs.Auth/IJwtOptionsBuilder.cs +++ b/src/Genocs.Auth/IJwtOptionsBuilder.cs @@ -1,3 +1,5 @@ +using Genocs.Auth.Options; + namespace Genocs.Auth; public interface IJwtOptionsBuilder @@ -8,5 +10,5 @@ public interface IJwtOptionsBuilder IJwtOptionsBuilder WithLifetimeValidation(bool validateLifetime); IJwtOptionsBuilder WithAudienceValidation(bool validateAudience); IJwtOptionsBuilder WithValidAudience(string validAudience); - JwtOptions Build(); + JwtSettings Build(); } \ No newline at end of file diff --git a/src/Genocs.Auth/JwtOptions.cs b/src/Genocs.Auth/Options/JwtSettings.cs similarity index 50% rename from src/Genocs.Auth/JwtOptions.cs rename to src/Genocs.Auth/Options/JwtSettings.cs index b3f2aaf4..7df2684c 100644 --- a/src/Genocs.Auth/JwtOptions.cs +++ b/src/Genocs.Auth/Options/JwtSettings.cs @@ -1,17 +1,17 @@ -namespace Genocs.Auth; +namespace Genocs.Auth.Options; -public class JwtOptions +public class JwtSettings { public bool AuthenticationDisabled { get; set; } - public IEnumerable AllowAnonymousEndpoints { get; set; } - public CertificateOptions Certificate { get; set; } - public string Algorithm { get; set; } - public string Issuer { get; set; } - public string IssuerSigningKey { get; set; } - public string Authority { get; set; } - public string Audience { get; set; } + public IEnumerable? AllowAnonymousEndpoints { get; set; } + public CertificateOptions? Certificate { get; set; } + public string? Algorithm { get; set; } + public string? Issuer { get; set; } + public string? IssuerSigningKey { get; set; } + public string? Authority { get; set; } + public string? Audience { get; set; } public string Challenge { get; set; } = "Bearer"; - public string MetadataAddress { get; set; } + public string MetadataAddress { get; set; } = "/.well-known/openid-configuration"; public bool SaveToken { get; set; } = true; public bool SaveSigninToken { get; set; } public bool RequireAudience { get; set; } = true; @@ -20,10 +20,10 @@ public class JwtOptions public bool RequireSignedTokens { get; set; } = true; public int ExpiryMinutes { get; set; } public TimeSpan? Expiry { get; set; } - public string ValidAudience { get; set; } - public IEnumerable ValidAudiences { get; set; } - public string ValidIssuer { get; set; } - public IEnumerable ValidIssuers { get; set; } + public string? ValidAudience { get; set; } + public IEnumerable? ValidAudiences { get; set; } + public string? ValidIssuer { get; set; } + public IEnumerable? ValidIssuers { get; set; } public bool ValidateActor { get; set; } public bool ValidateAudience { get; set; } = true; public bool ValidateIssuer { get; set; } = true; @@ -32,14 +32,14 @@ public class JwtOptions public bool ValidateIssuerSigningKey { get; set; } public bool RefreshOnIssuerKeyNotFound { get; set; } = true; public bool IncludeErrorDetails { get; set; } = true; - public string AuthenticationType { get; set; } - public string NameClaimType { get; set; } - public string RoleClaimType { get; set; } + public string? AuthenticationType { get; set; } + public string? NameClaimType { get; set; } + public string? RoleClaimType { get; set; } public class CertificateOptions { - public string Location { get; set; } - public string RawData { get; set; } - public string Password { get; set; } + public string? Location { get; set; } + public string? RawData { get; set; } + public string? Password { get; set; } } } \ No newline at end of file diff --git a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs index 5540ba21..8e95a03f 100644 --- a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs +++ b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs @@ -1,3 +1,4 @@ +using Genocs.Auth.Options; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Primitives; @@ -10,9 +11,10 @@ internal sealed class InMemoryAccessTokenService : IAccessTokenService private readonly IHttpContextAccessor _httpContextAccessor; private readonly TimeSpan _expires; - public InMemoryAccessTokenService(IMemoryCache cache, - IHttpContextAccessor httpContextAccessor, - JwtOptions jwtOptions) + public InMemoryAccessTokenService( + IMemoryCache cache, + IHttpContextAccessor httpContextAccessor, + JwtSettings jwtOptions) { _cache = cache; _httpContextAccessor = httpContextAccessor; diff --git a/src/Genocs.Core.Demo.WebApi/appsettings.json b/src/Genocs.Core.Demo.WebApi/appsettings.json index 2147d6a8..858251f9 100644 --- a/src/Genocs.Core.Demo.WebApi/appsettings.json +++ b/src/Genocs.Core.Demo.WebApi/appsettings.json @@ -68,6 +68,9 @@ "name": "<<>>", "managedIdentityId": "<<>>" }, + "secrets": { + "Secret": "This is a secret coming from the appsettings.json file" + }, "httpClient": { "type": "", "retries": 2, diff --git a/src/Genocs.Security/Genocs.Security.csproj b/src/Genocs.Security/Genocs.Security.csproj index d9149076..ca02962a 100644 --- a/src/Genocs.Security/Genocs.Security.csproj +++ b/src/Genocs.Security/Genocs.Security.csproj @@ -49,4 +49,17 @@ + + + + + + + + + + + + + diff --git a/src/Genocs.Security/README.md b/src/Genocs.Security/README.md index 221b7883..7c093329 100644 --- a/src/Genocs.Security/README.md +++ b/src/Genocs.Security/README.md @@ -1,12 +1,27 @@ -# .NET Core Base library +# Genocs Security library -This package contains a set of base functionalities designed by Genocs. -The libraries can be used on both .NET6 and .NET7. +This package contains the functionalities to be used to handle standard security concerns. +The libraries can be used on .NET6, .NET7, .NET8. ## Description -Core NuGet package contains general purpose functionalities to be used on DDD services. +Following an example of how the key should be. +**WARNING: DO NOT USE IT IN PROD!!!** + +``` xml + + svbEQ96xMdgUpnkDiSaULDbM/HVFLHLc46BdyqwEzIhK+Ml2dqWq/RZIh8kLWmYwpB5gqfOya8Wid3GKIpq7Ke8ciV53qW/1ImOZZPxOtwX1mNzvIEagq80QJoMLphtU1ytPWRXvOjBdGUeTzmdV2kpHNax41n4Uv0QpOPIhzME= + AQAB +

+ + + + + +
" +``` + ## Support @@ -15,45 +30,7 @@ Please check the GitHub repository getting more info. ## Release notes -### [2024-01-23] 5.0.6 +### [2024-06-15] 5.0.6 - Refactory Settings -- Updated nuget packages - -### [2023-11-25] 5.0.5 -- Moved to NET8 - -### [yyyy-mm-dd] 5.0.4 -- - -### [yyyy-mm-dd] 5.0.3 -- - -### [yyyy-mm-dd] 5.0.2 -- - -### [yyyy-mm-dd] 5.0.1 -- - -### [2023-11-25] 5.0.0 -- Moved to NET8 - -### [2023-10-13] 5.0.0-preview.5.0 -- Added [editorconfig](https://editorconfig.org/) -- Added StyleCop -- Updated logo -- Updated readme - -### [2023-03-12] 5.0.0-preview.4.0 -- Implemented MongoDB repository interfaces - -### [2023-03-12] 5.0.0 -- New Architecture - -### [2023-03-12] 3.1.0 -- Added Builders -### [2023-03-12] 3.0.0 -- Refactory to implement CQRS pattern -### [2023-03-04] 2.4.1 -- Updated System.Text.Json diff --git a/src/Genocs.Security/Services/SecurityKeyBuilder.cs b/src/Genocs.Security/Services/SecurityKeyBuilder.cs new file mode 100644 index 00000000..51634446 --- /dev/null +++ b/src/Genocs.Security/Services/SecurityKeyBuilder.cs @@ -0,0 +1,73 @@ +using Microsoft.IdentityModel.Tokens; +using System.Security.Cryptography; +using System.Xml; + +namespace Genocs.Security.Services; + +public static class SecurityKeyBuilder +{ + /// + /// Create a new instance of using the provided secret. + /// + /// The secret key as xml string. + /// The created RSA. + + public static SecurityKey CreateRsaSecurityKey(string secret) + { + RSA rsa = RSA.Create(); + rsa = FromCustomXmlString(rsa, secret); + return new RsaSecurityKey(rsa); + } + + /// + /// Helper method to create a RSA instance from a custom XML string. + /// + /// The RSA object instance. + /// The secret key as xml string. + /// The created RSA. + /// In case the secret key is invalid xml. + private static RSA FromCustomXmlString(RSA rsa, string xmlKey) + { + RSAParameters parameters = default(RSAParameters); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(xmlKey); + if (xmlDocument.DocumentElement != null && xmlDocument.DocumentElement!.Name.Equals("RSAKeyValue")) + { + foreach (XmlNode childNode in xmlDocument.DocumentElement!.ChildNodes) + { + switch (childNode.Name) + { + case "Modulus": + parameters.Modulus = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "Exponent": + parameters.Exponent = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "P": + parameters.P = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "Q": + parameters.Q = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "DP": + parameters.DP = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "DQ": + parameters.DQ = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "InverseQ": + parameters.InverseQ = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + case "D": + parameters.D = string.IsNullOrEmpty(childNode.InnerText) ? null : Convert.FromBase64String(childNode.InnerText); + break; + } + } + + rsa.ImportParameters(parameters); + return rsa; + } + + throw new Exception("Invalid XML RSA key."); + } +} \ No newline at end of file From 736964d22cb1715c3c1b0455647077a5797c99ad Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sat, 15 Jun 2024 18:51:34 +0200 Subject: [PATCH 02/17] Refactor and enhance JWT handling and security --- .env | 2 +- .github/workflows/dockerhub-publish.yml | 2 +- .github/workflows/nuget-publish.yml | 2 +- src/Genocs.Auth/Genocs.Auth.csproj | 4 +-- src/Genocs.Auth/README.md | 4 +++ src/Genocs.Common/Genocs.Common.csproj | 2 +- .../Genocs.Core.Demo.Contracts.csproj | 2 +- .../Genocs.Core.Demo.Domain.csproj | 4 +-- .../Genocs.Core.Demo.WebApi.csproj | 14 ++++---- .../Genocs.Core.Demo.Worker.csproj | 6 ++-- src/Genocs.Core/Genocs.Core.csproj | 4 +-- .../Genocs.Discovery.Consul.csproj | 6 ++-- .../Genocs.HTTP.RestEase.csproj | 10 +++--- src/Genocs.HTTP/Genocs.HTTP.csproj | 4 +-- .../Genocs.LoadBalancing.Fabio.csproj | 8 ++--- src/Genocs.Logging/Genocs.Logging.csproj | 4 +-- ...enocs.MessageBrokers.Outbox.MongoDB.csproj | 6 ++-- .../Genocs.MessageBrokers.Outbox.csproj | 4 +-- .../Genocs.MessageBrokers.RabbitMQ.csproj | 4 +-- .../Genocs.MessageBrokers.csproj | 4 +-- src/Genocs.Metrics/Genocs.Metrics.csproj | 4 +-- .../Genocs.Monitoring.csproj | 8 ++--- ...enocs.Persistence.MongoDB.UnitTests.csproj | 2 +- .../Genocs.Persistence.MongoDb.csproj | 4 +-- .../Genocs.Persistence.Redis.csproj | 4 +-- .../Genocs.QueryBuilder.UnitTests.csproj | 4 +-- .../Genocs.QueryBuilder.csproj | 2 +- .../Genocs.Secrets.AzureKeyVault.csproj | 4 +-- .../Genocs.Secrets.Vault.csproj | 4 +-- src/Genocs.Security/Genocs.Security.csproj | 4 +-- .../Genocs.ServiceBusAzure.csproj | 4 +-- .../Genocs.Tracing.Jaeger.RabbitMQ.csproj | 6 ++-- src/Genocs.Tracing/Genocs.Tracing.csproj | 8 ++--- .../Genocs.WebApi.CQRS.csproj | 6 ++-- .../Genocs.WebApi.Security.csproj | 4 +-- .../Genocs.WebApi.Swagger.csproj | 4 +-- src/Genocs.WebApi/Genocs.WebApi.csproj | 4 +-- .../Genocs.APIGateway.csproj | 12 +++---- .../Genocs.Identities.Application.csproj | 20 +++++------ .../Genocs.Orders.WebApi.csproj | 22 ++++++------ .../Genocs.Products.WebApi.csproj | 32 ++++++++--------- .../Genocs.SignalR.WebApi.csproj | 34 +++++++++---------- 42 files changed, 148 insertions(+), 144 deletions(-) diff --git a/.env b/.env index 0a57f1b7..d6d68734 100644 --- a/.env +++ b/.env @@ -7,4 +7,4 @@ PROJECT_EXTERNAL_DNS_NAME_OR_IP=localhost # The docker image version -DOCKER_IMAGE_TAG=5.0.0 +DOCKER_IMAGE_TAG=6.0.0 diff --git a/.github/workflows/dockerhub-publish.yml b/.github/workflows/dockerhub-publish.yml index 4566a8fc..2b635ced 100644 --- a/.github/workflows/dockerhub-publish.yml +++ b/.github/workflows/dockerhub-publish.yml @@ -13,7 +13,7 @@ on: description: "Image Version" # Default value if no value is explicitly provided - default: "5.0.0" + default: "6.0.0" # Input has to be provided for the workflow to run required: true diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index b1b9bb80..852c23c5 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -13,7 +13,7 @@ on: description: "Packages Version" # Default value if no value is explicitly provided - default: "5.0.0" + default: "6.0.0" # Input has to be provided for the workflow to run required: true diff --git a/src/Genocs.Auth/Genocs.Auth.csproj b/src/Genocs.Auth/Genocs.Auth.csproj index 301e0e21..163a9497 100644 --- a/src/Genocs.Auth/Genocs.Auth.csproj +++ b/src/Genocs.Auth/Genocs.Auth.csproj @@ -9,7 +9,7 @@ The authorization library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.Auth/README.md b/src/Genocs.Auth/README.md index bb642339..29459bfd 100644 --- a/src/Genocs.Auth/README.md +++ b/src/Genocs.Auth/README.md @@ -37,6 +37,10 @@ Following are the project settings needed to enable monitoring ## Release notes +### [2024-06-15] 6.0.0 +- Added support for Azure Key Vault +- Unified settings + ### [2024-01-23] 5.0.6 - Refactory Settings - Updated nuget packages diff --git a/src/Genocs.Common/Genocs.Common.csproj b/src/Genocs.Common/Genocs.Common.csproj index 0ae4fc34..2ab02e42 100644 --- a/src/Genocs.Common/Genocs.Common.csproj +++ b/src/Genocs.Common/Genocs.Common.csproj @@ -9,7 +9,7 @@ The common components to build .NET Core projects along with Genocs Library. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs diff --git a/src/Genocs.Core.Demo.Contracts/Genocs.Core.Demo.Contracts.csproj b/src/Genocs.Core.Demo.Contracts/Genocs.Core.Demo.Contracts.csproj index 2448a384..d001a674 100644 --- a/src/Genocs.Core.Demo.Contracts/Genocs.Core.Demo.Contracts.csproj +++ b/src/Genocs.Core.Demo.Contracts/Genocs.Core.Demo.Contracts.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Genocs.Core.Demo.Domain/Genocs.Core.Demo.Domain.csproj b/src/Genocs.Core.Demo.Domain/Genocs.Core.Demo.Domain.csproj index 51e0d7f3..f5b7f799 100644 --- a/src/Genocs.Core.Demo.Domain/Genocs.Core.Demo.Domain.csproj +++ b/src/Genocs.Core.Demo.Domain/Genocs.Core.Demo.Domain.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj index ad381117..40ab948e 100644 --- a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj +++ b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj @@ -20,13 +20,13 @@ - - - - - - - + + + + + + + diff --git a/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj b/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj index 397b8065..71210be0 100644 --- a/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj +++ b/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj @@ -16,9 +16,9 @@ - - - + + + diff --git a/src/Genocs.Core/Genocs.Core.csproj b/src/Genocs.Core/Genocs.Core.csproj index 42fbdfc5..7613dec3 100644 --- a/src/Genocs.Core/Genocs.Core.csproj +++ b/src/Genocs.Core/Genocs.Core.csproj @@ -9,7 +9,7 @@ The core components to build .NET Core projects along with Genocs Library. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj b/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj index 89e6fd98..a488d839 100644 --- a/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj +++ b/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj @@ -9,7 +9,7 @@ The service discovery by Consul library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -48,8 +48,8 @@ - - + + diff --git a/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj b/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj index 41f78a71..d0424313 100644 --- a/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj +++ b/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj @@ -9,7 +9,7 @@ The http support library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -50,10 +50,10 @@ - - - - + + + + diff --git a/src/Genocs.HTTP/Genocs.HTTP.csproj b/src/Genocs.HTTP/Genocs.HTTP.csproj index e1dacf30..8179ec30 100644 --- a/src/Genocs.HTTP/Genocs.HTTP.csproj +++ b/src/Genocs.HTTP/Genocs.HTTP.csproj @@ -9,7 +9,7 @@ The http support library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj b/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj index c2ba5fcd..fcb8230f 100644 --- a/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj +++ b/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj @@ -9,7 +9,7 @@ The load balacer based on Fabio library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -49,9 +49,9 @@ - - - + + + diff --git a/src/Genocs.Logging/Genocs.Logging.csproj b/src/Genocs.Logging/Genocs.Logging.csproj index 1f67fec2..7e4d7cea 100644 --- a/src/Genocs.Logging/Genocs.Logging.csproj +++ b/src/Genocs.Logging/Genocs.Logging.csproj @@ -9,7 +9,7 @@ The logging library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj b/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj index 63769706..b35fe693 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj @@ -9,7 +9,7 @@ The message brokers MongoDB outbox interface library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -47,8 +47,8 @@ - - + + diff --git a/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj b/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj index 07edad63..67133bd3 100644 --- a/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj +++ b/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj @@ -9,7 +9,7 @@ The message brokers outbox interface library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj b/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj index 5d195cdc..66f4cceb 100644 --- a/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj +++ b/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj @@ -9,7 +9,7 @@ The message brokers RabbitMQ outbox interface library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj b/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj index d40a6c53..08feee1d 100644 --- a/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj +++ b/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj @@ -9,7 +9,7 @@ The message brokers interface library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -47,7 +47,7 @@ - + diff --git a/src/Genocs.Metrics/Genocs.Metrics.csproj b/src/Genocs.Metrics/Genocs.Metrics.csproj index 57f0f9bb..9916ef03 100644 --- a/src/Genocs.Metrics/Genocs.Metrics.csproj +++ b/src/Genocs.Metrics/Genocs.Metrics.csproj @@ -9,7 +9,7 @@ The metrics interface library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.Monitoring/Genocs.Monitoring.csproj b/src/Genocs.Monitoring/Genocs.Monitoring.csproj index d4a1c0b4..2a945cb1 100644 --- a/src/Genocs.Monitoring/Genocs.Monitoring.csproj +++ b/src/Genocs.Monitoring/Genocs.Monitoring.csproj @@ -9,7 +9,7 @@ Telemetry and Tracing library. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -49,9 +49,9 @@ - - - + + + diff --git a/src/Genocs.Persistence.MongoDb.UnitTests/Genocs.Persistence.MongoDB.UnitTests.csproj b/src/Genocs.Persistence.MongoDb.UnitTests/Genocs.Persistence.MongoDB.UnitTests.csproj index c7880590..71219a19 100644 --- a/src/Genocs.Persistence.MongoDb.UnitTests/Genocs.Persistence.MongoDB.UnitTests.csproj +++ b/src/Genocs.Persistence.MongoDb.UnitTests/Genocs.Persistence.MongoDB.UnitTests.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj b/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj index 021c5b2e..eb912ede 100644 --- a/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj +++ b/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj @@ -9,7 +9,7 @@ The Genocs Library .NET Core to be used with MongoDB as persistence datalayer.. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj b/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj index cb7c877b..5c0474e4 100644 --- a/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj +++ b/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj @@ -9,7 +9,7 @@ The library containing base repository pattern to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj b/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj index e4ff69ae..59c8adcc 100644 --- a/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj +++ b/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj @@ -32,8 +32,8 @@ - - + + diff --git a/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj b/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj index 541174a7..e4064be1 100644 --- a/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj +++ b/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj @@ -9,7 +9,7 @@ The persistence agnostic query builder library. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs diff --git a/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj b/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj index e5a7a124..0fcc66fa 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj +++ b/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj @@ -9,7 +9,7 @@ The Genocs Secrets AzureKeyVault library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj b/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj index d70d81f6..db18b217 100644 --- a/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj +++ b/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj @@ -9,7 +9,7 @@ The Genocs Secrets Vault library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.Security/Genocs.Security.csproj b/src/Genocs.Security/Genocs.Security.csproj index ca02962a..3d20591b 100644 --- a/src/Genocs.Security/Genocs.Security.csproj +++ b/src/Genocs.Security/Genocs.Security.csproj @@ -9,7 +9,7 @@ The Genocs Security library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj b/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj index ff1e0031..9dea0d80 100644 --- a/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj +++ b/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj @@ -9,7 +9,7 @@ The low level library to use Azure Service Bus. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -47,7 +47,7 @@ - + diff --git a/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj b/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj index 420baf36..a2b2c3ff 100644 --- a/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj +++ b/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj @@ -9,7 +9,7 @@ The load balacer based on Fabio library useful to build .NET Core projects. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -47,8 +47,8 @@ - - + + diff --git a/src/Genocs.Tracing/Genocs.Tracing.csproj b/src/Genocs.Tracing/Genocs.Tracing.csproj index 5932b2b9..10143fd3 100644 --- a/src/Genocs.Tracing/Genocs.Tracing.csproj +++ b/src/Genocs.Tracing/Genocs.Tracing.csproj @@ -9,7 +9,7 @@ The tracing library to use Azure Service Bus. 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -48,9 +48,9 @@ - - - + + + diff --git a/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj b/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj index a1144df4..c985d721 100644 --- a/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj +++ b/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj @@ -9,7 +9,7 @@ The web api CORS library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -47,7 +47,7 @@ - - + + diff --git a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj index 06635225..6b36bd67 100644 --- a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj +++ b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj @@ -9,7 +9,7 @@ The web api Security library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj b/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj index 5c9b030e..1bf96a4b 100644 --- a/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj +++ b/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj @@ -9,7 +9,7 @@ The web api Swagger library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -46,7 +46,7 @@ - + diff --git a/src/Genocs.WebApi/Genocs.WebApi.csproj b/src/Genocs.WebApi/Genocs.WebApi.csproj index 7f8c6cec..ededa441 100644 --- a/src/Genocs.WebApi/Genocs.WebApi.csproj +++ b/src/Genocs.WebApi/Genocs.WebApi.csproj @@ -9,7 +9,7 @@ The web api library 10.0 true - 5.0.0 + 6.0.0 5.0.0 Nocco Giovanni Emanuele Genocs @@ -47,7 +47,7 @@ - + diff --git a/src/apps/api-gateway/Genocs.APIGateway/Genocs.APIGateway.csproj b/src/apps/api-gateway/Genocs.APIGateway/Genocs.APIGateway.csproj index f68c444d..530f5ee8 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Genocs.APIGateway.csproj +++ b/src/apps/api-gateway/Genocs.APIGateway/Genocs.APIGateway.csproj @@ -19,12 +19,12 @@ - - - - - - + + + + + + diff --git a/src/apps/identity/Genocs.Identities.Application/Genocs.Identities.Application.csproj b/src/apps/identity/Genocs.Identities.Application/Genocs.Identities.Application.csproj index 2370404a..782eb9a7 100644 --- a/src/apps/identity/Genocs.Identities.Application/Genocs.Identities.Application.csproj +++ b/src/apps/identity/Genocs.Identities.Application/Genocs.Identities.Application.csproj @@ -20,16 +20,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/src/apps/orders/Genocs.Orders.WebApi/Genocs.Orders.WebApi.csproj b/src/apps/orders/Genocs.Orders.WebApi/Genocs.Orders.WebApi.csproj index 274707a7..3655f8d5 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Genocs.Orders.WebApi.csproj +++ b/src/apps/orders/Genocs.Orders.WebApi/Genocs.Orders.WebApi.csproj @@ -29,17 +29,17 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/apps/products/Genocs.Products.WebApi/Genocs.Products.WebApi.csproj b/src/apps/products/Genocs.Products.WebApi/Genocs.Products.WebApi.csproj index c721f991..d567ae87 100644 --- a/src/apps/products/Genocs.Products.WebApi/Genocs.Products.WebApi.csproj +++ b/src/apps/products/Genocs.Products.WebApi/Genocs.Products.WebApi.csproj @@ -30,22 +30,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj b/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj index 1a810ccc..0c94f416 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj @@ -34,23 +34,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file From bb5ea5989bdbe0bfa756e3b00b1a15a3e12f3942 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Tue, 18 Jun 2024 17:47:04 +0200 Subject: [PATCH 03/17] Refactor auth/config handling and enhance security - Introduced namespaces `Genocs.Auth.Options` and `Genocs.Security.Services` for better organization. - Replaced hardcoded "jwt" with `JwtSettings.Position` for dynamic JWT config. - Renamed `options` to `jwtSettings` in methods for clarity. - Updated token validation to use `jwtSettings`, improving readability. - Enhanced certificate loading using `jwtSettings`. - Added `AddPrivateKeyJwt` method for private key JWT auth support. - Included `Genocs.Security` project reference in `Genocs.Auth.csproj`. - Modified `JwtSettings` and adjusted default section names in configs. - Cleaned up code, standardized method signatures, and updated documentation. - Replaced `MessagingOptions` with `MessagingSettings` and updated usage. - Managed project references and package dependencies for `Genocs.Security`. - Introduced `BaseAggregate` class for common entity properties. - Made minor adjustments for code quality improvements. --- .../azure-pipeline.yml | 0 src/Genocs.Auth/Extensions.cs | 164 ++++++++++++------ src/Genocs.Auth/Genocs.Auth.csproj | 3 + src/Genocs.Auth/Options/JwtSettings.cs | 14 +- src/Genocs.Common/Options/AppSettings.cs | 2 +- .../Aggregates/BaseAggregate.cs | 14 ++ .../Options/SecretSettings.cs | 9 +- src/Genocs.Core.Demo.WebApi/appsettings.json | 23 +-- src/Genocs.Core/CQRS/Commons/IDispatcher.cs | 2 +- .../Services/SecurityKeyBuilder.cs | 1 - .../Middlewares/PublicContractsMiddleware.cs | 4 +- src/Genocs.WebApi/Options/WebApiSettings.cs | 2 +- src/Genocs.WebApi/Parsers/JsonParser.cs | 2 +- .../Framework/CorrelationContextBuilder.cs | 8 +- .../Framework/ICorrelationContextBuilder.cs | 8 +- .../Framework/MessagingMiddleware.cs | 15 +- .../Framework/MessagingOptions.cs | 15 -- .../Options/MessagingSettings.cs | 15 ++ .../api-gateway/Genocs.APIGateway/Startup.cs | 3 +- .../Genocs.SignalR.WebApi.csproj | 1 - 20 files changed, 198 insertions(+), 107 deletions(-) rename azure-pipeline.yml => azure/azure-pipeline.yml (100%) create mode 100644 src/Genocs.Core.Demo.Domain/Aggregates/BaseAggregate.cs delete mode 100644 src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingOptions.cs create mode 100644 src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs diff --git a/azure-pipeline.yml b/azure/azure-pipeline.yml similarity index 100% rename from azure-pipeline.yml rename to azure/azure-pipeline.yml diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index cd62769c..4f74c0dc 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -1,34 +1,34 @@ using Genocs.Auth.Handlers; +using Genocs.Auth.Options; using Genocs.Auth.Services; using Genocs.Core.Builders; +using Genocs.Security.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization.Policy; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.IdentityModel.Protocols.OpenIdConnect; using Microsoft.IdentityModel.Protocols; +using Microsoft.IdentityModel.Protocols.OpenIdConnect; using Microsoft.IdentityModel.Tokens; using System.Security.Cryptography.X509Certificates; using System.Text; -using Genocs.Auth.Options; namespace Genocs.Auth; public static class Extensions { - private const string SectionName = "jwt"; private const string RegistryName = "auth"; public static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - string sectionName = SectionName, + string sectionName = JwtSettings.Position, Action? optionsFactory = null) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = SectionName; + sectionName = JwtSettings.Position; } var options = builder.GetOptions(sectionName); @@ -37,7 +37,7 @@ public static IGenocsBuilder AddJwt( private static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - JwtSettings options, + JwtSettings jwtSettings, Action? optionsFactory = null) { if (!builder.TryRegister(RegistryName)) @@ -50,53 +50,53 @@ private static IGenocsBuilder AddJwt( builder.Services.AddSingleton(); builder.Services.AddTransient(); - if (options.AuthenticationDisabled) + if (!jwtSettings.Enabled) { builder.Services.AddSingleton(); } var tokenValidationParameters = new TokenValidationParameters { - RequireAudience = options.RequireAudience, - ValidIssuer = options.ValidIssuer, - ValidIssuers = options.ValidIssuers, - ValidateActor = options.ValidateActor, - ValidAudience = options.ValidAudience, - ValidAudiences = options.ValidAudiences, - ValidateAudience = options.ValidateAudience, - ValidateIssuer = options.ValidateIssuer, - ValidateLifetime = options.ValidateLifetime, - ValidateTokenReplay = options.ValidateTokenReplay, - ValidateIssuerSigningKey = options.ValidateIssuerSigningKey, - SaveSigninToken = options.SaveSigninToken, - RequireExpirationTime = options.RequireExpirationTime, - RequireSignedTokens = options.RequireSignedTokens, + RequireAudience = jwtSettings.RequireAudience, + ValidIssuer = jwtSettings.ValidIssuer, + ValidIssuers = jwtSettings.ValidIssuers, + ValidateActor = jwtSettings.ValidateActor, + ValidAudience = jwtSettings.ValidAudience, + ValidAudiences = jwtSettings.ValidAudiences, + ValidateAudience = jwtSettings.ValidateAudience, + ValidateIssuer = jwtSettings.ValidateIssuer, + ValidateLifetime = jwtSettings.ValidateLifetime, + ValidateTokenReplay = jwtSettings.ValidateTokenReplay, + ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey, + SaveSigninToken = jwtSettings.SaveSigninToken, + RequireExpirationTime = jwtSettings.RequireExpirationTime, + RequireSignedTokens = jwtSettings.RequireSignedTokens, ClockSkew = TimeSpan.Zero }; - if (!string.IsNullOrWhiteSpace(options.AuthenticationType)) + if (!string.IsNullOrWhiteSpace(jwtSettings.AuthenticationType)) { - tokenValidationParameters.AuthenticationType = options.AuthenticationType; + tokenValidationParameters.AuthenticationType = jwtSettings.AuthenticationType; } bool hasCertificate = false; - if (options.Certificate is not null) + if (jwtSettings.Certificate is not null) { X509Certificate2? certificate = null; - string password = options.Certificate.Password; + string password = jwtSettings.Certificate.Password; bool hasPassword = !string.IsNullOrWhiteSpace(password); - if (!string.IsNullOrWhiteSpace(options.Certificate.Location)) + if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.Location)) { certificate = hasPassword - ? new X509Certificate2(options.Certificate.Location, password) - : new X509Certificate2(options.Certificate.Location); + ? new X509Certificate2(jwtSettings.Certificate.Location, password) + : new X509Certificate2(jwtSettings.Certificate.Location); string keyType = certificate.HasPrivateKey ? "with private key" : "with public key only"; - Console.WriteLine($"Loaded X.509 certificate from location: '{options.Certificate.Location}' {keyType}."); + Console.WriteLine($"Loaded X.509 certificate from location: '{jwtSettings.Certificate.Location}' {keyType}."); } - if (!string.IsNullOrWhiteSpace(options.Certificate.RawData)) + if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.RawData)) { - byte[] rawData = Convert.FromBase64String(options.Certificate.RawData); + byte[] rawData = Convert.FromBase64String(jwtSettings.Certificate.RawData); certificate = hasPassword ? new X509Certificate2(rawData, password) : new X509Certificate2(rawData); @@ -106,9 +106,9 @@ private static IGenocsBuilder AddJwt( if (certificate is not null) { - if (string.IsNullOrWhiteSpace(options.Algorithm)) + if (string.IsNullOrWhiteSpace(jwtSettings.Algorithm)) { - options.Algorithm = SecurityAlgorithms.RsaSha256; + jwtSettings.Algorithm = SecurityAlgorithms.RsaSha256; } hasCertificate = true; @@ -118,53 +118,54 @@ private static IGenocsBuilder AddJwt( } } - if (!string.IsNullOrWhiteSpace(options.IssuerSigningKey) && !hasCertificate) + if (!string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey) && !hasCertificate) { - if (string.IsNullOrWhiteSpace(options.Algorithm) || hasCertificate) + if (string.IsNullOrWhiteSpace(jwtSettings.Algorithm) || hasCertificate) { - options.Algorithm = SecurityAlgorithms.HmacSha256; + jwtSettings.Algorithm = SecurityAlgorithms.HmacSha256; } - byte[] rawKey = Encoding.UTF8.GetBytes(options.IssuerSigningKey); + byte[] rawKey = Encoding.UTF8.GetBytes(jwtSettings.IssuerSigningKey); tokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(rawKey); Console.WriteLine("Using symmetric encryption for issuing tokens."); } - if (!string.IsNullOrWhiteSpace(options.NameClaimType)) + if (!string.IsNullOrWhiteSpace(jwtSettings.NameClaimType)) { - tokenValidationParameters.NameClaimType = options.NameClaimType; + tokenValidationParameters.NameClaimType = jwtSettings.NameClaimType; } - if (!string.IsNullOrWhiteSpace(options.RoleClaimType)) + if (!string.IsNullOrWhiteSpace(jwtSettings.RoleClaimType)) { - tokenValidationParameters.RoleClaimType = options.RoleClaimType; + tokenValidationParameters.RoleClaimType = jwtSettings.RoleClaimType; } builder.Services .AddAuthentication(o => { - o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + o.DefaultAuthenticateScheme = jwtSettings.Challenge; + o.DefaultChallengeScheme = jwtSettings.Challenge; + o.DefaultScheme = jwtSettings.Challenge; }) .AddJwtBearer(o => { - o.Authority = options.Authority; - o.Audience = options.Audience; - o.MetadataAddress = options.MetadataAddress; - o.SaveToken = options.SaveToken; - o.RefreshOnIssuerKeyNotFound = options.RefreshOnIssuerKeyNotFound; - o.RequireHttpsMetadata = options.RequireHttpsMetadata; - o.IncludeErrorDetails = options.IncludeErrorDetails; + o.Authority = jwtSettings.Authority; + o.Audience = jwtSettings.Audience; + o.MetadataAddress = jwtSettings.MetadataAddress; + o.SaveToken = jwtSettings.SaveToken; + o.RefreshOnIssuerKeyNotFound = jwtSettings.RefreshOnIssuerKeyNotFound; + o.RequireHttpsMetadata = jwtSettings.RequireHttpsMetadata; + o.IncludeErrorDetails = jwtSettings.IncludeErrorDetails; o.TokenValidationParameters = tokenValidationParameters; - if (!string.IsNullOrWhiteSpace(options.Challenge)) + if (!string.IsNullOrWhiteSpace(jwtSettings.Challenge)) { - o.Challenge = options.Challenge; + o.Challenge = jwtSettings.Challenge; } optionsFactory?.Invoke(o); }); - builder.Services.AddSingleton(options); + builder.Services.AddSingleton(jwtSettings); builder.Services.AddSingleton(tokenValidationParameters); return builder; @@ -175,18 +176,16 @@ private static IGenocsBuilder AddJwt( /// It can be used with Firebase Authentication. /// /// The Genocs builder. - /// The configuration name. Default value is 'FirebaseAuthentication'. + /// The configuration section name. /// The Genocs builder you can use for chain. public static IGenocsBuilder AddOpenIdJwt( this IGenocsBuilder builder, - string sectionName = "openIdAuth") + string sectionName = JwtSettings.Position) { - var jwtSettings = new JwtSettings(); builder.Configuration.GetSection(sectionName).Bind(jwtSettings); - // Enable Firebase Authentication string metadataAddress = $"{jwtSettings.Issuer}{jwtSettings.MetadataAddress}"; var configurationManager = new ConfigurationManager(metadataAddress, new OpenIdConnectConfigurationRetriever()); @@ -209,6 +208,57 @@ public static IGenocsBuilder AddOpenIdJwt( return builder; } + + /// + /// It adds the private key JWT authentication. + /// + /// The Genocs builder. + /// The optional section name. Default name: 'jwt'. + /// The Genocs builder you can use for chaining. + /// Whenever mandatory data like 'IssuerSigningKey' is missing. + public static IGenocsBuilder AddPrivateKeyJwt( + this IGenocsBuilder builder, + string sectionName = JwtSettings.Position) + { + if (string.IsNullOrWhiteSpace(sectionName)) + { + sectionName = JwtSettings.Position; + } + + var jwtSettings = new JwtSettings(); + builder.Configuration.GetSection(sectionName).Bind(jwtSettings); + + if (string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey)) + { + throw new InvalidOperationException("Issuer signing key is missing."); + } + + SecurityKey signingKey = SecurityKeyBuilder.CreateRsaSecurityKey(jwtSettings.IssuerSigningKey); + + builder.Services + .AddAuthentication(o => + { + o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddJwtBearer(o => + { + o.SaveToken = jwtSettings.SaveToken; + o.RequireHttpsMetadata = jwtSettings.RequireHttpsMetadata; + o.TokenValidationParameters = new TokenValidationParameters() + { + IssuerSigningKey = signingKey, + ValidateAudience = jwtSettings.ValidateAudience, + ValidAudience = jwtSettings.ValidAudience, + ValidateIssuer = jwtSettings.ValidateIssuer, + ValidIssuer = jwtSettings.ValidIssuer, + ValidateLifetime = jwtSettings.ValidateLifetime, + ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey + }; + }); + + return builder; + } + public static IApplicationBuilder UseAccessTokenValidator(this IApplicationBuilder app) => app.UseMiddleware(); } diff --git a/src/Genocs.Auth/Genocs.Auth.csproj b/src/Genocs.Auth/Genocs.Auth.csproj index 163a9497..ce0c8e54 100644 --- a/src/Genocs.Auth/Genocs.Auth.csproj +++ b/src/Genocs.Auth/Genocs.Auth.csproj @@ -43,10 +43,13 @@ + + + diff --git a/src/Genocs.Auth/Options/JwtSettings.cs b/src/Genocs.Auth/Options/JwtSettings.cs index 7df2684c..08dfb6de 100644 --- a/src/Genocs.Auth/Options/JwtSettings.cs +++ b/src/Genocs.Auth/Options/JwtSettings.cs @@ -2,7 +2,15 @@ namespace Genocs.Auth.Options; public class JwtSettings { - public bool AuthenticationDisabled { get; set; } + /// + /// Default section name. + /// + public const string Position = "jwt"; + + /// + /// It is used to enable or disable the authentication. + /// + public bool Enabled { get; set; } public IEnumerable? AllowAnonymousEndpoints { get; set; } public CertificateOptions? Certificate { get; set; } public string? Algorithm { get; set; } @@ -10,6 +18,10 @@ public class JwtSettings public string? IssuerSigningKey { get; set; } public string? Authority { get; set; } public string? Audience { get; set; } + + /// + /// This is the Authentication Scheme name. + /// public string Challenge { get; set; } = "Bearer"; public string MetadataAddress { get; set; } = "/.well-known/openid-configuration"; public bool SaveToken { get; set; } = true; diff --git a/src/Genocs.Common/Options/AppSettings.cs b/src/Genocs.Common/Options/AppSettings.cs index 94ac5643..3af8f1ef 100644 --- a/src/Genocs.Common/Options/AppSettings.cs +++ b/src/Genocs.Common/Options/AppSettings.cs @@ -8,7 +8,7 @@ public class AppSettings /// /// Default section name. /// - public const string Position = "App"; + public const string Position = "app"; /// /// Application name. diff --git a/src/Genocs.Core.Demo.Domain/Aggregates/BaseAggregate.cs b/src/Genocs.Core.Demo.Domain/Aggregates/BaseAggregate.cs new file mode 100644 index 00000000..e074b90e --- /dev/null +++ b/src/Genocs.Core.Demo.Domain/Aggregates/BaseAggregate.cs @@ -0,0 +1,14 @@ +using Genocs.Core.Domain.Entities; +using Genocs.Core.Domain.Entities.Auditing; +using Genocs.Persistence.MongoDb.Repositories.Clean; +using MongoDB.Bson; + +namespace Genocs.Core.Demo.Domain.Aggregates; + +/// +/// Base aggregate class used for all entities. +/// +public class BaseAggregate : AggregateRoot, IMongoDbEntity, IHasCreationTime +{ + public DateTime CreationTime { get; set; } = DateTime.UtcNow; +} \ No newline at end of file diff --git a/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs b/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs index 62de4357..08d05a8a 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs @@ -2,8 +2,15 @@ public class SecretSettings { - public const string Position = "Secrets"; + /// + /// Default section name. + /// + public const string Position = "secrets"; + + /// + /// This is an example of a secret. That should be stored in a secure way. + /// public string? Secret { get; set; } } diff --git a/src/Genocs.Core.Demo.WebApi/appsettings.json b/src/Genocs.Core.Demo.WebApi/appsettings.json index 858251f9..750cbaac 100644 --- a/src/Genocs.Core.Demo.WebApi/appsettings.json +++ b/src/Genocs.Core.Demo.WebApi/appsettings.json @@ -1,18 +1,11 @@ { - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Information", - "Microsoft": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*", - "ConnectionStrings": { - "ApplicationInsights": "" - }, - "AppSettings": { - "ServiceName": "Demo-WebApi" + "app": { + "name": "Demo WebApi", + "service": "Demo WebApi", + "instance": "1", + "version": "v1.0", + "displayBanner": true, + "displayVersion": true }, "RabbitMQ": { "HostName": "localhost", @@ -69,7 +62,7 @@ "managedIdentityId": "<<>>" }, "secrets": { - "Secret": "This is a secret coming from the appsettings.json file" + "Secret": "This is a secret coming from the appsettings.json file" }, "httpClient": { "type": "", diff --git a/src/Genocs.Core/CQRS/Commons/IDispatcher.cs b/src/Genocs.Core/CQRS/Commons/IDispatcher.cs index cca50975..4df4070f 100644 --- a/src/Genocs.Core/CQRS/Commons/IDispatcher.cs +++ b/src/Genocs.Core/CQRS/Commons/IDispatcher.cs @@ -20,7 +20,7 @@ Task SendAsync(T command, CancellationToken cancellationToken = default) where T : class, ICommand; /// - /// Generic event publisher + /// Generic event publisher. /// /// /// diff --git a/src/Genocs.Security/Services/SecurityKeyBuilder.cs b/src/Genocs.Security/Services/SecurityKeyBuilder.cs index 51634446..70036a21 100644 --- a/src/Genocs.Security/Services/SecurityKeyBuilder.cs +++ b/src/Genocs.Security/Services/SecurityKeyBuilder.cs @@ -11,7 +11,6 @@ public static class SecurityKeyBuilder /// /// The secret key as xml string. /// The created RSA. - public static SecurityKey CreateRsaSecurityKey(string secret) { RSA rsa = RSA.Create(); diff --git a/src/Genocs.WebApi.CQRS/Middlewares/PublicContractsMiddleware.cs b/src/Genocs.WebApi.CQRS/Middlewares/PublicContractsMiddleware.cs index ace00b60..555198a0 100644 --- a/src/Genocs.WebApi.CQRS/Middlewares/PublicContractsMiddleware.cs +++ b/src/Genocs.WebApi.CQRS/Middlewares/PublicContractsMiddleware.cs @@ -86,8 +86,8 @@ private void Load(Type attributeType) foreach (var @event in contracts.Where(t => typeof(IEvent).IsAssignableFrom(t) && t != typeof(RejectedEvent))) { - var instance = @event.GetDefaultInstance(); - var name = instance.GetType().Name; + object? instance = @event.GetDefaultInstance(); + string? name = instance?.GetType().Name; if (Contracts.Events.ContainsKey(name)) { diff --git a/src/Genocs.WebApi/Options/WebApiSettings.cs b/src/Genocs.WebApi/Options/WebApiSettings.cs index 666d7ec3..f7429c94 100644 --- a/src/Genocs.WebApi/Options/WebApiSettings.cs +++ b/src/Genocs.WebApi/Options/WebApiSettings.cs @@ -1,7 +1,7 @@ namespace Genocs.WebApi.Options; /// -/// The WebApiSettings definiiton +/// The WebApiSettings definiiton. /// public class WebApiSettings { diff --git a/src/Genocs.WebApi/Parsers/JsonParser.cs b/src/Genocs.WebApi/Parsers/JsonParser.cs index c4b84e5f..7a2dec07 100644 --- a/src/Genocs.WebApi/Parsers/JsonParser.cs +++ b/src/Genocs.WebApi/Parsers/JsonParser.cs @@ -78,7 +78,7 @@ private void VisitValue(JsonElement value) case JsonValueKind.True: case JsonValueKind.False: case JsonValueKind.Null: - var key = _stack.Peek(); + string key = _stack.Peek(); if (_data.ContainsKey(key)) { diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs index 0a89e5e3..c8299cf4 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs @@ -4,8 +4,12 @@ namespace Genocs.APIGateway.Framework; internal sealed class CorrelationContextBuilder : ICorrelationContextBuilder { - public CorrelationContext Build(HttpContext context, string correlationId, string spanContext, - string name = null, string resourceId = null) + public CorrelationContext Build( + HttpContext context, + string correlationId, + string spanContext, + string name = null, + string resourceId = null) => new CorrelationContext { CorrelationId = correlationId, diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/ICorrelationContextBuilder.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/ICorrelationContextBuilder.cs index c64456f7..9618311f 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/ICorrelationContextBuilder.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Framework/ICorrelationContextBuilder.cs @@ -2,6 +2,10 @@ namespace Genocs.APIGateway.Framework; internal interface ICorrelationContextBuilder { - CorrelationContext Build(HttpContext context, string correlationId, string spanContext, string? name = null, - string? resourceId = null); + CorrelationContext Build( + HttpContext context, + string correlationId, + string spanContext, + string? name = null, + string? resourceId = null); } \ No newline at end of file diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs index bb224d67..5575cb06 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs @@ -1,3 +1,4 @@ +using Genocs.APIGateway.Options; using Genocs.MessageBrokers.RabbitMQ; using Genocs.MessageBrokers.RabbitMQ.Conventions; using Microsoft.Extensions.Options; @@ -15,11 +16,15 @@ internal class MessagingMiddleware : IMiddleware private readonly ITracer _tracer; private readonly ICorrelationContextBuilder _correlationContextBuilder; private readonly CorrelationIdFactory _correlationIdFactory; - private readonly IDictionary> _endpoints; + private readonly IDictionary> _endpoints; - public MessagingMiddleware(IRabbitMQClient rabbitMQClient, RouteMatcher routeMatcher, ITracer tracer, - ICorrelationContextBuilder correlationContextBuilder, CorrelationIdFactory correlationIdFactory, - IOptions messagingOptions) + public MessagingMiddleware( + IRabbitMQClient rabbitMQClient, + RouteMatcher routeMatcher, + ITracer tracer, + ICorrelationContextBuilder correlationContextBuilder, + CorrelationIdFactory correlationIdFactory, + IOptions messagingOptions) { if (messagingOptions is null) { @@ -34,7 +39,7 @@ public MessagingMiddleware(IRabbitMQClient rabbitMQClient, RouteMatcher routeMat _endpoints = messagingOptions.Value.Endpoints?.Any() is true ? messagingOptions.Value.Endpoints.GroupBy(e => e.Method.ToUpperInvariant()) .ToDictionary(e => e.Key, e => e.ToList()) - : new Dictionary>(); + : new Dictionary>(); } public async Task InvokeAsync(HttpContext context, RequestDelegate next) diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingOptions.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingOptions.cs deleted file mode 100644 index 9f30b83e..00000000 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Genocs.APIGateway.Framework; - -internal class MessagingOptions -{ - public bool Enabled { get; set; } - public IEnumerable? Endpoints { get; set; } - - internal class EndpointOptions - { - public string Method { get; set; } - public string Path { get; set; } - public string Exchange { get; set; } - public string RoutingKey { get; set; } - } -} \ No newline at end of file diff --git a/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs b/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs new file mode 100644 index 00000000..113498cc --- /dev/null +++ b/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs @@ -0,0 +1,15 @@ +namespace Genocs.APIGateway.Options; + +internal class MessagingSettings +{ + public bool Enabled { get; set; } + public IEnumerable? Endpoints { get; set; } + + internal class EndpointSettings + { + public string? Method { get; set; } + public string? Path { get; set; } + public string? Exchange { get; set; } + public string? RoutingKey { get; set; } + } +} \ No newline at end of file diff --git a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs index 11a962b5..a2dae299 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs @@ -1,4 +1,5 @@ using Genocs.APIGateway.Framework; +using Genocs.APIGateway.Options; using Genocs.Auth; using Genocs.Common.Options; using Genocs.Core.Builders; @@ -31,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.Configure(Configuration.GetSection("messaging")); + services.Configure(Configuration.GetSection("messaging")); services.AddReverseProxy() .LoadFromConfig(Configuration.GetSection("ReverseProxy")); services.AddSingleton(); diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj b/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj index 0c94f416..8b977205 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Genocs.SignalR.WebApi.csproj @@ -52,5 +52,4 @@ - \ No newline at end of file From 3a28fd1bf3f42c3de94cdd58ae002eb91b14fe2c Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Wed, 19 Jun 2024 18:18:40 +0200 Subject: [PATCH 04/17] Added auth features and AuthorizedController - Added `Genocs.Auth` project reference and package to `Genocs.Core.Demo.WebApi.csproj` for authentication support. - Included `Genocs.Auth` namespace in `Program.cs` for direct usage of its classes and members. - Enhanced service registration in `Program.cs` with `.AddPrivateKeyJwt()` for JWT authentication setup. - Created `AuthorizedController` with `[ApiController]`, `[Route("[controller]")]`, and `[Authorize]` attributes for secured API endpoints. - Implemented asynchronous action `PostSubmitDemoCommand` in `AuthorizedController`, utilizing `System.Net.Mime.MediaTypeNames.Application.Json`. --- .../Controllers/AuthorizedController.cs | 26 +++++++++++++++++++ .../Genocs.Core.Demo.WebApi.csproj | 2 ++ src/Genocs.Core.Demo.WebApi/Program.cs | 2 ++ 3 files changed, 30 insertions(+) create mode 100644 src/Genocs.Core.Demo.WebApi/Controllers/AuthorizedController.cs diff --git a/src/Genocs.Core.Demo.WebApi/Controllers/AuthorizedController.cs b/src/Genocs.Core.Demo.WebApi/Controllers/AuthorizedController.cs new file mode 100644 index 00000000..0f922b23 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Controllers/AuthorizedController.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.Net.Mime; + +namespace Genocs.Core.Demo.WebApi.Controllers; + +[ApiController] +[Route("[controller]")] +[Authorize] +public class AuthorizedController : ControllerBase +{ + private readonly ILogger _logger; + + public AuthorizedController(ILogger logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + [HttpGet("GetAuthorized")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(typeof(string), StatusCodes.Status200OK)] + public async Task PostSubmitDemoCommand() + { + return await Task.Run(() => Ok("Done")); + } +} diff --git a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj index 40ab948e..6a363384 100644 --- a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj +++ b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj @@ -12,6 +12,7 @@ + @@ -22,6 +23,7 @@ + diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index 5a9e4d16..a9436578 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -1,3 +1,4 @@ +using Genocs.Auth; using Genocs.Core.Builders; using Genocs.Core.Demo.WebApi.Infrastructure.Extensions; using Genocs.Core.Demo.WebApi.Options; @@ -29,6 +30,7 @@ services .AddGenocs(builder.Configuration) + .AddPrivateKeyJwt() .AddOpenTelemetry() .AddMongoFast() .RegisterMongoRepositories(Assembly.GetExecutingAssembly()) From 7bae2b7496200b36a9f0f0c4f0dadf60b74c3421 Mon Sep 17 00:00:00 2001 From: Giovanni Nocco Date: Sat, 22 Jun 2024 09:14:39 +0200 Subject: [PATCH 05/17] Sincronize naming conventions --- .../AccessTokenValidatorMiddleware.cs | 4 +- src/Genocs.Auth/Builders/JwtOptionsBuilder.cs | 6 +- .../JwtOptions.cs} | 4 +- src/Genocs.Auth/Extensions.cs | 20 ++--- src/Genocs.Auth/Genocs.Auth.csproj | 4 +- src/Genocs.Auth/Handlers/JwtHandler.cs | 6 +- src/Genocs.Auth/IJwtOptionsBuilder.cs | 4 +- src/Genocs.Auth/README_NUGET.md | 85 +++++++++++++++++++ .../Services/InMemoryAccessTokenService.cs | 6 +- .../AppOptions.cs} | 4 +- src/Genocs.Common/Genocs.Common.csproj | 4 +- src/Genocs.Common/README_NUGET.md | 59 +++++++++++++ .../Services/ExternalServiceClient.cs | 4 +- src/Genocs.Core.Demo.WebApi/Program.cs | 2 +- src/Genocs.Core/Builders/Extensions.cs | 12 +-- src/Genocs.Core/Genocs.Core.csproj | 4 +- src/Genocs.Core/README_NUGET.md | 63 ++++++++++++++ .../Builders/ConsulOptionsBuilder.cs | 6 +- .../ConsulOptions.cs} | 9 +- .../IConsulOptionsBuilder.cs | 4 +- src/Genocs.Discovery.Consul/Extensions.cs | 18 ++-- .../Http/ConsulHttpClient.cs | 4 +- .../ConsulServiceDiscoveryMessageHandler.cs | 27 +++--- ...eBuilders.cs => RestEaseOptionsBuilder.cs} | 18 ++-- .../Configurations/IRestEaseOptionsBuilder.cs | 8 ++ .../RestEaseOptions.cs} | 4 +- src/Genocs.HTTP.RestEase/Extensions.cs | 24 +++--- .../IRestEaseServiceBuilder.cs | 4 +- .../IRestEaseSettingsBuilder.cs | 10 --- .../HttpClientOptions.cs} | 16 ++-- src/Genocs.HTTP/Extensions.cs | 4 +- src/Genocs.HTTP/GenocsHttpClient.cs | 6 +- src/Genocs.HTTP/GenocsHttpLoggingFilter.cs | 6 +- .../GenocsLoggingScopeHttpMessageHandler.cs | 4 +- .../Builders/FabioOptionsBuilder.cs | 6 +- .../FabioOptions.cs} | 6 +- .../IFabioOptionsBuilder.cs | 6 +- src/Genocs.LoadBalancing.Fabio/Extensions.cs | 28 +++--- .../Http/FabioHttpClient.cs | 4 +- .../MessageHandlers/FabioMessageHandler.cs | 6 +- .../AzureOptions.cs} | 4 +- .../ConsoleOptions.cs} | 4 +- .../ElkOptions.cs} | 4 +- .../LocalFileOptions.cs} | 4 +- .../LoggerOptions.cs} | 19 ++--- .../LokiOptions.cs} | 4 +- .../MongoOptions.cs} | 4 +- .../SeqOptions.cs} | 4 +- src/Genocs.Logging/Extensions.cs | 48 +++++------ .../Builders/MetricsOptionsBuilder.cs | 20 ++--- .../Configurations/IMetricsSettingsBuilder.cs | 14 +++ .../MetricsSettings.cs | 2 +- src/Genocs.Metrics/AppMetrics/Extensions.cs | 42 ++++----- .../AppMetrics/IMetricsOptionsBuilder.cs | 16 ---- .../EncryptionUnitTest.cs | 1 - .../Builders/MongoDbOptionsBuilder.cs | 7 +- .../IMongoDbOptionsBuilder.cs | 6 +- .../MongoDbEncryptionOptions.cs | 69 +++++++++++++++ .../MongoDbOptions.cs} | 6 +- .../Encryptions/AzureInitializer.cs | 8 +- .../Extensions/MongoDbExtensions.cs | 30 +++---- .../Initializers/MongoDbInitializer.cs | 4 +- .../MongoDatabaseProvider.cs | 17 ++-- .../Options/MongoDbEncryptionSettings.cs | 70 --------------- src/Genocs.Tracing/Extensions.cs | 8 +- .../Builders/DispatcherEndpointsBuilder.cs | 24 ++++-- .../CertificateMiddleware.cs | 11 +-- .../SecurityOptions.cs} | 12 +-- src/Genocs.WebApi.Security/Extensions.cs | 5 +- .../Builders/SwaggerOptionsBuilder.cs | 4 +- .../ISwaggerOptionsBuilder.cs | 2 +- .../SwaggerOptions.cs | 2 +- src/Genocs.WebApi.Swagger/Docs/Extensions.cs | 3 +- src/Genocs.WebApi.Swagger/Extensions.cs | 1 + .../api-gateway/Genocs.APIGateway/Startup.cs | 4 +- .../CorrelationIdFactory.cs | 4 +- .../Extensions.cs | 4 +- .../Services/ProductServiceClient.cs | 18 ++-- testEnvironments.json | 17 ++++ 79 files changed, 640 insertions(+), 405 deletions(-) rename src/Genocs.Auth/{Options/JwtSettings.cs => Configurations/JwtOptions.cs} (97%) create mode 100644 src/Genocs.Auth/README_NUGET.md rename src/Genocs.Common/{Options/AppSettings.cs => Configurations/AppOptions.cs} (93%) create mode 100644 src/Genocs.Common/README_NUGET.md create mode 100644 src/Genocs.Core/README_NUGET.md rename src/Genocs.Discovery.Consul/{Options/ConsulSettings.cs => Configurations/ConsulOptions.cs} (79%) rename src/Genocs.Discovery.Consul/{Options => Configurations}/IConsulOptionsBuilder.cs (88%) rename src/Genocs.HTTP.RestEase/Builders/{RestEaseBuilders.cs => RestEaseOptionsBuilder.cs} (62%) create mode 100644 src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs rename src/Genocs.HTTP.RestEase/{Options/RestEaseSettings.cs => Configurations/RestEaseOptions.cs} (80%) delete mode 100644 src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs rename src/Genocs.HTTP/{Options/HttpClientSettings.cs => Configurations/HttpClientOptions.cs} (63%) rename src/Genocs.LoadBalancing.Fabio/{Options/FabioSettings.cs => Configurations/FabioOptions.cs} (83%) rename src/Genocs.LoadBalancing.Fabio/{ => Configurations}/IFabioOptionsBuilder.cs (90%) rename src/Genocs.Logging/{Options/AzureSettings.cs => Configurations/AzureOptions.cs} (85%) rename src/Genocs.Logging/{Options/ConsoleSettings.cs => Configurations/ConsoleOptions.cs} (75%) rename src/Genocs.Logging/{Options/ElkSettings.cs => Configurations/ElkOptions.cs} (90%) rename src/Genocs.Logging/{Options/LocalFileSettings.cs => Configurations/LocalFileOptions.cs} (87%) rename src/Genocs.Logging/{Options/LoggerSettings.cs => Configurations/LoggerOptions.cs} (67%) rename src/Genocs.Logging/{Options/LokiSettings.cs => Configurations/LokiOptions.cs} (96%) rename src/Genocs.Logging/{Options/MongoSettings.cs => Configurations/MongoOptions.cs} (76%) rename src/Genocs.Logging/{Options/SeqSettings.cs => Configurations/SeqOptions.cs} (64%) create mode 100644 src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs rename src/Genocs.Metrics/AppMetrics/{Options => Configurations}/MetricsSettings.cs (96%) delete mode 100644 src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs rename src/Genocs.Persistence.MongoDb/{Repositories => Configurations}/IMongoDbOptionsBuilder.cs (87%) create mode 100644 src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs rename src/Genocs.Persistence.MongoDb/{Options/MongoDbSettings.cs => Configurations/MongoDbOptions.cs} (91%) delete mode 100644 src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs rename src/Genocs.WebApi.Security/{Options/SecuritySettings.cs => Configurations/SecurityOptions.cs} (72%) rename src/Genocs.WebApi.Swagger/{Docs => }/Builders/SwaggerOptionsBuilder.cs (93%) rename src/Genocs.WebApi.Swagger/{Docs => Configurations}/ISwaggerOptionsBuilder.cs (91%) rename src/Genocs.WebApi.Swagger/{Docs => Configurations}/SwaggerOptions.cs (88%) create mode 100644 testEnvironments.json diff --git a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs index bf4b93cb..b0de9341 100644 --- a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs +++ b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; using Microsoft.AspNetCore.Http; using System.Net; @@ -17,7 +17,7 @@ public class AccessTokenValidatorMiddleware : IMiddleware /// /// The access token service. /// The options. - public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, JwtSettings options) + public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, JwtOptions options) { _accessTokenService = accessTokenService; _endpoints = options.AllowAnonymousEndpoints ?? Enumerable.Empty(); diff --git a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs index 9ef51792..c81ab262 100644 --- a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs +++ b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs @@ -1,10 +1,10 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; namespace Genocs.Auth.Builders; internal sealed class JwtOptionsBuilder : IJwtOptionsBuilder { - private readonly JwtSettings _options = new(); + private readonly JwtOptions _options = new(); public IJwtOptionsBuilder WithIssuerSigningKey(string issuerSigningKey) { @@ -48,6 +48,6 @@ public IJwtOptionsBuilder WithValidAudience(string validAudience) return this; } - public JwtSettings Build() + public JwtOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Auth/Options/JwtSettings.cs b/src/Genocs.Auth/Configurations/JwtOptions.cs similarity index 97% rename from src/Genocs.Auth/Options/JwtSettings.cs rename to src/Genocs.Auth/Configurations/JwtOptions.cs index 08dfb6de..cc181c18 100644 --- a/src/Genocs.Auth/Options/JwtSettings.cs +++ b/src/Genocs.Auth/Configurations/JwtOptions.cs @@ -1,6 +1,6 @@ -namespace Genocs.Auth.Options; +namespace Genocs.Auth.Configurations; -public class JwtSettings +public class JwtOptions { /// /// Default section name. diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index 4f74c0dc..f0077ec1 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -1,5 +1,5 @@ +using Genocs.Auth.Configurations; using Genocs.Auth.Handlers; -using Genocs.Auth.Options; using Genocs.Auth.Services; using Genocs.Core.Builders; using Genocs.Security.Services; @@ -23,21 +23,21 @@ public static class Extensions public static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - string sectionName = JwtSettings.Position, + string sectionName = JwtOptions.Position, Action? optionsFactory = null) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = JwtSettings.Position; + sectionName = JwtOptions.Position; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); return builder.AddJwt(options, optionsFactory); } private static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - JwtSettings jwtSettings, + JwtOptions jwtSettings, Action? optionsFactory = null) { if (!builder.TryRegister(RegistryName)) @@ -180,10 +180,10 @@ private static IGenocsBuilder AddJwt( /// The Genocs builder you can use for chain. public static IGenocsBuilder AddOpenIdJwt( this IGenocsBuilder builder, - string sectionName = JwtSettings.Position) + string sectionName = JwtOptions.Position) { - var jwtSettings = new JwtSettings(); + var jwtSettings = new JwtOptions(); builder.Configuration.GetSection(sectionName).Bind(jwtSettings); string metadataAddress = $"{jwtSettings.Issuer}{jwtSettings.MetadataAddress}"; @@ -218,14 +218,14 @@ public static IGenocsBuilder AddOpenIdJwt( /// Whenever mandatory data like 'IssuerSigningKey' is missing. public static IGenocsBuilder AddPrivateKeyJwt( this IGenocsBuilder builder, - string sectionName = JwtSettings.Position) + string sectionName = JwtOptions.Position) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = JwtSettings.Position; + sectionName = JwtOptions.Position; } - var jwtSettings = new JwtSettings(); + var jwtSettings = new JwtOptions(); builder.Configuration.GetSection(sectionName).Bind(jwtSettings); if (string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey)) diff --git a/src/Genocs.Auth/Genocs.Auth.csproj b/src/Genocs.Auth/Genocs.Auth.csproj index ce0c8e54..d90636d6 100644 --- a/src/Genocs.Auth/Genocs.Auth.csproj +++ b/src/Genocs.Auth/Genocs.Auth.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Auth/Handlers/JwtHandler.cs b/src/Genocs.Auth/Handlers/JwtHandler.cs index f3ce917b..36e197e0 100644 --- a/src/Genocs.Auth/Handlers/JwtHandler.cs +++ b/src/Genocs.Auth/Handlers/JwtHandler.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; @@ -20,12 +20,12 @@ internal sealed class JwtHandler : IJwtHandler }; private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler = new(); - private readonly JwtSettings _options; + private readonly JwtOptions _options; private readonly TokenValidationParameters _tokenValidationParameters; private readonly SigningCredentials _signingCredentials; private readonly string? _issuer; - public JwtHandler(JwtSettings options, TokenValidationParameters tokenValidationParameters) + public JwtHandler(JwtOptions options, TokenValidationParameters tokenValidationParameters) { var issuerSigningKey = tokenValidationParameters.IssuerSigningKey; if (issuerSigningKey is null) diff --git a/src/Genocs.Auth/IJwtOptionsBuilder.cs b/src/Genocs.Auth/IJwtOptionsBuilder.cs index d3aa7cef..2409fe18 100644 --- a/src/Genocs.Auth/IJwtOptionsBuilder.cs +++ b/src/Genocs.Auth/IJwtOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; namespace Genocs.Auth; @@ -10,5 +10,5 @@ public interface IJwtOptionsBuilder IJwtOptionsBuilder WithLifetimeValidation(bool validateLifetime); IJwtOptionsBuilder WithAudienceValidation(bool validateAudience); IJwtOptionsBuilder WithValidAudience(string validAudience); - JwtSettings Build(); + JwtOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.Auth/README_NUGET.md b/src/Genocs.Auth/README_NUGET.md new file mode 100644 index 00000000..29459bfd --- /dev/null +++ b/src/Genocs.Auth/README_NUGET.md @@ -0,0 +1,85 @@ +# .NET Core Auth client library + +This package contains a set of functionalities to handling authorization logic as JWT. +First of all I have to say thanks to devmentors. + +The libraries are built using .NET7. + + +## Description + +This package contains a set of functionalities to handling authorization logic as JWT. + + +## Support + +Please check the GitHub repository getting more info. + + +### DataProvider Settings +Following are the project settings needed to enable monitoring + +``` json + "jwt": { + "certificate": { + "location": "certs/localhost.pfx", + "password": "test", + "rawData": "" + }, + "issuer": "genocs-identity-service", + "validIssuer": "genocs-identity-service", + "validateAudience": false, + "validateIssuer": true, + "validateLifetime": true, + "expiry": "01:00:00" + } +``` + +## Release notes + +### [2024-06-15] 6.0.0 +- Added support for Azure Key Vault +- Unified settings + +### [2024-01-23] 5.0.6 +- Refactory Settings +- Updated nuget packages + +### [2023-11-25] 5.0.5 +- Moved to NET8 + +### [yyyy-mm-dd] 5.0.4 +- + +### [yyyy-mm-dd] 5.0.3 +- + +### [yyyy-mm-dd] 5.0.2 +- + +### [yyyy-mm-dd] 5.0.1 +- + +### [2023-11-25] 5.0.0 +- Moved to NET8 + +### [2023-10-13] 5.0.0-preview.5.0 +- Added [editorconfig](https://editorconfig.org/) +- Added StyleCop +- Updated logo +- Updated readme + +### [2023-03-12] 5.0.0-preview.4.0 +- Implemented MongoDB repository interfaces + +### [2023-03-24] 5.0.0 +- New Architecture + +### [2023-03-12] 3.1.0 +- Added Builders + +### [2023-03-12] 3.0.0 +- Refactory to implement CQRS pattern + +### [2023-03-04] 2.4.1 +- Updated System.Text.Json \ No newline at end of file diff --git a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs index 8e95a03f..f1134825 100644 --- a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs +++ b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Primitives; @@ -14,11 +14,11 @@ internal sealed class InMemoryAccessTokenService : IAccessTokenService public InMemoryAccessTokenService( IMemoryCache cache, IHttpContextAccessor httpContextAccessor, - JwtSettings jwtOptions) + JwtOptions jwtSettings) { _cache = cache; _httpContextAccessor = httpContextAccessor; - _expires = jwtOptions.Expiry ?? TimeSpan.FromMinutes(jwtOptions.ExpiryMinutes); + _expires = jwtSettings.Expiry ?? TimeSpan.FromMinutes(jwtSettings.ExpiryMinutes); } public Task IsCurrentActiveToken() diff --git a/src/Genocs.Common/Options/AppSettings.cs b/src/Genocs.Common/Configurations/AppOptions.cs similarity index 93% rename from src/Genocs.Common/Options/AppSettings.cs rename to src/Genocs.Common/Configurations/AppOptions.cs index 3af8f1ef..a5596f68 100644 --- a/src/Genocs.Common/Options/AppSettings.cs +++ b/src/Genocs.Common/Configurations/AppOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Common.Options; +namespace Genocs.Common.Configurations; /// /// The application settings. /// -public class AppSettings +public class AppOptions { /// /// Default section name. diff --git a/src/Genocs.Common/Genocs.Common.csproj b/src/Genocs.Common/Genocs.Common.csproj index 2ab02e42..b18067f9 100644 --- a/src/Genocs.Common/Genocs.Common.csproj +++ b/src/Genocs.Common/Genocs.Common.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Common/README_NUGET.md b/src/Genocs.Common/README_NUGET.md new file mode 100644 index 00000000..db3b92d4 --- /dev/null +++ b/src/Genocs.Common/README_NUGET.md @@ -0,0 +1,59 @@ +# .NET Core Common library + +This package contains a set of base functionalities designed by Genocs. +The libraries are built using .NET standard 2.1. + + +## Description + +Core Common NuGet package contains general types, interfaces and classes to be used on DDD services. + +## Support + +Please check the GitHub repository getting more info. + + +## Release notes + +### [2024-01-23] 5.0.6 +- Refactory Settings +- Updated nuget packages + +### [2023-11-25] 5.0.5 +- Moved to NET8 + +### [yyyy-mm-dd] 5.0.4 +- + +### [yyyy-mm-dd] 5.0.3 +- + +### [yyyy-mm-dd] 5.0.2 +- + +### [yyyy-mm-dd] 5.0.1 +- + +### [2023-11-25] 5.0.0 +- Moved to NET8 + +### [2023-10-13] 5.0.0-preview.5.0 +- Added [editorconfig](https://editorconfig.org/) +- Added StyleCop +- Updated logo +- Updated readme + +### [2023-03-12] 5.0.0-preview.4.0 +- Implemented MongoDB repository interfaces + +### [2023-03-24] 5.0.0 +- New Architecture + +### [2023-03-12] 3.1.0 +- Added Builders + +### [2023-03-12] 3.0.0 +- Refactory to implement CQRS pattern + +### [2023-03-04] 2.4.1 +- Updated System.Text.Json \ No newline at end of file diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs index 459ebd9c..1a9beaa0 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs @@ -1,6 +1,6 @@ using Genocs.Core.Demo.WebApi.Options; using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.Security; using Newtonsoft.Json; @@ -26,7 +26,7 @@ public class ExternalServiceClient : IExternalServiceClient public ExternalServiceClient( IHttpClient client, IHasher hasher, - HttpClientSettings httpClientSettings, + HttpClientOptions httpClientSettings, ExternalServiceSettings externalServiceSettings) { _client = client ?? throw new ArgumentNullException(nameof(client)); diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index a9436578..648f8938 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -6,6 +6,7 @@ using Genocs.Persistence.MongoDb.Extensions; using Genocs.Secrets.AzureKeyVault; using Genocs.Tracing; +using Genocs.WebApi.Security; using Microsoft.Extensions.Diagnostics.HealthChecks; using Serilog; using Serilog.Events; @@ -30,7 +31,6 @@ services .AddGenocs(builder.Configuration) - .AddPrivateKeyJwt() .AddOpenTelemetry() .AddMongoFast() .RegisterMongoRepositories(Assembly.GetExecutingAssembly()) diff --git a/src/Genocs.Core/Builders/Extensions.cs b/src/Genocs.Core/Builders/Extensions.cs index 6cd7ed22..8436b812 100644 --- a/src/Genocs.Core/Builders/Extensions.cs +++ b/src/Genocs.Core/Builders/Extensions.cs @@ -1,4 +1,4 @@ -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Common.Types; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; @@ -20,18 +20,18 @@ public static class Extensions public static IGenocsBuilder AddGenocs(this IServiceCollection services, IConfiguration? configuration = null) { var builder = GenocsBuilder.Create(services, configuration); - var options = builder.GetOptions(AppSettings.Position); - services.AddSingleton(options); + var settings = builder.GetOptions(AppOptions.Position); + services.AddSingleton(settings); builder.Services.AddMemoryCache(); services.AddSingleton(); - if (!options.DisplayBanner || string.IsNullOrWhiteSpace(options.Name)) + if (!settings.DisplayBanner || string.IsNullOrWhiteSpace(settings.Name)) { return builder; } - string version = options.DisplayVersion ? $" {options.Version}" : string.Empty; - Console.WriteLine(Figgle.FiggleFonts.Doom.Render(options.Name + version)); + string version = settings.DisplayVersion ? $" {settings.Version}" : string.Empty; + Console.WriteLine(Figgle.FiggleFonts.Doom.Render(settings.Name + version)); ConsoleColor current = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("Runtime Version: {0}", Environment.Version.ToString()); diff --git a/src/Genocs.Core/Genocs.Core.csproj b/src/Genocs.Core/Genocs.Core.csproj index 7613dec3..6e259383 100644 --- a/src/Genocs.Core/Genocs.Core.csproj +++ b/src/Genocs.Core/Genocs.Core.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Updated to NET8 True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Core/README_NUGET.md b/src/Genocs.Core/README_NUGET.md new file mode 100644 index 00000000..7aebc35c --- /dev/null +++ b/src/Genocs.Core/README_NUGET.md @@ -0,0 +1,63 @@ +# .NET Core library + +This package contains a set of base functionalities designed by Genocs. +The library is built to be used on .NET standard 2.1 and NET6, NET7 NET8. + +## Description + +Core NuGet package contains general purpose functionalities to be used on DDD services. + + +## Support + +Please check the GitHub repository getting more info. + + +## Release notes + +### [2024-06-22] 6.0.0-preview.1.0 +- Upgrade toward Version 6.0.0 +- + +### [2024-01-23] 5.0.6 +- Refactory Settings +- Updated nuget packages + +### [2023-11-25] 5.0.5 +- Moved to NET8 + +### [yyyy-mm-dd] 5.0.4 +- + +### [yyyy-mm-dd] 5.0.3 +- + +### [yyyy-mm-dd] 5.0.2 +- + +### [yyyy-mm-dd] 5.0.1 +- + +### [2023-11-25] 5.0.0 +- Moved to NET8 + +### [2023-10-13] 5.0.0-preview.5.0 +- Added [editorconfig](https://editorconfig.org/) +- Added StyleCop +- Updated logo +- Updated readme + +### [2023-03-12] 5.0.0-preview.4.0 +- Implemented MongoDB repository interfaces + +### [2023-03-12] 5.0.0 +- New Architecture + +### [2023-03-12] 3.1.0 +- Added Builders + +### [2023-03-12] 3.0.0 +- Refactory to implement CQRS pattern + +### [2023-03-04] 2.4.1 +- Updated System.Text.Json diff --git a/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs b/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs index 8c7e3685..f5b29178 100644 --- a/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs +++ b/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs @@ -1,10 +1,10 @@ -using Genocs.Discovery.Consul.Options; +using Genocs.Discovery.Consul.Configurations; namespace Genocs.Discovery.Consul.Builders; internal sealed class ConsulOptionsBuilder : IConsulOptionsBuilder { - private readonly ConsulSettings _options = new(); + private readonly ConsulOptions _options = new(); public IConsulOptionsBuilder Enable(bool enabled) { @@ -60,5 +60,5 @@ public IConsulOptionsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLoca return this; } - public ConsulSettings Build() => _options; + public ConsulOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/Options/ConsulSettings.cs b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs similarity index 79% rename from src/Genocs.Discovery.Consul/Options/ConsulSettings.cs rename to src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs index d16f9642..fec77e24 100644 --- a/src/Genocs.Discovery.Consul/Options/ConsulSettings.cs +++ b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs @@ -1,7 +1,12 @@ -namespace Genocs.Discovery.Consul.Options; +namespace Genocs.Discovery.Consul.Configurations; -public class ConsulSettings +public class ConsulOptions { + /// + /// Default section name. + /// + public const string Position = "consul"; + public bool Enabled { get; set; } public string? Url { get; set; } public string? Service { get; set; } diff --git a/src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs b/src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs similarity index 88% rename from src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs rename to src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs index c4d8d850..63b5aeda 100644 --- a/src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs +++ b/src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs @@ -1,4 +1,4 @@ -namespace Genocs.Discovery.Consul.Options; +namespace Genocs.Discovery.Consul.Configurations; public interface IConsulOptionsBuilder { @@ -11,5 +11,5 @@ public interface IConsulOptionsBuilder IConsulOptionsBuilder WithPingInterval(string pingInterval); IConsulOptionsBuilder WithRemoteAfterInterval(string remoteAfterInterval); IConsulOptionsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace); - ConsulSettings Build(); + ConsulOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/Extensions.cs b/src/Genocs.Discovery.Consul/Extensions.cs index ecebcb98..a8a8c511 100644 --- a/src/Genocs.Discovery.Consul/Extensions.cs +++ b/src/Genocs.Discovery.Consul/Extensions.cs @@ -1,12 +1,12 @@ using Genocs.Core.Builders; using Genocs.Discovery.Consul.Builders; +using Genocs.Discovery.Consul.Configurations; using Genocs.Discovery.Consul.Http; using Genocs.Discovery.Consul.MessageHandlers; using Genocs.Discovery.Consul.Models; -using Genocs.Discovery.Consul.Options; using Genocs.Discovery.Consul.Services; using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.DependencyInjection; namespace Genocs.Discovery.Consul; @@ -27,15 +27,15 @@ public static IGenocsBuilder AddConsul( sectionName = SectionName; } - var consulOptions = builder.GetOptions(sectionName); - var httpClientOptions = builder.GetOptions(httpClientSectionName); + var consulOptions = builder.GetOptions(sectionName); + var httpClientOptions = builder.GetOptions(httpClientSectionName); return builder.AddConsul(consulOptions, httpClientOptions); } public static IGenocsBuilder AddConsul( this IGenocsBuilder builder, Func buildOptions, - HttpClientSettings httpClientOptions) + HttpClientOptions httpClientOptions) { var options = buildOptions(new ConsulOptionsBuilder()).Build(); return builder.AddConsul(options, httpClientOptions); @@ -43,8 +43,8 @@ public static IGenocsBuilder AddConsul( public static IGenocsBuilder AddConsul( this IGenocsBuilder builder, - ConsulSettings options, - HttpClientSettings httpClientOptions) + ConsulOptions options, + HttpClientOptions httpClientOptions) { builder.Services.AddSingleton(options); if (!options.Enabled || !builder.TryRegister(RegistryName)) @@ -78,9 +78,9 @@ public static void AddConsulHttpClient(this IGenocsBuilder builder, string clien => builder.Services.AddHttpClient(clientName) .AddHttpMessageHandler(c => new ConsulServiceDiscoveryMessageHandler( c.GetRequiredService(), - c.GetRequiredService(), serviceName, true)); + c.GetRequiredService(), serviceName, true)); - private static ServiceRegistration CreateConsulAgentRegistration(this IGenocsBuilder builder, ConsulSettings options) + private static ServiceRegistration CreateConsulAgentRegistration(this IGenocsBuilder builder, ConsulOptions options) { bool enabled = options.Enabled; string? consulEnabled = Environment.GetEnvironmentVariable("CONSUL_ENABLED")?.ToLowerInvariant(); diff --git a/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs b/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs index 5b8691fe..10c6e7b7 100644 --- a/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs +++ b/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs @@ -1,11 +1,11 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; namespace Genocs.Discovery.Consul.Http; internal sealed class ConsulHttpClient : GenocsHttpClient, IConsulHttpClient { - public ConsulHttpClient(HttpClient client, HttpClientSettings options, IHttpClientSerializer serializer, + public ConsulHttpClient(HttpClient client, HttpClientOptions options, IHttpClientSerializer serializer, ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) : base(client, options, serializer, correlationContextFactory, correlationIdFactory) { diff --git a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs index 162f57a7..a13a67a5 100644 --- a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs +++ b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs @@ -1,29 +1,34 @@ -using Genocs.Discovery.Consul.Options; +using Genocs.Discovery.Consul.Configurations; namespace Genocs.Discovery.Consul.MessageHandlers; internal sealed class ConsulServiceDiscoveryMessageHandler : DelegatingHandler { private readonly IConsulServicesRegistry _servicesRegistry; - private readonly ConsulSettings _options; + private readonly ConsulOptions _settings; private readonly string? _serviceName; private readonly bool? _overrideRequestUri; public ConsulServiceDiscoveryMessageHandler( IConsulServicesRegistry servicesRegistry, - ConsulSettings options, + ConsulOptions settings, string? serviceName = null, bool? overrideRequestUri = null) { - if (string.IsNullOrWhiteSpace(options.Url)) - { - throw new InvalidOperationException("Consul URL was not provided."); - } - _servicesRegistry = servicesRegistry; - _options = options; + _settings = settings; _serviceName = serviceName; _overrideRequestUri = overrideRequestUri; + + if (!settings.Enabled) + { + return; + } + + if (string.IsNullOrWhiteSpace(settings.Url)) + { + throw new InvalidOperationException("Consul URL was not provided."); + } } protected override async Task SendAsync( @@ -50,7 +55,7 @@ private async Task SendAsync( Uri uri, CancellationToken cancellationToken) { - if (!_options.Enabled) + if (!_settings.Enabled) { return await base.SendAsync(request, cancellationToken); } @@ -68,7 +73,7 @@ private async Task GetRequestUriAsync( var service = await _servicesRegistry.GetAsync(serviceName) ?? throw new ConsulServiceNotFoundException($"Consul service: '{serviceName}' was not found.", serviceName); - if (!_options.SkipLocalhostDockerDnsReplace) + if (!_settings.SkipLocalhostDockerDnsReplace) { service.Address = service.Address.Replace("docker.for.mac.localhost", "localhost") .Replace("docker.for.win.localhost", "localhost") diff --git a/src/Genocs.HTTP.RestEase/Builders/RestEaseBuilders.cs b/src/Genocs.HTTP.RestEase/Builders/RestEaseOptionsBuilder.cs similarity index 62% rename from src/Genocs.HTTP.RestEase/Builders/RestEaseBuilders.cs rename to src/Genocs.HTTP.RestEase/Builders/RestEaseOptionsBuilder.cs index da1d0b69..55bb2367 100644 --- a/src/Genocs.HTTP.RestEase/Builders/RestEaseBuilders.cs +++ b/src/Genocs.HTTP.RestEase/Builders/RestEaseOptionsBuilder.cs @@ -1,26 +1,26 @@ -using Genocs.HTTP.RestEase.Options; +using Genocs.HTTP.RestEase.Configurations; namespace Genocs.HTTP.RestEase.Builders; -internal sealed class RestEaseSettingsBuilder : IRestEaseSettingsBuilder +internal sealed class RestEaseOptionsBuilder : IRestEaseOptionsBuilder { - private readonly RestEaseSettings _options = new(); - private readonly List _services = new(); + private readonly RestEaseOptions _options = new(); + private readonly List _services = new(); - public IRestEaseSettingsBuilder WithLoadBalancer(string loadBalancer) + public IRestEaseOptionsBuilder WithLoadBalancer(string loadBalancer) { _options.LoadBalancer = loadBalancer; return this; } - public IRestEaseSettingsBuilder WithService(Func buildService) + public IRestEaseOptionsBuilder WithService(Func buildService) { var service = buildService(new RestEaseServiceBuilder()).Build(); _services.Add(service); return this; } - public RestEaseSettings Build() + public RestEaseOptions Build() { _options.Services = _services; return _options; @@ -28,7 +28,7 @@ public RestEaseSettings Build() private class RestEaseServiceBuilder : IRestEaseServiceBuilder { - private readonly RestEaseSettings.Service _service = new(); + private readonly RestEaseOptions.Service _service = new(); public IRestEaseServiceBuilder WithName(string name) { @@ -54,6 +54,6 @@ public IRestEaseServiceBuilder WithPort(int port) return this; } - public RestEaseSettings.Service Build() => _service; + public RestEaseOptions.Service Build() => _service; } } \ No newline at end of file diff --git a/src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs b/src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs new file mode 100644 index 00000000..f013109a --- /dev/null +++ b/src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs @@ -0,0 +1,8 @@ +namespace Genocs.HTTP.RestEase.Configurations; + +public interface IRestEaseOptionsBuilder +{ + IRestEaseOptionsBuilder WithLoadBalancer(string loadBalancer); + IRestEaseOptionsBuilder WithService(Func buildService); + RestEaseOptions Build(); +} \ No newline at end of file diff --git a/src/Genocs.HTTP.RestEase/Options/RestEaseSettings.cs b/src/Genocs.HTTP.RestEase/Configurations/RestEaseOptions.cs similarity index 80% rename from src/Genocs.HTTP.RestEase/Options/RestEaseSettings.cs rename to src/Genocs.HTTP.RestEase/Configurations/RestEaseOptions.cs index f5b4c1f3..87f927bc 100644 --- a/src/Genocs.HTTP.RestEase/Options/RestEaseSettings.cs +++ b/src/Genocs.HTTP.RestEase/Configurations/RestEaseOptions.cs @@ -1,6 +1,6 @@ -namespace Genocs.HTTP.RestEase.Options; +namespace Genocs.HTTP.RestEase.Configurations; -public class RestEaseSettings +public class RestEaseOptions { public string? LoadBalancer { get; set; } public IEnumerable? Services { get; set; } diff --git a/src/Genocs.HTTP.RestEase/Extensions.cs b/src/Genocs.HTTP.RestEase/Extensions.cs index 70020773..307bf90e 100644 --- a/src/Genocs.HTTP.RestEase/Extensions.cs +++ b/src/Genocs.HTTP.RestEase/Extensions.cs @@ -1,12 +1,12 @@ using Genocs.Core.Builders; using Genocs.Discovery.Consul; -using Genocs.Discovery.Consul.Options; -using Genocs.HTTP.Options; +using Genocs.Discovery.Consul.Configurations; +using Genocs.HTTP.Configurations; using Genocs.HTTP.RestEase.Builders; -using Genocs.HTTP.RestEase.Options; +using Genocs.HTTP.RestEase.Configurations; using Genocs.HTTP.RestEase.Serializers; using Genocs.LoadBalancing.Fabio; -using Genocs.LoadBalancing.Fabio.Options; +using Genocs.LoadBalancing.Fabio.Configurations; using Microsoft.Extensions.DependencyInjection; using RestEase; @@ -27,26 +27,26 @@ public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, st sectionName = SectionName; } - var restEaseOptions = builder.GetOptions(sectionName); + var restEaseOptions = builder.GetOptions(sectionName); return builder.AddServiceClient(serviceName, restEaseOptions, b => b.AddFabio(fabioSectionName, consulSectionName, httpClientSectionName)); } public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, string serviceName, - Func buildOptions, + Func buildOptions, Func buildConsulOptions, Func buildFabioOptions, - HttpClientSettings httpClientOptions) + HttpClientOptions httpClientOptions) where T : class { - var options = buildOptions(new RestEaseSettingsBuilder()).Build(); + var options = buildOptions(new RestEaseOptionsBuilder()).Build(); return builder.AddServiceClient(serviceName, options, b => b.AddFabio(buildFabioOptions, buildConsulOptions, httpClientOptions)); } public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, string serviceName, - RestEaseSettings options, ConsulSettings consulOptions, FabioSettings fabioOptions, - HttpClientSettings httpClientOptions) + RestEaseOptions options, ConsulOptions consulOptions, FabioOptions fabioOptions, + HttpClientOptions httpClientOptions) where T : class => builder.AddServiceClient(serviceName, options, b => b.AddFabio(fabioOptions, consulOptions, httpClientOptions)); @@ -54,7 +54,7 @@ public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, st private static IGenocsBuilder AddServiceClient( this IGenocsBuilder builder, string serviceName, - RestEaseSettings options, + RestEaseOptions options, Action registerFabio) where T : class { @@ -89,7 +89,7 @@ private static void ConfigureDefaultClient( IServiceCollection services, string clientName, string serviceName, - RestEaseSettings options) + RestEaseOptions options) { services.AddHttpClient(clientName, client => { diff --git a/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs b/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs index 680728ac..bcbdae00 100644 --- a/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs +++ b/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.RestEase.Options; +using Genocs.HTTP.RestEase.Configurations; namespace Genocs.HTTP.RestEase; @@ -8,5 +8,5 @@ public interface IRestEaseServiceBuilder IRestEaseServiceBuilder WithScheme(string scheme); IRestEaseServiceBuilder WithHost(string host); IRestEaseServiceBuilder WithPort(int port); - RestEaseSettings.Service Build(); + RestEaseOptions.Service Build(); } \ No newline at end of file diff --git a/src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs b/src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs deleted file mode 100644 index 15353665..00000000 --- a/src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Genocs.HTTP.RestEase.Options; - -namespace Genocs.HTTP.RestEase; - -public interface IRestEaseSettingsBuilder -{ - IRestEaseSettingsBuilder WithLoadBalancer(string loadBalancer); - IRestEaseSettingsBuilder WithService(Func buildService); - RestEaseSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.HTTP/Options/HttpClientSettings.cs b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs similarity index 63% rename from src/Genocs.HTTP/Options/HttpClientSettings.cs rename to src/Genocs.HTTP/Configurations/HttpClientOptions.cs index 42fde541..213dbb69 100644 --- a/src/Genocs.HTTP/Options/HttpClientSettings.cs +++ b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.HTTP.Options; +namespace Genocs.HTTP.Configurations; /// -/// The HttpClient Settings class. +/// The HttpClient settings. /// -public class HttpClientSettings +public class HttpClientOptions { /// /// It defines if set consul as service discovery or Fabio as load balancer. @@ -20,15 +20,15 @@ public class HttpClientSettings /// It defines the list of services to be registered. /// public IDictionary? Services { get; set; } - public RequestMaskingSettings RequestMasking { get; set; } + public RequestMaskingSettings? RequestMasking { get; set; } public bool RemoveCharsetFromContentType { get; set; } - public string CorrelationContextHeader { get; set; } - public string CorrelationIdHeader { get; set; } + public string? CorrelationContextHeader { get; set; } + public string? CorrelationIdHeader { get; set; } public class RequestMaskingSettings { public bool Enabled { get; set; } - public IEnumerable UrlParts { get; set; } - public string MaskTemplate { get; set; } + public IEnumerable? UrlParts { get; set; } + public string? MaskTemplate { get; set; } } } \ No newline at end of file diff --git a/src/Genocs.HTTP/Extensions.cs b/src/Genocs.HTTP/Extensions.cs index 13238b93..908bb7d1 100644 --- a/src/Genocs.HTTP/Extensions.cs +++ b/src/Genocs.HTTP/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Http; @@ -38,7 +38,7 @@ public static IGenocsBuilder AddHttpClient( throw new ArgumentException("HTTP client name cannot be empty.", nameof(clientName)); } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); if (maskedRequestUrlParts is not null && options.RequestMasking is not null) { options.RequestMasking.UrlParts = maskedRequestUrlParts; diff --git a/src/Genocs.HTTP/GenocsHttpClient.cs b/src/Genocs.HTTP/GenocsHttpClient.cs index c407de2a..84f89ed7 100644 --- a/src/Genocs.HTTP/GenocsHttpClient.cs +++ b/src/Genocs.HTTP/GenocsHttpClient.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Polly; using System.Net.Http.Headers; using System.Text; @@ -12,12 +12,12 @@ public class GenocsHttpClient : IHttpClient { private const string JsonContentType = "application/json"; private readonly HttpClient _client; - private readonly HttpClientSettings _options; + private readonly HttpClientOptions _options; private readonly IHttpClientSerializer _serializer; public GenocsHttpClient( HttpClient client, - HttpClientSettings options, + HttpClientOptions options, IHttpClientSerializer serializer, ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) diff --git a/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs b/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs index 7d30997a..8ba7d583 100644 --- a/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs +++ b/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; @@ -8,9 +8,9 @@ namespace Genocs.HTTP; internal sealed class GenocsHttpLoggingFilter : IHttpMessageHandlerBuilderFilter { private readonly ILoggerFactory _loggerFactory; - private readonly HttpClientSettings _options; + private readonly HttpClientOptions _options; - public GenocsHttpLoggingFilter(ILoggerFactory loggerFactory, HttpClientSettings options) + public GenocsHttpLoggingFilter(ILoggerFactory loggerFactory, HttpClientOptions options) { _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); _options = options; diff --git a/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs b/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs index 529f245f..ef9bdfbb 100644 --- a/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs +++ b/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.Logging; using System.Net; @@ -10,7 +10,7 @@ internal sealed class GenocsLoggingScopeHttpMessageHandler : DelegatingHandler private readonly HashSet _maskedRequestUrlParts; private readonly string _maskTemplate; - public GenocsLoggingScopeHttpMessageHandler(ILogger logger, HttpClientSettings options) + public GenocsLoggingScopeHttpMessageHandler(ILogger logger, HttpClientOptions options) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _ = options ?? throw new ArgumentNullException(nameof(options)); diff --git a/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs index ec923b1d..96e11ed9 100644 --- a/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs +++ b/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.LoadBalancing.Fabio.Options; +using Genocs.LoadBalancing.Fabio.Configurations; namespace Genocs.LoadBalancing.Fabio.Builders; @@ -7,7 +7,7 @@ namespace Genocs.LoadBalancing.Fabio.Builders; /// public class FabioOptionsBuilder : IFabioOptionsBuilder { - private readonly FabioSettings _options = new(); + private readonly FabioOptions _options = new(); /// /// Enable or disable the Fabio load balancer @@ -46,5 +46,5 @@ public IFabioOptionsBuilder WithService(string service) /// Build the Fabio options /// /// The Fabio options - public FabioSettings Build() => _options; + public FabioOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/Options/FabioSettings.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs similarity index 83% rename from src/Genocs.LoadBalancing.Fabio/Options/FabioSettings.cs rename to src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs index f7e6d9ab..28803892 100644 --- a/src/Genocs.LoadBalancing.Fabio/Options/FabioSettings.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.LoadBalancing.Fabio.Options; +namespace Genocs.LoadBalancing.Fabio.Configurations; /// /// The Fabio settings. /// -public class FabioSettings +public class FabioOptions { /// /// The default Fabio section name. @@ -11,7 +11,7 @@ public class FabioSettings public const string Position = "fabio"; /// - /// Gets or sets a value indicating whether this is enabled. + /// Gets or sets a value indicating whether this is enabled. /// public bool Enabled { get; set; } diff --git a/src/Genocs.LoadBalancing.Fabio/IFabioOptionsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioOptionsBuilder.cs similarity index 90% rename from src/Genocs.LoadBalancing.Fabio/IFabioOptionsBuilder.cs rename to src/Genocs.LoadBalancing.Fabio/Configurations/IFabioOptionsBuilder.cs index 478c1cb3..a0e41b20 100644 --- a/src/Genocs.LoadBalancing.Fabio/IFabioOptionsBuilder.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioOptionsBuilder.cs @@ -1,6 +1,4 @@ -using Genocs.LoadBalancing.Fabio.Options; - -namespace Genocs.LoadBalancing.Fabio; +namespace Genocs.LoadBalancing.Fabio.Configurations; /// /// The Fabio options builder interface definition @@ -32,5 +30,5 @@ public interface IFabioOptionsBuilder /// Build the Fabio options /// /// The Fabio options - FabioSettings Build(); + FabioOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/Extensions.cs b/src/Genocs.LoadBalancing.Fabio/Extensions.cs index e0e507f9..8a1b9853 100644 --- a/src/Genocs.LoadBalancing.Fabio/Extensions.cs +++ b/src/Genocs.LoadBalancing.Fabio/Extensions.cs @@ -1,13 +1,13 @@ using Genocs.Core.Builders; using Genocs.Discovery.Consul; +using Genocs.Discovery.Consul.Configurations; using Genocs.Discovery.Consul.Models; -using Genocs.Discovery.Consul.Options; using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.LoadBalancing.Fabio.Builders; +using Genocs.LoadBalancing.Fabio.Configurations; using Genocs.LoadBalancing.Fabio.Http; using Genocs.LoadBalancing.Fabio.MessageHandlers; -using Genocs.LoadBalancing.Fabio.Options; using Microsoft.Extensions.DependencyInjection; namespace Genocs.LoadBalancing.Fabio; @@ -16,17 +16,17 @@ public static class Extensions { private const string RegistryName = "loadBalancing.fabio"; - public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, string sectionName = FabioSettings.Position, + public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, string sectionName = FabioOptions.Position, string consulSectionName = "consul", string httpClientSectionName = "httpClient") { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = FabioSettings.Position; + sectionName = FabioOptions.Position; } - var fabioOptions = builder.GetOptions(sectionName); - var consulOptions = builder.GetOptions(consulSectionName); - var httpClientOptions = builder.GetOptions(httpClientSectionName); + var fabioOptions = builder.GetOptions(sectionName); + var consulOptions = builder.GetOptions(consulSectionName); + var httpClientOptions = builder.GetOptions(httpClientSectionName); return builder.AddFabio(fabioOptions, httpClientOptions, b => b.AddConsul(consulOptions, httpClientOptions)); } @@ -34,19 +34,19 @@ public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, string sectio public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, Func buildOptions, Func buildConsulOptions, - HttpClientSettings httpClientOptions) + HttpClientOptions httpClientOptions) { var fabioOptions = buildOptions(new FabioOptionsBuilder()).Build(); return builder.AddFabio(fabioOptions, httpClientOptions, b => b.AddConsul(buildConsulOptions, httpClientOptions)); } - public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, FabioSettings fabioOptions, - ConsulSettings consulOptions, HttpClientSettings httpClientOptions) + public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, FabioOptions fabioOptions, + ConsulOptions consulOptions, HttpClientOptions httpClientOptions) => builder.AddFabio(fabioOptions, httpClientOptions, b => b.AddConsul(consulOptions, httpClientOptions)); - private static IGenocsBuilder AddFabio(this IGenocsBuilder builder, FabioSettings fabioOptions, - HttpClientSettings httpClientOptions, Action registerConsul) + private static IGenocsBuilder AddFabio(this IGenocsBuilder builder, FabioOptions fabioOptions, + HttpClientOptions httpClientOptions, Action registerConsul) { registerConsul(builder); builder.Services.AddSingleton(fabioOptions); @@ -87,7 +87,7 @@ private static IGenocsBuilder AddFabio(this IGenocsBuilder builder, FabioSetting public static void AddFabioHttpClient(this IGenocsBuilder builder, string clientName, string serviceName) => builder.Services.AddHttpClient(clientName) - .AddHttpMessageHandler(c => new FabioMessageHandler(c.GetRequiredService(), serviceName)); + .AddHttpMessageHandler(c => new FabioMessageHandler(c.GetRequiredService(), serviceName)); private static void UpdateConsulRegistration(this IServiceCollection services, ServiceRegistration registration) diff --git a/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs b/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs index cb622682..1da11604 100644 --- a/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs +++ b/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs @@ -1,11 +1,11 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; namespace Genocs.LoadBalancing.Fabio.Http; internal sealed class FabioHttpClient : GenocsHttpClient, IFabioHttpClient { - public FabioHttpClient(HttpClient client, HttpClientSettings options, IHttpClientSerializer serializer, + public FabioHttpClient(HttpClient client, HttpClientOptions options, IHttpClientSerializer serializer, ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) : base(client, options, serializer, correlationContextFactory, correlationIdFactory) { diff --git a/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs b/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs index 416fb18a..f8afb667 100644 --- a/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs +++ b/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs @@ -1,13 +1,13 @@ -using Genocs.LoadBalancing.Fabio.Options; +using Genocs.LoadBalancing.Fabio.Configurations; namespace Genocs.LoadBalancing.Fabio.MessageHandlers; internal sealed class FabioMessageHandler : DelegatingHandler { - private readonly FabioSettings _options; + private readonly FabioOptions _options; private readonly string _servicePath; - public FabioMessageHandler(FabioSettings options, string? serviceName = null) + public FabioMessageHandler(FabioOptions options, string? serviceName = null) { if (string.IsNullOrWhiteSpace(options.Url)) { diff --git a/src/Genocs.Logging/Options/AzureSettings.cs b/src/Genocs.Logging/Configurations/AzureOptions.cs similarity index 85% rename from src/Genocs.Logging/Options/AzureSettings.cs rename to src/Genocs.Logging/Configurations/AzureOptions.cs index 387881f8..dc2f326a 100644 --- a/src/Genocs.Logging/Options/AzureSettings.cs +++ b/src/Genocs.Logging/Configurations/AzureOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Azure application insights logging settings. /// -public class AzureSettings +public class AzureOptions { /// /// It define whether the Azure application insights logger and tracing are enabled or not. diff --git a/src/Genocs.Logging/Options/ConsoleSettings.cs b/src/Genocs.Logging/Configurations/ConsoleOptions.cs similarity index 75% rename from src/Genocs.Logging/Options/ConsoleSettings.cs rename to src/Genocs.Logging/Configurations/ConsoleOptions.cs index a647aa26..4289e516 100644 --- a/src/Genocs.Logging/Options/ConsoleSettings.cs +++ b/src/Genocs.Logging/Configurations/ConsoleOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Console Settings. /// -public class ConsoleSettings +public class ConsoleOptions { /// /// It define whether the console logger and tracing are enabled or not. diff --git a/src/Genocs.Logging/Options/ElkSettings.cs b/src/Genocs.Logging/Configurations/ElkOptions.cs similarity index 90% rename from src/Genocs.Logging/Options/ElkSettings.cs rename to src/Genocs.Logging/Configurations/ElkOptions.cs index b67d082d..b090e0ed 100644 --- a/src/Genocs.Logging/Options/ElkSettings.cs +++ b/src/Genocs.Logging/Configurations/ElkOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Elasticsearch Settings. /// -public class ElkSettings +public class ElkOptions { /// /// It define whether the Elasticsearch logger and tracing are enabled or not. diff --git a/src/Genocs.Logging/Options/LocalFileSettings.cs b/src/Genocs.Logging/Configurations/LocalFileOptions.cs similarity index 87% rename from src/Genocs.Logging/Options/LocalFileSettings.cs rename to src/Genocs.Logging/Configurations/LocalFileOptions.cs index bc5d0993..5b956ae1 100644 --- a/src/Genocs.Logging/Options/LocalFileSettings.cs +++ b/src/Genocs.Logging/Configurations/LocalFileOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// File settings for local file logging. /// -public class LocalFileSettings +public class LocalFileOptions { /// /// If enabled, local file logging is enabled. diff --git a/src/Genocs.Logging/Options/LoggerSettings.cs b/src/Genocs.Logging/Configurations/LoggerOptions.cs similarity index 67% rename from src/Genocs.Logging/Options/LoggerSettings.cs rename to src/Genocs.Logging/Configurations/LoggerOptions.cs index a604ae66..087f9da8 100644 --- a/src/Genocs.Logging/Options/LoggerSettings.cs +++ b/src/Genocs.Logging/Configurations/LoggerOptions.cs @@ -1,10 +1,9 @@ -namespace Genocs.Logging.Options; - +namespace Genocs.Logging.Configurations; /// /// Logger Settings. /// -public class LoggerSettings +public class LoggerOptions { /// /// Default section name. @@ -16,25 +15,25 @@ public class LoggerSettings /// /// The Console Logging and tracing Settings. /// - public ConsoleSettings? Console { get; set; } - public LocalFileSettings? File { get; set; } - public ElkSettings? Elk { get; set; } - public SeqSettings? Seq { get; set; } + public ConsoleOptions? Console { get; set; } + public LocalFileOptions? File { get; set; } + public ElkOptions? Elk { get; set; } + public SeqOptions? Seq { get; set; } /// /// Loki logging settings. /// - public LokiSettings? Loki { get; set; } + public LokiOptions? Loki { get; set; } /// /// Azure application insights logging settings. /// - public AzureSettings? Azure { get; set; } + public AzureOptions? Azure { get; set; } /// /// MongoDb logging settings. /// - public MongoSettings? Mongo { get; set; } + public MongoOptions? Mongo { get; set; } public IDictionary? MinimumLevelOverrides { get; set; } public IEnumerable? ExcludePaths { get; set; } diff --git a/src/Genocs.Logging/Options/LokiSettings.cs b/src/Genocs.Logging/Configurations/LokiOptions.cs similarity index 96% rename from src/Genocs.Logging/Options/LokiSettings.cs rename to src/Genocs.Logging/Configurations/LokiOptions.cs index 9c19d209..0910a170 100644 --- a/src/Genocs.Logging/Options/LokiSettings.cs +++ b/src/Genocs.Logging/Configurations/LokiOptions.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Relevant options for the Serilog Loki sink. @@ -24,7 +24,7 @@ /// CreateLevelLabel /// /// -public class LokiSettings +public class LokiOptions { /// /// Whether or not to enable Loki Logging. diff --git a/src/Genocs.Logging/Options/MongoSettings.cs b/src/Genocs.Logging/Configurations/MongoOptions.cs similarity index 76% rename from src/Genocs.Logging/Options/MongoSettings.cs rename to src/Genocs.Logging/Configurations/MongoOptions.cs index a8e2e47b..c2750e18 100644 --- a/src/Genocs.Logging/Options/MongoSettings.cs +++ b/src/Genocs.Logging/Configurations/MongoOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// MongoDb logging settings. /// -public class MongoSettings +public class MongoOptions { /// /// It define whether the MongoDb logger and tracing are enabled or not. diff --git a/src/Genocs.Logging/Options/SeqSettings.cs b/src/Genocs.Logging/Configurations/SeqOptions.cs similarity index 64% rename from src/Genocs.Logging/Options/SeqSettings.cs rename to src/Genocs.Logging/Configurations/SeqOptions.cs index 26432556..7fc4a973 100644 --- a/src/Genocs.Logging/Options/SeqSettings.cs +++ b/src/Genocs.Logging/Configurations/SeqOptions.cs @@ -1,6 +1,6 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; -public class SeqSettings +public class SeqOptions { public bool Enabled { get; set; } public string? Url { get; set; } diff --git a/src/Genocs.Logging/Extensions.cs b/src/Genocs.Logging/Extensions.cs index 76fe5817..0f9b7fd6 100644 --- a/src/Genocs.Logging/Extensions.cs +++ b/src/Genocs.Logging/Extensions.cs @@ -1,6 +1,6 @@ -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; -using Genocs.Logging.Options; +using Genocs.Logging.Configurations; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; @@ -31,16 +31,16 @@ public static IHostBuilder UseLogging( { if (string.IsNullOrWhiteSpace(loggerSectionName)) { - loggerSectionName = LoggerSettings.Position; + loggerSectionName = LoggerOptions.Position; } if (string.IsNullOrWhiteSpace(appSectionName)) { - appSectionName = AppSettings.Position; + appSectionName = AppOptions.Position; } - var loggerOptions = context.Configuration.GetOptions(loggerSectionName); - var appOptions = context.Configuration.GetOptions(appSectionName); + var loggerOptions = context.Configuration.GetOptions(loggerSectionName); + var appOptions = context.Configuration.GetOptions(appSectionName); MapOptions(loggerOptions, appOptions, loggerConfiguration, context.HostingEnvironment.EnvironmentName); configure?.Invoke(context, loggerConfiguration); @@ -52,48 +52,48 @@ public static IEndpointConventionBuilder MapLogLevelHandler( => builder.MapPost(endpointRoute, LevelSwitch); private static void MapOptions( - LoggerSettings loggerOptions, - AppSettings appOptions, + LoggerOptions loggerSettings, + AppOptions appSettings, LoggerConfiguration loggerConfiguration, string environmentName) { - LoggingLevelSwitch.MinimumLevel = GetLogEventLevel(loggerOptions.Level); + LoggingLevelSwitch.MinimumLevel = GetLogEventLevel(loggerSettings.Level); loggerConfiguration.Enrich.FromLogContext() .MinimumLevel.ControlledBy(LoggingLevelSwitch) .Enrich.WithProperty("Environment", environmentName) - .Enrich.WithProperty("Application", appOptions.Service) - .Enrich.WithProperty("Instance", appOptions.Instance) - .Enrich.WithProperty("Version", appOptions.Version); + .Enrich.WithProperty("Application", appSettings.Service) + .Enrich.WithProperty("Instance", appSettings.Instance) + .Enrich.WithProperty("Version", appSettings.Version); - foreach (var (key, value) in loggerOptions.Tags ?? new Dictionary()) + foreach (var (key, value) in loggerSettings.Tags ?? new Dictionary()) { loggerConfiguration.Enrich.WithProperty(key, value); } - foreach (var (key, value) in loggerOptions.MinimumLevelOverrides ?? new Dictionary()) + foreach (var (key, value) in loggerSettings.MinimumLevelOverrides ?? new Dictionary()) { var logLevel = GetLogEventLevel(value); loggerConfiguration.MinimumLevel.Override(key, logLevel); } - loggerOptions.ExcludePaths?.ToList().ForEach(p => loggerConfiguration.Filter + loggerSettings.ExcludePaths?.ToList().ForEach(p => loggerConfiguration.Filter .ByExcluding(Matching.WithProperty("RequestPath", n => n.EndsWith(p)))); - loggerOptions.ExcludeProperties?.ToList().ForEach(p => loggerConfiguration.Filter + loggerSettings.ExcludeProperties?.ToList().ForEach(p => loggerConfiguration.Filter .ByExcluding(Matching.WithProperty(p))); - Configure(loggerConfiguration, loggerOptions); + Configure(loggerConfiguration, loggerSettings); } - private static void Configure(LoggerConfiguration loggerConfiguration, LoggerSettings options) + private static void Configure(LoggerConfiguration loggerConfiguration, LoggerOptions options) { - var consoleOptions = options.Console ?? new ConsoleSettings(); - var fileOptions = options.File ?? new LocalFileSettings(); - var elkOptions = options.Elk ?? new ElkSettings(); - var seqOptions = options.Seq ?? new SeqSettings(); - var lokiOptions = options.Loki ?? new LokiSettings(); - var azureOptions = options.Azure ?? new AzureSettings(); + var consoleOptions = options.Console ?? new ConsoleOptions(); + var fileOptions = options.File ?? new LocalFileOptions(); + var elkOptions = options.Elk ?? new ElkOptions(); + var seqOptions = options.Seq ?? new SeqOptions(); + var lokiOptions = options.Loki ?? new LokiOptions(); + var azureOptions = options.Azure ?? new AzureOptions(); // console if (consoleOptions.Enabled) diff --git a/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs index ffd23f2e..3c0bb4b0 100644 --- a/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs +++ b/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs @@ -1,54 +1,54 @@ -using Genocs.Metrics.AppMetrics.Options; +using Genocs.Metrics.AppMetrics.Configurations; namespace Genocs.Metrics.AppMetrics.Builders; -internal sealed class MetricsOptionsBuilder : IMetricsOptionsBuilder +internal sealed class MetricsOptionsBuilder : IMetricsSettingsBuilder { private readonly MetricsSettings _options = new(); - public IMetricsOptionsBuilder Enable(bool enabled) + public IMetricsSettingsBuilder Enable(bool enabled) { _options.Enabled = enabled; return this; } - public IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled) + public IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled) { _options.InfluxEnabled = influxEnabled; return this; } - public IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled) + public IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled) { _options.PrometheusEnabled = prometheusEnabled; return this; } - public IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter) + public IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter) { _options.PrometheusFormatter = prometheusFormatter; return this; } - public IMetricsOptionsBuilder WithInfluxUrl(string influxUrl) + public IMetricsSettingsBuilder WithInfluxUrl(string influxUrl) { _options.InfluxUrl = influxUrl; return this; } - public IMetricsOptionsBuilder WithDatabase(string database) + public IMetricsSettingsBuilder WithDatabase(string database) { _options.Database = database; return this; } - public IMetricsOptionsBuilder WithInterval(int interval) + public IMetricsSettingsBuilder WithInterval(int interval) { _options.Interval = interval; return this; } - public IMetricsOptionsBuilder WithTags(IDictionary tags) + public IMetricsSettingsBuilder WithTags(IDictionary tags) { _options.Tags = tags; return this; diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs new file mode 100644 index 00000000..e9964080 --- /dev/null +++ b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs @@ -0,0 +1,14 @@ +namespace Genocs.Metrics.AppMetrics.Configurations; + +public interface IMetricsSettingsBuilder +{ + IMetricsSettingsBuilder Enable(bool enabled); + IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled); + IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled); + IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter); + IMetricsSettingsBuilder WithInfluxUrl(string influxUrl); + IMetricsSettingsBuilder WithDatabase(string database); + IMetricsSettingsBuilder WithInterval(int interval); + IMetricsSettingsBuilder WithTags(IDictionary tags); + MetricsSettings Build(); +} \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Options/MetricsSettings.cs b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs similarity index 96% rename from src/Genocs.Metrics/AppMetrics/Options/MetricsSettings.cs rename to src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs index 19f0144c..1a3f226f 100644 --- a/src/Genocs.Metrics/AppMetrics/Options/MetricsSettings.cs +++ b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Metrics.AppMetrics.Options; +namespace Genocs.Metrics.AppMetrics.Configurations; /// /// The MetricsSettings class. diff --git a/src/Genocs.Metrics/AppMetrics/Extensions.cs b/src/Genocs.Metrics/AppMetrics/Extensions.cs index 4829b458..54f939f6 100644 --- a/src/Genocs.Metrics/AppMetrics/Extensions.cs +++ b/src/Genocs.Metrics/AppMetrics/Extensions.cs @@ -4,11 +4,11 @@ using App.Metrics.AspNetCore.Health.Endpoints; using App.Metrics.AspNetCore.Tracking; using App.Metrics.Formatters.Prometheus; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; using Genocs.Metrics.AppMetrics; using Genocs.Metrics.AppMetrics.Builders; -using Genocs.Metrics.AppMetrics.Options; +using Genocs.Metrics.AppMetrics.Configurations; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -37,11 +37,11 @@ public static IGenocsBuilder AddMetrics( if (string.IsNullOrWhiteSpace(appSectionName)) { - appSectionName = AppSettings.Position; + appSectionName = AppOptions.Position; } var metricsOptions = builder.GetOptions(metricsSectionName); - var appOptions = builder.GetOptions(appSectionName); + var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); } @@ -49,7 +49,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - Func buildOptions, + Func buildOptions, string appSectionName = AppSectionName) { if (string.IsNullOrWhiteSpace(appSectionName)) @@ -58,7 +58,7 @@ public static IGenocsBuilder AddMetrics( } var metricsOptions = buildOptions(new MetricsOptionsBuilder()).Build(); - var appOptions = builder.GetOptions(appSectionName); + var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); } @@ -66,11 +66,11 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's and IIS ServerOptions AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - MetricsSettings metricsOptions, - AppSettings appOptions) + MetricsSettings metricsSettings, + AppOptions appSettings) { - builder.Services.AddSingleton(metricsOptions); - if (!builder.TryRegister(RegistryName) || !metricsOptions.Enabled || _initialized) + builder.Services.AddSingleton(metricsSettings); + if (!builder.TryRegister(RegistryName) || !metricsSettings.Enabled || _initialized) { return builder; } @@ -79,7 +79,7 @@ public static IGenocsBuilder AddMetrics( var metricsBuilder = new MetricsBuilder().Configuration.Configure(cfg => { - var tags = metricsOptions.Tags; + var tags = metricsSettings.Tags; if (tags is null) { return; @@ -88,17 +88,17 @@ public static IGenocsBuilder AddMetrics( tags.TryGetValue("app", out string? app); tags.TryGetValue("env", out string? env); tags.TryGetValue("server", out string? server); - cfg.AddAppTag(string.IsNullOrWhiteSpace(app) ? appOptions.Service : app); + cfg.AddAppTag(string.IsNullOrWhiteSpace(app) ? appSettings.Service : app); cfg.AddEnvTag(string.IsNullOrWhiteSpace(env) ? null : env); cfg.AddServerTag(string.IsNullOrWhiteSpace(server) ? null : server); - if (!string.IsNullOrWhiteSpace(appOptions.Instance)) + if (!string.IsNullOrWhiteSpace(appSettings.Instance)) { - cfg.GlobalTags.Add("instance", appOptions.Instance); + cfg.GlobalTags.Add("instance", appSettings.Instance); } - if (!string.IsNullOrWhiteSpace(appOptions.Version)) + if (!string.IsNullOrWhiteSpace(appSettings.Version)) { - cfg.GlobalTags.Add("version", appOptions.Version); + cfg.GlobalTags.Add("version", appSettings.Version); } foreach (var tag in tags) @@ -115,19 +115,19 @@ public static IGenocsBuilder AddMetrics( } }); - if (metricsOptions.InfluxEnabled) + if (metricsSettings.InfluxEnabled) { metricsBuilder.Report.ToInfluxDb(o => { - o.InfluxDb.Database = metricsOptions.Database; - o.InfluxDb.BaseUri = new Uri(metricsOptions.InfluxUrl!); + o.InfluxDb.Database = metricsSettings.Database; + o.InfluxDb.BaseUri = new Uri(metricsSettings.InfluxUrl!); o.InfluxDb.CreateDataBaseIfNotExists = true; - o.FlushInterval = TimeSpan.FromSeconds(metricsOptions.Interval); + o.FlushInterval = TimeSpan.FromSeconds(metricsSettings.Interval); }); } var metrics = metricsBuilder.Build(); - var metricsWebHostOptions = GetMetricsWebHostOptions(metricsOptions); + var metricsWebHostOptions = GetMetricsWebHostOptions(metricsSettings); using var serviceProvider = builder.Services.BuildServiceProvider(); var configuration = builder.Configuration ?? serviceProvider.GetRequiredService(); diff --git a/src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs deleted file mode 100644 index dff0200c..00000000 --- a/src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Genocs.Metrics.AppMetrics.Options; - -namespace Genocs.Metrics.AppMetrics; - -public interface IMetricsOptionsBuilder -{ - IMetricsOptionsBuilder Enable(bool enabled); - IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled); - IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled); - IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter); - IMetricsOptionsBuilder WithInfluxUrl(string influxUrl); - IMetricsOptionsBuilder WithDatabase(string database); - IMetricsOptionsBuilder WithInterval(int interval); - IMetricsOptionsBuilder WithTags(IDictionary tags); - MetricsSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs b/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs index c799988e..67fe7ec6 100644 --- a/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs +++ b/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs @@ -1,5 +1,4 @@ using Genocs.Persistence.MongoDb.Encryptions; -using Genocs.Persistence.MongoDb.Options; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using Moq; diff --git a/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs b/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs index 99e3a861..512a9838 100644 --- a/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs +++ b/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs @@ -1,11 +1,10 @@ -using Genocs.Persistence.MongoDb.Options; -using Genocs.Persistence.MongoDb.Repositories; +using Genocs.Persistence.MongoDb.Configurations; namespace Genocs.Persistence.MongoDb.Builders; internal sealed class MongoDbOptionsBuilder : IMongoDbOptionsBuilder { - private readonly MongoDbSettings _options = new(); + private readonly MongoDbOptions _options = new(); public IMongoDbOptionsBuilder WithConnectionString(string connectionString) { @@ -25,6 +24,6 @@ public IMongoDbOptionsBuilder WithSeed(bool seed) return this; } - public MongoDbSettings Build() + public MongoDbOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs b/src/Genocs.Persistence.MongoDb/Configurations/IMongoDbOptionsBuilder.cs similarity index 87% rename from src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs rename to src/Genocs.Persistence.MongoDb/Configurations/IMongoDbOptionsBuilder.cs index 36e91713..714aa05a 100644 --- a/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs +++ b/src/Genocs.Persistence.MongoDb/Configurations/IMongoDbOptionsBuilder.cs @@ -1,6 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; - -namespace Genocs.Persistence.MongoDb.Repositories; +namespace Genocs.Persistence.MongoDb.Configurations; /// /// The MongoDB Options Builder. @@ -32,5 +30,5 @@ public interface IMongoDbOptionsBuilder /// Get the settings. /// /// MongoDbSettings instance. - MongoDbSettings Build(); + MongoDbOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs new file mode 100644 index 00000000..70db85df --- /dev/null +++ b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs @@ -0,0 +1,69 @@ +namespace Genocs.Persistence.MongoDb.Configurations; + +/// +/// MongoDb encryption database Settings. +/// +public class MongoDbEncryptionOptions +{ + + /// + /// Default Section name. + /// + public const string Position = "MongoDbEncryption"; + + /// + /// The Database connection string. + /// + public string ConnectionString { get; set; } = default!; + + /// + /// The shared library used to encrypt. + /// + public string LibPath { get; set; } = default!; + + /// + /// Azure Tenant Id. + /// + public string TenantId { get; set; } = default!; + + /// + /// Azure Client Id. + /// + public string ClientId { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string ClientSecret { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string KeyName { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string KeyVersion { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string KeyVaultEndpoint { get; set; } = default!; + + /// + /// Check if the MongoDbSettings object contains valid data. + /// + /// MongoDbSettings object. + /// return true if valid otherwise false. + public static bool IsValid(MongoDbEncryptionOptions settings) + { + if (settings is null) return false; + + if (string.IsNullOrWhiteSpace(settings.ConnectionString)) return false; + if (string.IsNullOrWhiteSpace(settings.LibPath)) return false; + + return true; + + } +} diff --git a/src/Genocs.Persistence.MongoDb/Options/MongoDbSettings.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbOptions.cs similarity index 91% rename from src/Genocs.Persistence.MongoDb/Options/MongoDbSettings.cs rename to src/Genocs.Persistence.MongoDb/Configurations/MongoDbOptions.cs index 6dc46179..67c2d753 100644 --- a/src/Genocs.Persistence.MongoDb/Options/MongoDbSettings.cs +++ b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbOptions.cs @@ -1,11 +1,11 @@ using System.ComponentModel; -namespace Genocs.Persistence.MongoDb.Options; +namespace Genocs.Persistence.MongoDb.Configurations; /// /// MongoDb database Settings. /// -public class MongoDbSettings +public class MongoDbOptions { /// /// Default Section name. @@ -43,7 +43,7 @@ public class MongoDbSettings /// /// MongoDbSettings object. /// return true if valid otherwise false. - public static bool IsValid(MongoDbSettings settings) + public static bool IsValid(MongoDbOptions settings) { if (settings is null) return false; diff --git a/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs b/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs index ed2200f7..911344a6 100644 --- a/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs +++ b/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs @@ -1,4 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; @@ -15,11 +15,11 @@ public class AzureInitializer /// Setup the client /// /// - public AutoEncryptionOptions EncryptionOptions(IOptions options) + public AutoEncryptionOptions EncryptionOptions(IOptions options) { // Ge settings - MongoDbEncryptionSettings settings = options.Value; - MongoDbEncryptionSettings.IsValid(settings); + MongoDbEncryptionOptions settings = options.Value; + MongoDbEncryptionOptions.IsValid(settings); // start-kmsproviders var kmsProviders = new Dictionary>(); diff --git a/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs b/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs index d418b605..06d4b5a4 100644 --- a/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs +++ b/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs @@ -1,9 +1,9 @@ using Genocs.Common.Types; using Genocs.Core.Builders; using Genocs.Persistence.MongoDb.Builders; +using Genocs.Persistence.MongoDb.Configurations; using Genocs.Persistence.MongoDb.Factories; using Genocs.Persistence.MongoDb.Initializers; -using Genocs.Persistence.MongoDb.Options; using Genocs.Persistence.MongoDb.Repositories; using Genocs.Persistence.MongoDb.Repositories.Clean; using Genocs.Persistence.MongoDb.Repositories.Mentor; @@ -34,16 +34,16 @@ public static class MongoDbExtensions /// The Genocs builder. public static IGenocsBuilder AddMongo( this IGenocsBuilder builder, - string sectionName = MongoDbSettings.Position, + string sectionName = MongoDbOptions.Position, Type? seederType = null, bool registerConventions = true) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = MongoDbSettings.Position; + sectionName = MongoDbOptions.Position; } - var mongoOptions = builder.GetOptions(sectionName); + var mongoOptions = builder.GetOptions(sectionName); return builder.AddMongo(mongoOptions, seederType, registerConventions); } @@ -70,32 +70,32 @@ public static IGenocsBuilder AddMongo( /// Setup MongoDb support. /// /// The Genocs builder. - /// The settings. + /// The settings. /// /// /// The Genocs builder. public static IGenocsBuilder AddMongo( this IGenocsBuilder builder, - MongoDbSettings mongoOptions, + MongoDbOptions options, Type? seederType = null, bool registerConventions = true) { - if (!builder.TryRegister(MongoDbSettings.Position)) + if (!builder.TryRegister(MongoDbOptions.Position)) { return builder; } - if (mongoOptions.SetRandomDatabaseSuffix) + if (options.SetRandomDatabaseSuffix) { string suffix = $"{Guid.NewGuid():N}"; Console.WriteLine($"Setting a random MongoDB database suffix: '{suffix}'."); - mongoOptions.Database = $"{mongoOptions.Database}_{suffix}"; + options.Database = $"{options.Database}_{suffix}"; } - builder.Services.AddSingleton(mongoOptions); + builder.Services.AddSingleton(options); builder.Services.AddSingleton(sp => { - var options = sp.GetRequiredService(); + var options = sp.GetRequiredService(); MongoClientSettings clientSettings = MongoClientSettings.FromConnectionString(options.ConnectionString); @@ -109,7 +109,7 @@ public static IGenocsBuilder AddMongo( builder.Services.AddTransient(sp => { - var options = sp.GetRequiredService(); + var options = sp.GetRequiredService(); var client = sp.GetRequiredService(); return client.GetDatabase(options.Database); }); @@ -168,13 +168,13 @@ public static IGenocsBuilder AddMongoRepository( /// The Genocs builder. public static IGenocsBuilder AddMongoFast( this IGenocsBuilder builder, - string sectionName = MongoDbSettings.Position, + string sectionName = MongoDbOptions.Position, bool registerConventions = true) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = MongoDbSettings.Position; + sectionName = MongoDbOptions.Position; } var section = builder.Configuration.GetSection(sectionName); @@ -184,7 +184,7 @@ public static IGenocsBuilder AddMongoFast( return builder; } - builder.Services.Configure(section); + builder.Services.Configure(section); builder.Services.AddSingleton(); builder.Services.AddScoped(typeof(IMongoDbRepository<>), typeof(MongoDbRepository<>)); diff --git a/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs b/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs index 11b4c6ad..dd60928e 100644 --- a/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs +++ b/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs @@ -1,4 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; using Genocs.Persistence.MongoDb.Repositories; using MongoDB.Driver; @@ -11,7 +11,7 @@ internal sealed class MongoDbInitializer : IMongoDbInitializer private readonly IMongoDatabase _database; private readonly IMongoDbSeeder _seeder; - public MongoDbInitializer(IMongoDatabase database, IMongoDbSeeder seeder, MongoDbSettings options) + public MongoDbInitializer(IMongoDatabase database, IMongoDbSeeder seeder, MongoDbOptions options) { _database = database; _seeder = seeder; diff --git a/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs b/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs index 412c8475..24485ab7 100644 --- a/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs +++ b/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs @@ -1,5 +1,4 @@ -using Genocs.Persistence.MongoDb.Encryptions; -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Driver.Core.Extensions.DiagnosticSources; @@ -8,35 +7,35 @@ namespace Genocs.Persistence.MongoDb; /// -/// The MongoDatabaseProvider +/// The MongoDatabaseProvider. /// public class MongoDatabaseProvider : IMongoDatabaseProvider { /// - /// Reference to MongoClient + /// Reference to MongoClient. /// public IMongoClient MongoClient { get; private set; } /// - /// Reference to Database + /// Reference to Database. /// public IMongoDatabase Database { get; private set; } /// - /// Default Constructor + /// Default Constructor. /// /// /// /// - public MongoDatabaseProvider(IOptions options, IOptions encrypOptions) + public MongoDatabaseProvider(IOptions options, IOptions encrypOptions) { if (options == null) throw new NullReferenceException(nameof(options)); - MongoDbSettings dBSettings = options.Value; + MongoDbOptions dBSettings = options.Value; if (dBSettings == null) throw new NullReferenceException(nameof(dBSettings)); - if (!MongoDbSettings.IsValid(dBSettings)) throw new InvalidOperationException($"{nameof(dBSettings)} is invalid"); + if (!MongoDbOptions.IsValid(dBSettings)) throw new InvalidOperationException($"{nameof(dBSettings)} is invalid"); MongoClientSettings clientSettings = MongoClientSettings.FromConnectionString(dBSettings.ConnectionString); diff --git a/src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs b/src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs deleted file mode 100644 index 35e03b2c..00000000 --- a/src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace Genocs.Persistence.MongoDb.Options -{ - /// - /// MongoDb encryption database Settings - /// - public class MongoDbEncryptionSettings - { - - /// - /// Default Section name - /// - public const string Position = "MongoDbEncryption"; - - /// - /// The Database connection string - /// - public string ConnectionString { get; set; } = default!; - - /// - /// The shared library used to encrypt - /// - public string LibPath { get; set; } = default!; - - /// - /// Azure Tenant Id - /// - public string TenantId { get; set; } = default!; - - /// - /// Azure Client Id - /// - public string ClientId { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string ClientSecret { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyName { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyVersion { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyVaultEndpoint { get; set; } = default!; - - /// - /// Check if the MongoDbSettings object contains valid data - /// - /// MongoDbSettings object - /// return true if valid otherwise false - public static bool IsValid(MongoDbEncryptionSettings settings) - { - if (settings is null) return false; - - if (string.IsNullOrWhiteSpace(settings.ConnectionString)) return false; - if (string.IsNullOrWhiteSpace(settings.LibPath)) return false; - - return true; - - } - } -} diff --git a/src/Genocs.Tracing/Extensions.cs b/src/Genocs.Tracing/Extensions.cs index beb99dfb..b47ad831 100644 --- a/src/Genocs.Tracing/Extensions.cs +++ b/src/Genocs.Tracing/Extensions.cs @@ -1,7 +1,7 @@ using Azure.Monitor.OpenTelemetry.Exporter; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; -using Genocs.Logging.Options; +using Genocs.Logging.Configurations; using Genocs.Tracing.Jaeger.Options; using Jaeger.Samplers; using Jaeger.Senders.Thrift; @@ -28,7 +28,7 @@ public static class Extensions public static IGenocsBuilder AddOpenTelemetry(this IGenocsBuilder builder) { - var appOptions = builder.GetOptions(AppSettings.Position); + var appOptions = builder.GetOptions(AppOptions.Position); // No OpenTelemetryTracing in case of missing ServiceName if (string.IsNullOrWhiteSpace(appOptions.Service)) @@ -47,7 +47,7 @@ public static IGenocsBuilder AddOpenTelemetry(this IGenocsBuilder builder) .AddEnvironmentVariableDetector()) .AddSource("*"); - var loggerOptions = builder.GetOptions(LoggerSettings.Position); + var loggerOptions = builder.GetOptions(LoggerOptions.Position); // No OpenTelemetryTracing in case of missing LoggerSettings if (loggerOptions != null) diff --git a/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs b/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs index 52a4864a..24036299 100644 --- a/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs +++ b/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs @@ -15,20 +15,28 @@ public DispatcherEndpointsBuilder(IEndpointsBuilder builder) _builder = builder; } - public IDispatcherEndpointsBuilder Get(string path, Func? context = null, - Action? endpoint = null, bool auth = false, string? roles = null, - params string[] policies) + public IDispatcherEndpointsBuilder Get( + string path, + Func? context = null, + Action? endpoint = null, + bool auth = false, + string? roles = null, + params string[] policies) { _builder.Get(path, context, endpoint, auth, roles, policies); return this; } - public IDispatcherEndpointsBuilder Get(string path, - Func? beforeDispatch = null, - Func? afterDispatch = null, - Action? endpoint = null, bool auth = false, string? roles = null, - params string[] policies) where TQuery : class, IQuery + public IDispatcherEndpointsBuilder Get( + string path, + Func? beforeDispatch = null, + Func? afterDispatch = null, + Action? endpoint = null, + bool auth = false, + string? roles = null, + params string[] policies) + where TQuery : class, IQuery { _builder.Get(path, async (query, ctx) => { diff --git a/src/Genocs.WebApi.Security/CertificateMiddleware.cs b/src/Genocs.WebApi.Security/CertificateMiddleware.cs index ea5e18d8..e976c994 100644 --- a/src/Genocs.WebApi.Security/CertificateMiddleware.cs +++ b/src/Genocs.WebApi.Security/CertificateMiddleware.cs @@ -1,3 +1,4 @@ +using Genocs.WebApi.Security.Configurations; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System.Security.Cryptography.X509Certificates; @@ -8,16 +9,16 @@ internal sealed class CertificateMiddleware : IMiddleware { private readonly ICertificatePermissionValidator _certificatePermissionValidator; private readonly ILogger _logger; - private readonly SecuritySettings.CertificateSettings _options; + private readonly SecurityOptions.CertificateOptions _options; private readonly HashSet _allowedHosts; - private readonly IDictionary _acl; + private readonly IDictionary _acl; private readonly IDictionary _subjects = new Dictionary(); private readonly bool _validateAcl; private readonly bool _skipRevocationCheck; public CertificateMiddleware( ICertificatePermissionValidator certificatePermissionValidator, - SecuritySettings options, + SecurityOptions options, ILogger logger) { _certificatePermissionValidator = certificatePermissionValidator; @@ -32,7 +33,7 @@ public CertificateMiddleware( return; } - _acl = new Dictionary(); + _acl = new Dictionary(); foreach (var (key, acl) in _options.Acl) { if (!string.IsNullOrWhiteSpace(acl.ValidIssuer) && !acl.ValidIssuer.StartsWith("CN=")) @@ -77,7 +78,7 @@ public Task InvokeAsync(HttpContext context, RequestDelegate next) return next(context); } - SecuritySettings.CertificateSettings.AclSettings acl; + SecurityOptions.CertificateOptions.AclOptions acl; if (_subjects.TryGetValue(certificate.Subject, out string? subject)) { if (!_acl.TryGetValue(subject, out var existingAcl)) diff --git a/src/Genocs.WebApi.Security/Options/SecuritySettings.cs b/src/Genocs.WebApi.Security/Configurations/SecurityOptions.cs similarity index 72% rename from src/Genocs.WebApi.Security/Options/SecuritySettings.cs rename to src/Genocs.WebApi.Security/Configurations/SecurityOptions.cs index 08fb937a..dc4c04ee 100644 --- a/src/Genocs.WebApi.Security/Options/SecuritySettings.cs +++ b/src/Genocs.WebApi.Security/Configurations/SecurityOptions.cs @@ -1,22 +1,22 @@ -namespace Genocs.WebApi.Security; +namespace Genocs.WebApi.Security.Configurations; -public class SecuritySettings +public class SecurityOptions { - public CertificateSettings? Certificate { get; set; } + public CertificateOptions? Certificate { get; set; } - public class CertificateSettings + public class CertificateOptions { public bool Enabled { get; set; } public string? Header { get; set; } public bool AllowSubdomains { get; set; } public IEnumerable? AllowedDomains { get; set; } public IEnumerable? AllowedHosts { get; set; } - public IDictionary? Acl { get; set; } + public IDictionary? Acl { get; set; } public bool SkipRevocationCheck { get; set; } public string GetHeaderName() => string.IsNullOrWhiteSpace(Header) ? "Certificate" : Header; - public class AclSettings + public class AclOptions { public string? ValidIssuer { get; set; } public string? ValidThumbprint { get; set; } diff --git a/src/Genocs.WebApi.Security/Extensions.cs b/src/Genocs.WebApi.Security/Extensions.cs index a615b8c6..d81de65b 100644 --- a/src/Genocs.WebApi.Security/Extensions.cs +++ b/src/Genocs.WebApi.Security/Extensions.cs @@ -1,4 +1,5 @@ using Genocs.Core.Builders; +using Genocs.WebApi.Security.Configurations; using Microsoft.AspNetCore.Authentication.Certificate; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -16,7 +17,7 @@ public static IGenocsBuilder AddCertificateAuthentication( string sectionName = SectionName, Type? permissionValidatorType = null) { - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); builder.Services.AddSingleton(options); if (!builder.TryRegister(RegistryName)) { @@ -56,7 +57,7 @@ public static IGenocsBuilder AddCertificateAuthentication( public static IApplicationBuilder UseCertificateAuthentication(this IApplicationBuilder app) { - var options = app.ApplicationServices.GetRequiredService(); + var options = app.ApplicationServices.GetRequiredService(); if (options.Certificate is null || !options.Certificate.Enabled) { return app; diff --git a/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs similarity index 93% rename from src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs rename to src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs index 90e21984..81c7e66c 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs @@ -1,4 +1,6 @@ -namespace Genocs.WebApi.Swagger.Docs.Builders; +using Genocs.WebApi.Swagger.Configurations; + +namespace Genocs.WebApi.Swagger.Builders; internal sealed class SwaggerOptionsBuilder : ISwaggerOptionsBuilder { diff --git a/src/Genocs.WebApi.Swagger/Docs/ISwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Configurations/ISwaggerOptionsBuilder.cs similarity index 91% rename from src/Genocs.WebApi.Swagger/Docs/ISwaggerOptionsBuilder.cs rename to src/Genocs.WebApi.Swagger/Configurations/ISwaggerOptionsBuilder.cs index 1527d2a4..e030d897 100644 --- a/src/Genocs.WebApi.Swagger/Docs/ISwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Configurations/ISwaggerOptionsBuilder.cs @@ -1,4 +1,4 @@ -namespace Genocs.WebApi.Swagger.Docs; +namespace Genocs.WebApi.Swagger.Configurations; public interface ISwaggerOptionsBuilder { diff --git a/src/Genocs.WebApi.Swagger/Docs/SwaggerOptions.cs b/src/Genocs.WebApi.Swagger/Configurations/SwaggerOptions.cs similarity index 88% rename from src/Genocs.WebApi.Swagger/Docs/SwaggerOptions.cs rename to src/Genocs.WebApi.Swagger/Configurations/SwaggerOptions.cs index 30e30d6c..1c46822c 100644 --- a/src/Genocs.WebApi.Swagger/Docs/SwaggerOptions.cs +++ b/src/Genocs.WebApi.Swagger/Configurations/SwaggerOptions.cs @@ -1,4 +1,4 @@ -namespace Genocs.WebApi.Swagger.Docs; +namespace Genocs.WebApi.Swagger.Configurations; public class SwaggerOptions { diff --git a/src/Genocs.WebApi.Swagger/Docs/Extensions.cs b/src/Genocs.WebApi.Swagger/Docs/Extensions.cs index b752a211..84f0d6b2 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Extensions.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Extensions.cs @@ -1,5 +1,6 @@ using Genocs.Core.Builders; -using Genocs.WebApi.Swagger.Docs.Builders; +using Genocs.WebApi.Swagger.Builders; +using Genocs.WebApi.Swagger.Configurations; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; diff --git a/src/Genocs.WebApi.Swagger/Extensions.cs b/src/Genocs.WebApi.Swagger/Extensions.cs index 585d9ceb..af8d231c 100644 --- a/src/Genocs.WebApi.Swagger/Extensions.cs +++ b/src/Genocs.WebApi.Swagger/Extensions.cs @@ -1,4 +1,5 @@ using Genocs.Core.Builders; +using Genocs.WebApi.Swagger.Configurations; using Genocs.WebApi.Swagger.Docs; using Genocs.WebApi.Swagger.Filters; using Microsoft.Extensions.DependencyInjection; diff --git a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs index a2dae299..2653d378 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs @@ -1,7 +1,7 @@ using Genocs.APIGateway.Framework; using Genocs.APIGateway.Options; using Genocs.Auth; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; using Genocs.MessageBrokers.RabbitMQ; using Genocs.Metrics.Prometheus; @@ -90,7 +90,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { endpoints.MapGet("/", async context => { - await context.Response.WriteAsync(context.RequestServices.GetService()?.Name ?? "Service"); + await context.Response.WriteAsync(context.RequestServices.GetService()?.Name ?? "Service"); }); endpoints.MapReverseProxy(); diff --git a/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs b/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs index b9231895..198edd60 100644 --- a/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs +++ b/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs @@ -1,5 +1,5 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.MessageBrokers; using Microsoft.AspNetCore.Http; @@ -14,7 +14,7 @@ internal class CorrelationIdFactory : ICorrelationIdFactory private readonly string _header; public CorrelationIdFactory(IMessagePropertiesAccessor messagePropertiesAccessor, - IHttpContextAccessor httpContextAccessor, HttpClientSettings httpClientOptions) + IHttpContextAccessor httpContextAccessor, HttpClientOptions httpClientOptions) { _messagePropertiesAccessor = messagePropertiesAccessor; _httpContextAccessor = httpContextAccessor; diff --git a/src/apps/identity/Genocs.Identities.Application/Extensions.cs b/src/apps/identity/Genocs.Identities.Application/Extensions.cs index 593c58a1..0d19358d 100644 --- a/src/apps/identity/Genocs.Identities.Application/Extensions.cs +++ b/src/apps/identity/Genocs.Identities.Application/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Auth; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; using Genocs.Core.CQRS.Commands; using Genocs.Core.CQRS.Events; @@ -106,7 +106,7 @@ public static IApplicationBuilder UseCore(this IApplicationBuilder app) } public static async Task GetAppName(this HttpContext httpContext) - => await httpContext.Response.WriteAsync(httpContext.RequestServices?.GetService()?.Name ?? string.Empty); + => await httpContext.Response.WriteAsync(httpContext.RequestServices?.GetService()?.Name ?? string.Empty); internal static CorrelationContext GetCorrelationContext(this IHttpContextAccessor accessor) => accessor.HttpContext?.Request.Headers.TryGetValue("Correlation-Context", out var json) is true diff --git a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs index 1577cb9b..802e1de3 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs +++ b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs @@ -1,9 +1,9 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.Orders.WebApi.DTO; using Genocs.Secrets.Vault; using Genocs.Secrets.Vault.Options; -using Genocs.WebApi.Security; +using Genocs.WebApi.Security.Configurations; namespace Genocs.Orders.WebApi.Services; @@ -22,13 +22,13 @@ public class ProductServiceClient : IProductServiceClient /// The certification service. /// /// - /// + /// public ProductServiceClient( IHttpClient client, ICertificatesService certificatesService, - HttpClientSettings httpClientOptions, + HttpClientOptions httpClientOptions, VaultSettings vaultOptions, - SecuritySettings securitySettings) + SecurityOptions securityOptions) { _client = client ?? throw new ArgumentNullException(nameof(client)); @@ -43,9 +43,9 @@ public ProductServiceClient( throw new ArgumentNullException(nameof(vaultOptions)); } - if (securitySettings is null) + if (securityOptions is null) { - throw new ArgumentNullException(nameof(securitySettings)); + throw new ArgumentNullException(nameof(securityOptions)); } string? url = httpClientOptions?.Services?["products"]; @@ -58,7 +58,7 @@ public ProductServiceClient( _url = url; if (!vaultOptions.Enabled || vaultOptions.Pki?.Enabled != true || - securitySettings.Certificate?.Enabled != true) + securityOptions.Certificate?.Enabled != true) { return; } @@ -69,7 +69,7 @@ public ProductServiceClient( return; } - string header = securitySettings.Certificate.GetHeaderName(); + string header = securityOptions.Certificate.GetHeaderName(); string certificateData = certificate.GetRawCertDataString(); _client.SetHeaders(h => h.Add(header, certificateData)); } diff --git a/testEnvironments.json b/testEnvironments.json new file mode 100644 index 00000000..a110b57d --- /dev/null +++ b/testEnvironments.json @@ -0,0 +1,17 @@ +{ + "version": "1", + "environments": [ + // See https://aka.ms/remotetesting for more details + // about how to configure remote environments. + //{ + // "name": "WSL Ubuntu", + // "type": "wsl", + // "wslDistribution": "Ubuntu" + //}, + //{ + // "name": "Docker dotnet/sdk", + // "type": "docker", + // "dockerImage": "mcr.microsoft.com/dotnet/sdk" + //} + ] +} \ No newline at end of file From 34b35b2c4979c95b957f144cf7e680d16fca450d Mon Sep 17 00:00:00 2001 From: Giovanni Nocco Date: Sat, 22 Jun 2024 09:52:08 +0200 Subject: [PATCH 06/17] Cleanup data after uniform naming conventions --- src/Genocs.Auth/Extensions.cs | 138 +++++++++--------- .../ExternalServiceOptions.cs} | 2 +- .../RabbitMQOptions.cs} | 2 +- .../SecretOptions.cs} | 2 +- .../Controllers/HomeController.cs | 4 +- .../Extensions/BuilderExtensions.cs | 3 +- .../Extensions/ServiceCollectionExtensions.cs | 14 +- .../Services/ExternalServiceClient.cs | 4 +- src/Genocs.Core.Demo.WebApi/Program.cs | 5 +- .../Configurations/ConsulOptions.cs | 4 +- .../ConsulServiceDiscoveryMessageHandler.cs | 14 +- .../Configurations/HttpClientOptions.cs | 4 +- src/Genocs.Logging/Extensions.cs | 24 +-- .../Internals/MongoMessageOutbox.cs | 4 +- .../Internals/MongoOutboxInitializer.cs | 6 +- .../OutboxOptions.cs} | 4 +- .../MessageOutboxConfigurator.cs | 6 +- .../Extensions.cs | 4 +- .../IMessageOutboxConfigurator.cs | 4 +- .../Outbox/InMemoryMessageOutbox.cs | 4 +- .../Processors/OutboxProcessor.cs | 6 +- .../Builders/MetricsOptionsBuilder.cs | 22 +-- .../Configurations/IMetricsOptionsBuilder.cs | 14 ++ .../Configurations/IMetricsSettingsBuilder.cs | 14 -- .../{MetricsSettings.cs => MetricsOptions.cs} | 2 +- src/Genocs.Metrics/AppMetrics/Extensions.cs | 12 +- .../Extensions.cs | 9 +- .../VaultOptions.cs} | 16 +- src/Genocs.Secrets.Vault/Extensions.cs | 40 +++-- .../Internals/CertificatesIssuer.cs | 6 +- .../Internals/KeyValueSecrets.cs | 6 +- .../Internals/VaultHostedService.cs | 6 +- .../MessagingOptions.cs} | 8 +- .../Framework/MessagingMiddleware.cs | 8 +- .../api-gateway/Genocs.APIGateway/Startup.cs | 4 +- .../OutboxCommandHandlerDecorator.cs | 4 +- .../Decorators/OutboxEventHandlerDecorator.cs | 4 +- .../Services/ProductServiceClient.cs | 4 +- .../SignalROptions.cs} | 4 +- .../Framework/Extensions.cs | 6 +- 40 files changed, 220 insertions(+), 227 deletions(-) rename src/Genocs.Core.Demo.WebApi/{Options/ExternalServiceSettings.cs => Configurations/ExternalServiceOptions.cs} (87%) rename src/Genocs.Core.Demo.WebApi/{Options/RabbitMQSettings.cs => Configurations/RabbitMQOptions.cs} (92%) rename src/Genocs.Core.Demo.WebApi/{Options/SecretSettings.cs => Configurations/SecretOptions.cs} (92%) rename src/Genocs.MessageBrokers.Outbox/{Options/OutboxSettings.cs => Configurations/OutboxOptions.cs} (79%) create mode 100644 src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs delete mode 100644 src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs rename src/Genocs.Metrics/AppMetrics/Configurations/{MetricsSettings.cs => MetricsOptions.cs} (97%) rename src/Genocs.Secrets.Vault/{Options/VaultSettings.cs => Configurations/VaultOptions.cs} (84%) rename src/apps/api-gateway/Genocs.APIGateway/{Options/MessagingSettings.cs => Configurations/MessagingOptions.cs} (57%) rename src/apps/signalr/Genocs.SignalR.WebApi/{Options/SignalRSettings.cs => Configurations/SignalROptions.cs} (66%) diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index f0077ec1..da3cf466 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -37,7 +37,7 @@ public static IGenocsBuilder AddJwt( private static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - JwtOptions jwtSettings, + JwtOptions options, Action? optionsFactory = null) { if (!builder.TryRegister(RegistryName)) @@ -50,53 +50,53 @@ private static IGenocsBuilder AddJwt( builder.Services.AddSingleton(); builder.Services.AddTransient(); - if (!jwtSettings.Enabled) + if (!options.Enabled) { builder.Services.AddSingleton(); } var tokenValidationParameters = new TokenValidationParameters { - RequireAudience = jwtSettings.RequireAudience, - ValidIssuer = jwtSettings.ValidIssuer, - ValidIssuers = jwtSettings.ValidIssuers, - ValidateActor = jwtSettings.ValidateActor, - ValidAudience = jwtSettings.ValidAudience, - ValidAudiences = jwtSettings.ValidAudiences, - ValidateAudience = jwtSettings.ValidateAudience, - ValidateIssuer = jwtSettings.ValidateIssuer, - ValidateLifetime = jwtSettings.ValidateLifetime, - ValidateTokenReplay = jwtSettings.ValidateTokenReplay, - ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey, - SaveSigninToken = jwtSettings.SaveSigninToken, - RequireExpirationTime = jwtSettings.RequireExpirationTime, - RequireSignedTokens = jwtSettings.RequireSignedTokens, + RequireAudience = options.RequireAudience, + ValidIssuer = options.ValidIssuer, + ValidIssuers = options.ValidIssuers, + ValidateActor = options.ValidateActor, + ValidAudience = options.ValidAudience, + ValidAudiences = options.ValidAudiences, + ValidateAudience = options.ValidateAudience, + ValidateIssuer = options.ValidateIssuer, + ValidateLifetime = options.ValidateLifetime, + ValidateTokenReplay = options.ValidateTokenReplay, + ValidateIssuerSigningKey = options.ValidateIssuerSigningKey, + SaveSigninToken = options.SaveSigninToken, + RequireExpirationTime = options.RequireExpirationTime, + RequireSignedTokens = options.RequireSignedTokens, ClockSkew = TimeSpan.Zero }; - if (!string.IsNullOrWhiteSpace(jwtSettings.AuthenticationType)) + if (!string.IsNullOrWhiteSpace(options.AuthenticationType)) { - tokenValidationParameters.AuthenticationType = jwtSettings.AuthenticationType; + tokenValidationParameters.AuthenticationType = options.AuthenticationType; } bool hasCertificate = false; - if (jwtSettings.Certificate is not null) + if (options.Certificate is not null) { X509Certificate2? certificate = null; - string password = jwtSettings.Certificate.Password; + string password = options.Certificate.Password; bool hasPassword = !string.IsNullOrWhiteSpace(password); - if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.Location)) + if (!string.IsNullOrWhiteSpace(options.Certificate.Location)) { certificate = hasPassword - ? new X509Certificate2(jwtSettings.Certificate.Location, password) - : new X509Certificate2(jwtSettings.Certificate.Location); + ? new X509Certificate2(options.Certificate.Location, password) + : new X509Certificate2(options.Certificate.Location); string keyType = certificate.HasPrivateKey ? "with private key" : "with public key only"; - Console.WriteLine($"Loaded X.509 certificate from location: '{jwtSettings.Certificate.Location}' {keyType}."); + Console.WriteLine($"Loaded X.509 certificate from location: '{options.Certificate.Location}' {keyType}."); } - if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.RawData)) + if (!string.IsNullOrWhiteSpace(options.Certificate.RawData)) { - byte[] rawData = Convert.FromBase64String(jwtSettings.Certificate.RawData); + byte[] rawData = Convert.FromBase64String(options.Certificate.RawData); certificate = hasPassword ? new X509Certificate2(rawData, password) : new X509Certificate2(rawData); @@ -106,9 +106,9 @@ private static IGenocsBuilder AddJwt( if (certificate is not null) { - if (string.IsNullOrWhiteSpace(jwtSettings.Algorithm)) + if (string.IsNullOrWhiteSpace(options.Algorithm)) { - jwtSettings.Algorithm = SecurityAlgorithms.RsaSha256; + options.Algorithm = SecurityAlgorithms.RsaSha256; } hasCertificate = true; @@ -118,54 +118,54 @@ private static IGenocsBuilder AddJwt( } } - if (!string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey) && !hasCertificate) + if (!string.IsNullOrWhiteSpace(options.IssuerSigningKey) && !hasCertificate) { - if (string.IsNullOrWhiteSpace(jwtSettings.Algorithm) || hasCertificate) + if (string.IsNullOrWhiteSpace(options.Algorithm) || hasCertificate) { - jwtSettings.Algorithm = SecurityAlgorithms.HmacSha256; + options.Algorithm = SecurityAlgorithms.HmacSha256; } - byte[] rawKey = Encoding.UTF8.GetBytes(jwtSettings.IssuerSigningKey); + byte[] rawKey = Encoding.UTF8.GetBytes(options.IssuerSigningKey); tokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(rawKey); Console.WriteLine("Using symmetric encryption for issuing tokens."); } - if (!string.IsNullOrWhiteSpace(jwtSettings.NameClaimType)) + if (!string.IsNullOrWhiteSpace(options.NameClaimType)) { - tokenValidationParameters.NameClaimType = jwtSettings.NameClaimType; + tokenValidationParameters.NameClaimType = options.NameClaimType; } - if (!string.IsNullOrWhiteSpace(jwtSettings.RoleClaimType)) + if (!string.IsNullOrWhiteSpace(options.RoleClaimType)) { - tokenValidationParameters.RoleClaimType = jwtSettings.RoleClaimType; + tokenValidationParameters.RoleClaimType = options.RoleClaimType; } builder.Services .AddAuthentication(o => { - o.DefaultAuthenticateScheme = jwtSettings.Challenge; - o.DefaultChallengeScheme = jwtSettings.Challenge; - o.DefaultScheme = jwtSettings.Challenge; + o.DefaultAuthenticateScheme = options.Challenge; + o.DefaultChallengeScheme = options.Challenge; + o.DefaultScheme = options.Challenge; }) .AddJwtBearer(o => { - o.Authority = jwtSettings.Authority; - o.Audience = jwtSettings.Audience; - o.MetadataAddress = jwtSettings.MetadataAddress; - o.SaveToken = jwtSettings.SaveToken; - o.RefreshOnIssuerKeyNotFound = jwtSettings.RefreshOnIssuerKeyNotFound; - o.RequireHttpsMetadata = jwtSettings.RequireHttpsMetadata; - o.IncludeErrorDetails = jwtSettings.IncludeErrorDetails; + o.Authority = options.Authority; + o.Audience = options.Audience; + o.MetadataAddress = options.MetadataAddress; + o.SaveToken = options.SaveToken; + o.RefreshOnIssuerKeyNotFound = options.RefreshOnIssuerKeyNotFound; + o.RequireHttpsMetadata = options.RequireHttpsMetadata; + o.IncludeErrorDetails = options.IncludeErrorDetails; o.TokenValidationParameters = tokenValidationParameters; - if (!string.IsNullOrWhiteSpace(jwtSettings.Challenge)) + if (!string.IsNullOrWhiteSpace(options.Challenge)) { - o.Challenge = jwtSettings.Challenge; + o.Challenge = options.Challenge; } optionsFactory?.Invoke(o); }); - builder.Services.AddSingleton(jwtSettings); + builder.Services.AddSingleton(options); builder.Services.AddSingleton(tokenValidationParameters); return builder; @@ -183,26 +183,25 @@ public static IGenocsBuilder AddOpenIdJwt( string sectionName = JwtOptions.Position) { - var jwtSettings = new JwtOptions(); - builder.Configuration.GetSection(sectionName).Bind(jwtSettings); + JwtOptions options = builder.Configuration.GetOptions(sectionName); - string metadataAddress = $"{jwtSettings.Issuer}{jwtSettings.MetadataAddress}"; + string metadataAddress = $"{options.Issuer}{options.MetadataAddress}"; var configurationManager = new ConfigurationManager(metadataAddress, new OpenIdConnectConfigurationRetriever()); builder.Services .AddAuthentication(o => { - o.DefaultAuthenticateScheme = jwtSettings.Challenge; - o.DefaultChallengeScheme = jwtSettings.Challenge; - o.DefaultScheme = jwtSettings.Challenge; + o.DefaultAuthenticateScheme = options.Challenge; + o.DefaultChallengeScheme = options.Challenge; + o.DefaultScheme = options.Challenge; }) .AddJwtBearer(o => { - o.IncludeErrorDetails = jwtSettings.IncludeErrorDetails; - o.RefreshOnIssuerKeyNotFound = jwtSettings.RefreshOnIssuerKeyNotFound; + o.IncludeErrorDetails = options.IncludeErrorDetails; + o.RefreshOnIssuerKeyNotFound = options.RefreshOnIssuerKeyNotFound; o.MetadataAddress = metadataAddress; o.ConfigurationManager = configurationManager; - o.Audience = jwtSettings.Audience; + o.Audience = options.Audience; }); return builder; @@ -225,15 +224,14 @@ public static IGenocsBuilder AddPrivateKeyJwt( sectionName = JwtOptions.Position; } - var jwtSettings = new JwtOptions(); - builder.Configuration.GetSection(sectionName).Bind(jwtSettings); + JwtOptions options = builder.Configuration.GetOptions(sectionName); - if (string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey)) + if (string.IsNullOrWhiteSpace(options.IssuerSigningKey)) { throw new InvalidOperationException("Issuer signing key is missing."); } - SecurityKey signingKey = SecurityKeyBuilder.CreateRsaSecurityKey(jwtSettings.IssuerSigningKey); + SecurityKey signingKey = SecurityKeyBuilder.CreateRsaSecurityKey(options.IssuerSigningKey); builder.Services .AddAuthentication(o => @@ -242,17 +240,17 @@ public static IGenocsBuilder AddPrivateKeyJwt( }) .AddJwtBearer(o => { - o.SaveToken = jwtSettings.SaveToken; - o.RequireHttpsMetadata = jwtSettings.RequireHttpsMetadata; + o.SaveToken = options.SaveToken; + o.RequireHttpsMetadata = options.RequireHttpsMetadata; o.TokenValidationParameters = new TokenValidationParameters() { IssuerSigningKey = signingKey, - ValidateAudience = jwtSettings.ValidateAudience, - ValidAudience = jwtSettings.ValidAudience, - ValidateIssuer = jwtSettings.ValidateIssuer, - ValidIssuer = jwtSettings.ValidIssuer, - ValidateLifetime = jwtSettings.ValidateLifetime, - ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey + ValidateAudience = options.ValidateAudience, + ValidAudience = options.ValidAudience, + ValidateIssuer = options.ValidateIssuer, + ValidIssuer = options.ValidIssuer, + ValidateLifetime = options.ValidateLifetime, + ValidateIssuerSigningKey = options.ValidateIssuerSigningKey }; }); diff --git a/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs b/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs similarity index 87% rename from src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs rename to src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs index 4a73893e..57e3d955 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.Core.Demo.WebApi.Options; -public class ExternalServiceSettings +public class ExternalServiceOptions { public const string Position = "ExternalService"; diff --git a/src/Genocs.Core.Demo.WebApi/Options/RabbitMQSettings.cs b/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs similarity index 92% rename from src/Genocs.Core.Demo.WebApi/Options/RabbitMQSettings.cs rename to src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs index 0afe6136..92bc8656 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/RabbitMQSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.Core.Demo.WebApi.Options; -public class RabbitMQSettings +public class RabbitMQOptions { public const string Position = "RabbitMQ"; diff --git a/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs b/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs similarity index 92% rename from src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs rename to src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs index 08d05a8a..51ef9d67 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.Core.Demo.WebApi.Options; -public class SecretSettings +public class SecretOptions { /// /// Default section name. diff --git a/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs b/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs index 44726b15..9aaea49b 100644 --- a/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs +++ b/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs @@ -7,9 +7,9 @@ namespace Genocs.Core.Demo.WebApi.Controllers; [Route("")] public class HomeController : ControllerBase { - public readonly SecretSettings _secretSettings; + public readonly SecretOptions _secretSettings; - public HomeController(SecretSettings secretSettings) + public HomeController(SecretOptions secretSettings) { _secretSettings = secretSettings ?? throw new ArgumentNullException(nameof(secretSettings)); } diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs index 0cdf5260..b73a2daf 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs @@ -26,8 +26,7 @@ public static IGenocsBuilder AddApplicationServices(this IGenocsBuilder builder) builder.AddHttpClient(); // Add the External Service settings - var settings = new ExternalServiceSettings(); - builder.Configuration.GetSection(ExternalServiceSettings.Position).Bind(settings); + ExternalServiceOptions settings = builder.Configuration.GetOptions(ExternalServiceOptions.Position); builder.Services.AddSingleton(settings); // Add the External Service http Client diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs index ef682b8b..3d7ed6ad 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ -using Genocs.Core.Demo.WebApi.Options; +using Genocs.Core.Builders; +using Genocs.Core.Demo.WebApi.Options; using Genocs.ServiceBusAzure.Options; using Genocs.ServiceBusAzure.Queues; using Genocs.ServiceBusAzure.Queues.Interfaces; @@ -50,10 +51,9 @@ public static IServiceCollection AddAzureServiceBusQueue(this IServiceCollection public static IServiceCollection AddCustomMassTransit(this IServiceCollection services, IConfiguration configuration) { - var rabbitMQSettings = new RabbitMQSettings(); - configuration.GetSection(RabbitMQSettings.Position).Bind(rabbitMQSettings); + RabbitMQOptions options = configuration.GetOptions(RabbitMQOptions.Position); - services.AddSingleton(rabbitMQSettings); + services.AddSingleton(options); services.AddMassTransit(x => { @@ -63,11 +63,11 @@ public static IServiceCollection AddCustomMassTransit(this IServiceCollection se { cfg.ConfigureEndpoints(context); //cfg.UseHealthCheck(context); - cfg.Host(rabbitMQSettings.HostName, rabbitMQSettings.VirtualHost, + cfg.Host(options.HostName, options.VirtualHost, h => { - h.Username(rabbitMQSettings.UserName); - h.Password(rabbitMQSettings.Password); + h.Username(options.UserName); + h.Password(options.Password); } ); }); diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs index 1a9beaa0..f789d41a 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs @@ -14,7 +14,7 @@ public class ExternalServiceClient : IExternalServiceClient private readonly IHttpClient _client; private readonly string _url; private readonly IHasher _hasher; - private readonly ExternalServiceSettings _externalServiceSettings; + private readonly ExternalServiceOptions _externalServiceSettings; /// /// The standard constructor. @@ -27,7 +27,7 @@ public ExternalServiceClient( IHttpClient client, IHasher hasher, HttpClientOptions httpClientSettings, - ExternalServiceSettings externalServiceSettings) + ExternalServiceOptions externalServiceSettings) { _client = client ?? throw new ArgumentNullException(nameof(client)); _hasher = hasher ?? throw new ArgumentNullException(nameof(hasher)); diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index 648f8938..6a0b01a7 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -46,10 +46,9 @@ services.AddHealthChecks(); -services.Configure(builder.Configuration.GetSection(SecretSettings.Position)); +services.Configure(builder.Configuration.GetSection(SecretOptions.Position)); -var settings = new SecretSettings(); -builder.Configuration.GetSection(SecretSettings.Position).Bind(settings); +SecretOptions settings = builder.Configuration.GetOptions(SecretOptions.Position); services.AddSingleton(settings); services.Configure(options => diff --git a/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs index fec77e24..3f1f6cc9 100644 --- a/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs +++ b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs @@ -20,9 +20,9 @@ public class ConsulOptions public IDictionary? Meta { get; set; } public bool EnableTagOverride { get; set; } public bool SkipLocalhostDockerDnsReplace { get; set; } - public ConnectSettings? Connect { get; set; } + public ConnectOptions? Connect { get; set; } - public class ConnectSettings + public class ConnectOptions { public bool Enabled { get; set; } } diff --git a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs index a13a67a5..481db53f 100644 --- a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs +++ b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs @@ -5,27 +5,27 @@ namespace Genocs.Discovery.Consul.MessageHandlers; internal sealed class ConsulServiceDiscoveryMessageHandler : DelegatingHandler { private readonly IConsulServicesRegistry _servicesRegistry; - private readonly ConsulOptions _settings; + private readonly ConsulOptions _options; private readonly string? _serviceName; private readonly bool? _overrideRequestUri; public ConsulServiceDiscoveryMessageHandler( IConsulServicesRegistry servicesRegistry, - ConsulOptions settings, + ConsulOptions options, string? serviceName = null, bool? overrideRequestUri = null) { _servicesRegistry = servicesRegistry; - _settings = settings; + _options = options; _serviceName = serviceName; _overrideRequestUri = overrideRequestUri; - if (!settings.Enabled) + if (!options.Enabled) { return; } - if (string.IsNullOrWhiteSpace(settings.Url)) + if (string.IsNullOrWhiteSpace(options.Url)) { throw new InvalidOperationException("Consul URL was not provided."); } @@ -55,7 +55,7 @@ private async Task SendAsync( Uri uri, CancellationToken cancellationToken) { - if (!_settings.Enabled) + if (!_options.Enabled) { return await base.SendAsync(request, cancellationToken); } @@ -73,7 +73,7 @@ private async Task GetRequestUriAsync( var service = await _servicesRegistry.GetAsync(serviceName) ?? throw new ConsulServiceNotFoundException($"Consul service: '{serviceName}' was not found.", serviceName); - if (!_settings.SkipLocalhostDockerDnsReplace) + if (!_options.SkipLocalhostDockerDnsReplace) { service.Address = service.Address.Replace("docker.for.mac.localhost", "localhost") .Replace("docker.for.win.localhost", "localhost") diff --git a/src/Genocs.HTTP/Configurations/HttpClientOptions.cs b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs index 213dbb69..04a267f7 100644 --- a/src/Genocs.HTTP/Configurations/HttpClientOptions.cs +++ b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs @@ -20,12 +20,12 @@ public class HttpClientOptions /// It defines the list of services to be registered. /// public IDictionary? Services { get; set; } - public RequestMaskingSettings? RequestMasking { get; set; } + public RequestMaskingOptions? RequestMasking { get; set; } public bool RemoveCharsetFromContentType { get; set; } public string? CorrelationContextHeader { get; set; } public string? CorrelationIdHeader { get; set; } - public class RequestMaskingSettings + public class RequestMaskingOptions { public bool Enabled { get; set; } public IEnumerable? UrlParts { get; set; } diff --git a/src/Genocs.Logging/Extensions.cs b/src/Genocs.Logging/Extensions.cs index 0f9b7fd6..5ba6181a 100644 --- a/src/Genocs.Logging/Extensions.cs +++ b/src/Genocs.Logging/Extensions.cs @@ -52,38 +52,38 @@ public static IEndpointConventionBuilder MapLogLevelHandler( => builder.MapPost(endpointRoute, LevelSwitch); private static void MapOptions( - LoggerOptions loggerSettings, - AppOptions appSettings, + LoggerOptions loggerOptions, + AppOptions appOptions, LoggerConfiguration loggerConfiguration, string environmentName) { - LoggingLevelSwitch.MinimumLevel = GetLogEventLevel(loggerSettings.Level); + LoggingLevelSwitch.MinimumLevel = GetLogEventLevel(loggerOptions.Level); loggerConfiguration.Enrich.FromLogContext() .MinimumLevel.ControlledBy(LoggingLevelSwitch) .Enrich.WithProperty("Environment", environmentName) - .Enrich.WithProperty("Application", appSettings.Service) - .Enrich.WithProperty("Instance", appSettings.Instance) - .Enrich.WithProperty("Version", appSettings.Version); + .Enrich.WithProperty("Application", appOptions.Service) + .Enrich.WithProperty("Instance", appOptions.Instance) + .Enrich.WithProperty("Version", appOptions.Version); - foreach (var (key, value) in loggerSettings.Tags ?? new Dictionary()) + foreach (var (key, value) in loggerOptions.Tags ?? new Dictionary()) { loggerConfiguration.Enrich.WithProperty(key, value); } - foreach (var (key, value) in loggerSettings.MinimumLevelOverrides ?? new Dictionary()) + foreach (var (key, value) in loggerOptions.MinimumLevelOverrides ?? new Dictionary()) { var logLevel = GetLogEventLevel(value); loggerConfiguration.MinimumLevel.Override(key, logLevel); } - loggerSettings.ExcludePaths?.ToList().ForEach(p => loggerConfiguration.Filter + loggerOptions.ExcludePaths?.ToList().ForEach(p => loggerConfiguration.Filter .ByExcluding(Matching.WithProperty("RequestPath", n => n.EndsWith(p)))); - loggerSettings.ExcludeProperties?.ToList().ForEach(p => loggerConfiguration.Filter + loggerOptions.ExcludeProperties?.ToList().ForEach(p => loggerConfiguration.Filter .ByExcluding(Matching.WithProperty(p))); - Configure(loggerConfiguration, loggerSettings); + Configure(loggerConfiguration, loggerOptions); } private static void Configure(LoggerConfiguration loggerConfiguration, LoggerOptions options) @@ -203,7 +203,7 @@ private static async Task LevelSwitch(HttpContext context) return; } - var level = context.Request.Query["level"].ToString(); + string level = context.Request.Query["level"].ToString(); if (string.IsNullOrEmpty(level)) { diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs index 291ef5f6..2c5212bd 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs @@ -1,5 +1,5 @@ +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Messages; -using Genocs.MessageBrokers.Outbox.Options; using Genocs.Persistence.MongoDb.Repositories; using Genocs.Persistence.MongoDb.Repositories.Mentor; using Microsoft.Extensions.Logging; @@ -31,7 +31,7 @@ internal sealed class MongoMessageOutbox : IMessageOutbox, IMessageOutboxAccesso public MongoMessageOutbox(IMongoSessionFactory sessionFactory, IMongoRepository inboxRepository, IMongoRepository outboxRepository, - OutboxSettings options, ILogger logger) + OutboxOptions options, ILogger logger) { _sessionFactory = sessionFactory; _inboxRepository = inboxRepository; diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs index 05d67b59..2fd0ea9d 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs @@ -1,6 +1,6 @@ using Genocs.Common.Types; +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Messages; -using Genocs.MessageBrokers.Outbox.Options; using MongoDB.Driver; namespace Genocs.MessageBrokers.Outbox.MongoDB.Internals; @@ -8,9 +8,9 @@ namespace Genocs.MessageBrokers.Outbox.MongoDB.Internals; internal sealed class MongoOutboxInitializer : IInitializer { private readonly IMongoDatabase _database; - private readonly OutboxSettings _options; + private readonly OutboxOptions _options; - public MongoOutboxInitializer(IMongoDatabase database, OutboxSettings options) + public MongoOutboxInitializer(IMongoDatabase database, OutboxOptions options) { _database = database; _options = options; diff --git a/src/Genocs.MessageBrokers.Outbox/Options/OutboxSettings.cs b/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxOptions.cs similarity index 79% rename from src/Genocs.MessageBrokers.Outbox/Options/OutboxSettings.cs rename to src/Genocs.MessageBrokers.Outbox/Configurations/OutboxOptions.cs index f26273a7..da6aaec7 100644 --- a/src/Genocs.MessageBrokers.Outbox/Options/OutboxSettings.cs +++ b/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxOptions.cs @@ -1,6 +1,6 @@ -namespace Genocs.MessageBrokers.Outbox.Options; +namespace Genocs.MessageBrokers.Outbox.Configurations; -public class OutboxSettings +public class OutboxOptions { public bool Enabled { get; set; } public int Expiry { get; set; } diff --git a/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs b/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs index 18aeb4dc..c5db113f 100644 --- a/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs +++ b/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs @@ -1,14 +1,14 @@ using Genocs.Core.Builders; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.MessageBrokers.Outbox.Configurators; internal sealed class MessageOutboxConfigurator : IMessageOutboxConfigurator { public IGenocsBuilder Builder { get; } - public OutboxSettings Options { get; } + public OutboxOptions Options { get; } - public MessageOutboxConfigurator(IGenocsBuilder builder, OutboxSettings options) + public MessageOutboxConfigurator(IGenocsBuilder builder, OutboxOptions options) { Builder = builder; Options = options; diff --git a/src/Genocs.MessageBrokers.Outbox/Extensions.cs b/src/Genocs.MessageBrokers.Outbox/Extensions.cs index ce2d06c4..2a966f11 100644 --- a/src/Genocs.MessageBrokers.Outbox/Extensions.cs +++ b/src/Genocs.MessageBrokers.Outbox/Extensions.cs @@ -1,6 +1,6 @@ using Genocs.Core.Builders; +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Configurators; -using Genocs.MessageBrokers.Outbox.Options; using Genocs.MessageBrokers.Outbox.Outbox; using Genocs.MessageBrokers.Outbox.Processors; using Microsoft.Extensions.DependencyInjection; @@ -27,7 +27,7 @@ public static IGenocsBuilder AddMessageOutbox( return builder; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); builder.Services.AddSingleton(options); var configurator = new MessageOutboxConfigurator(builder, options); diff --git a/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs b/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs index dfd18932..ddf94a6f 100644 --- a/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs +++ b/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs @@ -1,10 +1,10 @@ using Genocs.Core.Builders; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.MessageBrokers.Outbox; public interface IMessageOutboxConfigurator { IGenocsBuilder Builder { get; } - OutboxSettings Options { get; } + OutboxOptions Options { get; } } \ No newline at end of file diff --git a/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs b/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs index 316b435f..82624406 100644 --- a/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs +++ b/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs @@ -1,5 +1,5 @@ +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Messages; -using Genocs.MessageBrokers.Outbox.Options; using Microsoft.Extensions.Logging; using System.Collections.Concurrent; @@ -14,7 +14,7 @@ internal sealed class InMemoryMessageOutbox : IMessageOutbox, IMessageOutboxAcce private readonly ILogger _logger; private readonly int _expiry; - public InMemoryMessageOutbox(OutboxSettings options, ILogger logger) + public InMemoryMessageOutbox(OutboxOptions options, ILogger logger) { _logger = logger; _expiry = options.Expiry; diff --git a/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs b/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs index 67f5b005..a9799d06 100644 --- a/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs +++ b/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs @@ -1,4 +1,4 @@ -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -10,13 +10,13 @@ internal sealed class OutboxProcessor : IHostedService { private readonly IServiceProvider _serviceProvider; private readonly IBusPublisher _publisher; - private readonly OutboxSettings _options; + private readonly OutboxOptions _options; private readonly ILogger _logger; private readonly TimeSpan _interval; private readonly OutboxType _type; private Timer _timer; - public OutboxProcessor(IServiceProvider serviceProvider, IBusPublisher publisher, OutboxSettings options, + public OutboxProcessor(IServiceProvider serviceProvider, IBusPublisher publisher, OutboxOptions options, ILogger logger) { if (options.Enabled && options.IntervalMilliseconds <= 0) diff --git a/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs index 3c0bb4b0..b789eee7 100644 --- a/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs +++ b/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs @@ -2,58 +2,58 @@ namespace Genocs.Metrics.AppMetrics.Builders; -internal sealed class MetricsOptionsBuilder : IMetricsSettingsBuilder +internal sealed class MetricsOptionsBuilder : IMetricsOptionsBuilder { - private readonly MetricsSettings _options = new(); + private readonly MetricsOptions _options = new(); - public IMetricsSettingsBuilder Enable(bool enabled) + public IMetricsOptionsBuilder Enable(bool enabled) { _options.Enabled = enabled; return this; } - public IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled) + public IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled) { _options.InfluxEnabled = influxEnabled; return this; } - public IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled) + public IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled) { _options.PrometheusEnabled = prometheusEnabled; return this; } - public IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter) + public IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter) { _options.PrometheusFormatter = prometheusFormatter; return this; } - public IMetricsSettingsBuilder WithInfluxUrl(string influxUrl) + public IMetricsOptionsBuilder WithInfluxUrl(string influxUrl) { _options.InfluxUrl = influxUrl; return this; } - public IMetricsSettingsBuilder WithDatabase(string database) + public IMetricsOptionsBuilder WithDatabase(string database) { _options.Database = database; return this; } - public IMetricsSettingsBuilder WithInterval(int interval) + public IMetricsOptionsBuilder WithInterval(int interval) { _options.Interval = interval; return this; } - public IMetricsSettingsBuilder WithTags(IDictionary tags) + public IMetricsOptionsBuilder WithTags(IDictionary tags) { _options.Tags = tags; return this; } - public MetricsSettings Build() + public MetricsOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs new file mode 100644 index 00000000..750b1d4b --- /dev/null +++ b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs @@ -0,0 +1,14 @@ +namespace Genocs.Metrics.AppMetrics.Configurations; + +public interface IMetricsOptionsBuilder +{ + IMetricsOptionsBuilder Enable(bool enabled); + IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled); + IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled); + IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter); + IMetricsOptionsBuilder WithInfluxUrl(string influxUrl); + IMetricsOptionsBuilder WithDatabase(string database); + IMetricsOptionsBuilder WithInterval(int interval); + IMetricsOptionsBuilder WithTags(IDictionary tags); + MetricsOptions Build(); +} \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs deleted file mode 100644 index e9964080..00000000 --- a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Genocs.Metrics.AppMetrics.Configurations; - -public interface IMetricsSettingsBuilder -{ - IMetricsSettingsBuilder Enable(bool enabled); - IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled); - IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled); - IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter); - IMetricsSettingsBuilder WithInfluxUrl(string influxUrl); - IMetricsSettingsBuilder WithDatabase(string database); - IMetricsSettingsBuilder WithInterval(int interval); - IMetricsSettingsBuilder WithTags(IDictionary tags); - MetricsSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsOptions.cs similarity index 97% rename from src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs rename to src/Genocs.Metrics/AppMetrics/Configurations/MetricsOptions.cs index 1a3f226f..14cf9e07 100644 --- a/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs +++ b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsOptions.cs @@ -3,7 +3,7 @@ namespace Genocs.Metrics.AppMetrics.Configurations; /// /// The MetricsSettings class. /// -public class MetricsSettings +public class MetricsOptions { /// /// Default section name. diff --git a/src/Genocs.Metrics/AppMetrics/Extensions.cs b/src/Genocs.Metrics/AppMetrics/Extensions.cs index 54f939f6..94e769c3 100644 --- a/src/Genocs.Metrics/AppMetrics/Extensions.cs +++ b/src/Genocs.Metrics/AppMetrics/Extensions.cs @@ -40,7 +40,7 @@ public static IGenocsBuilder AddMetrics( appSectionName = AppOptions.Position; } - var metricsOptions = builder.GetOptions(metricsSectionName); + var metricsOptions = builder.GetOptions(metricsSectionName); var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); @@ -49,7 +49,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - Func buildOptions, + Func buildOptions, string appSectionName = AppSectionName) { if (string.IsNullOrWhiteSpace(appSectionName)) @@ -66,7 +66,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's and IIS ServerOptions AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - MetricsSettings metricsSettings, + Configurations.MetricsOptions metricsSettings, AppOptions appSettings) { builder.Services.AddSingleton(metricsSettings); @@ -148,10 +148,10 @@ public static IGenocsBuilder AddMetrics( public static IApplicationBuilder UseMetrics(this IApplicationBuilder app) { - MetricsOptions options; + App.Metrics.MetricsOptions options; using (var scope = app.ApplicationServices.CreateScope()) { - options = scope.ServiceProvider.GetRequiredService(); + options = scope.ServiceProvider.GetRequiredService(); } return !options.Enabled @@ -161,7 +161,7 @@ public static IApplicationBuilder UseMetrics(this IApplicationBuilder app) .UseMetricsAllMiddleware(); } - private static MetricsWebHostOptions GetMetricsWebHostOptions(MetricsSettings metricsOptions) + private static MetricsWebHostOptions GetMetricsWebHostOptions(Configurations.MetricsOptions metricsOptions) { var options = new MetricsWebHostOptions(); diff --git a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs index 5d5f3e36..e1bf0465 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs +++ b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs @@ -15,7 +15,8 @@ namespace Genocs.Secrets.AzureKeyVault; public static class Extensions { /// - /// UseVault. + /// This method is used to add the Azure Key Vault to the Host builder. + /// You can use the Azure Key Vault to store and manage application secrets. /// /// The builder. /// The section name. @@ -51,8 +52,7 @@ public static IWebHostBuilder UseAzureKeyVault( string sectionName = AzureKeyVaultSettings.Position) => builder.ConfigureAppConfiguration((ctx, cfg) => { - var settings = new AzureKeyVaultSettings(); - ctx.Configuration.GetSection(sectionName).Bind(settings); + AzureKeyVaultSettings settings = ctx.Configuration.GetOptions(sectionName); if (!settings.Enabled) { return; @@ -69,8 +69,7 @@ public static IWebHostBuilder UseAzureKeyVault( public static WebApplicationBuilder UseAzureKeyVault(this WebApplicationBuilder builder) { - var settings = new AzureKeyVaultSettings(); - builder.Configuration.GetSection(AzureKeyVaultSettings.Position).Bind(settings); + AzureKeyVaultSettings settings = builder.Configuration.GetOptions(AzureKeyVaultSettings.Position); if (!settings.Enabled) { return builder; diff --git a/src/Genocs.Secrets.Vault/Options/VaultSettings.cs b/src/Genocs.Secrets.Vault/Configurations/VaultOptions.cs similarity index 84% rename from src/Genocs.Secrets.Vault/Options/VaultSettings.cs rename to src/Genocs.Secrets.Vault/Configurations/VaultOptions.cs index 9d0bf271..f2775730 100644 --- a/src/Genocs.Secrets.Vault/Options/VaultSettings.cs +++ b/src/Genocs.Secrets.Vault/Configurations/VaultOptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.Secrets.Vault.Options; +namespace Genocs.Secrets.Vault.Configurations; /// /// The vault Setting definition. /// -public class VaultSettings +public class VaultOptions { public bool Enabled { get; set; } public string? Url { get; set; } @@ -14,11 +14,11 @@ public class VaultSettings public string? Password { get; set; } public bool RevokeLeaseOnShutdown { get; set; } public int RenewalsInterval { get; set; } - public KeyValueSettings Kv { get; set; } - public PkiSettings Pki { get; set; } - public IDictionary Lease { get; set; } + public KeyValueOptions Kv { get; set; } + public PkiOptions Pki { get; set; } + public IDictionary Lease { get; set; } - public class KeyValueSettings + public class KeyValueOptions { public bool Enabled { get; set; } public int EngineVersion { get; set; } = 2; @@ -27,7 +27,7 @@ public class KeyValueSettings public int? Version { get; set; } } - public class LeaseSettings + public class LeaseOptions { public bool Enabled { get; set; } public string? Type { get; set; } @@ -37,7 +37,7 @@ public class LeaseSettings public IDictionary Templates { get; set; } } - public class PkiSettings + public class PkiOptions { public bool Enabled { get; set; } public string RoleName { get; set; } diff --git a/src/Genocs.Secrets.Vault/Extensions.cs b/src/Genocs.Secrets.Vault/Extensions.cs index 914de108..166aa19e 100644 --- a/src/Genocs.Secrets.Vault/Extensions.cs +++ b/src/Genocs.Secrets.Vault/Extensions.cs @@ -1,6 +1,6 @@ using Genocs.Core.Builders; +using Genocs.Secrets.Vault.Configurations; using Genocs.Secrets.Vault.Internals; -using Genocs.Secrets.Vault.Options; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Memory; @@ -39,7 +39,7 @@ public static IHostBuilder UseVault( .ConfigureAppConfiguration((ctx, cfg) => { // TODO Test - VaultSettings options = ctx.Configuration.GetOptions(sectionName); + VaultOptions options = ctx.Configuration.GetOptions(sectionName); if (!options.Enabled) { return; @@ -49,7 +49,7 @@ public static IHostBuilder UseVault( }); /// - /// UseVault + /// UseVault. /// /// /// @@ -63,8 +63,7 @@ public static IWebHostBuilder UseVault( .ConfigureAppConfiguration((ctx, cfg) => { // TODO Test - var options = new VaultSettings(); - ctx.Configuration.GetSection(sectionName).Bind(options); + VaultOptions options = ctx.Configuration.GetOptions(sectionName); if (!options.Enabled) { return; @@ -86,8 +85,7 @@ private static IServiceCollection AddVault(this IServiceCollection services, str configuration = serviceProvider.GetRequiredService(); } - var options = new VaultSettings(); - configuration.GetSection(sectionName).Bind(options); + VaultOptions options = configuration.GetOptions(sectionName); if (!options.Enabled) { return services; @@ -114,13 +112,13 @@ private static IServiceCollection AddVault(this IServiceCollection services, str return services; } - private static void VerifyOptions(VaultSettings options) + private static void VerifyOptions(VaultOptions options) { if (options.Kv is null) { if (!string.IsNullOrWhiteSpace(options.Key)) { - options.Kv = new VaultSettings.KeyValueSettings + options.Kv = new VaultOptions.KeyValueOptions { Enabled = options.Enabled, Path = options.Key @@ -143,7 +141,7 @@ private static void VerifyOptions(VaultSettings options) private static async Task AddVaultAsync( this IConfigurationBuilder builder, - VaultSettings options, + VaultOptions options, string? keyValuePath) { VerifyOptions(options); @@ -194,7 +192,7 @@ private static async Task AddVaultAsync( private static Task InitLeaseAsync( string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) => options.Type.ToLowerInvariant() switch { @@ -209,7 +207,7 @@ private static Task InitLeaseAsync( private static async Task SetActiveDirectorySecretsAsync( string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.ActiveDirectory; @@ -225,7 +223,7 @@ private static async Task SetActiveDirectorySecretsAsync( } private static async Task SetAzureSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.Azure; @@ -240,7 +238,7 @@ private static async Task SetAzureSecretsAsync(string key, IVaultClient client, } private static async Task SetConsulSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.Consul; @@ -254,7 +252,7 @@ private static async Task SetConsulSecretsAsync(string key, IVaultClient client, } private static async Task SetDatabaseSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.Database; @@ -268,7 +266,7 @@ private static async Task SetDatabaseSecretsAsync(string key, IVaultClient clien }, credentials.LeaseId, credentials.LeaseDurationSeconds, credentials.Renewable)); } - private static async Task SetPkiSecretsAsync(IVaultClient client, VaultSettings options) + private static async Task SetPkiSecretsAsync(IVaultClient client, VaultOptions options) { var issuer = new CertificatesIssuer(client, options); var certificate = await issuer.IssueAsync(); @@ -276,7 +274,7 @@ private static async Task SetPkiSecretsAsync(IVaultClient client, VaultSettings } private static async Task SetRabbitMqSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.RabbitMQ; @@ -290,7 +288,7 @@ private static async Task SetRabbitMqSecretsAsync(string key, IVaultClient clien }, credentials.LeaseId, credentials.LeaseDurationSeconds, credentials.Renewable)); } - private static void SetSecrets(string key, VaultSettings.LeaseSettings options, + private static void SetSecrets(string key, VaultOptions.LeaseOptions options, IDictionary configuration, string name, Func<(object, Dictionary, string, int, bool)> lease) { @@ -301,7 +299,7 @@ private static void SetSecrets(string key, VaultSettings.LeaseSettings options, LeaseService.Set(key, leaseData); } - private static (IVaultClient client, VaultClientSettings settings) GetClientAndSettings(VaultSettings options) + private static (IVaultClient client, VaultClientSettings settings) GetClientAndSettings(VaultOptions options) { var settings = new VaultClientSettings(options.Url, GetAuthMethod(options)); var client = new VaultClient(settings); @@ -309,7 +307,7 @@ private static (IVaultClient client, VaultClientSettings settings) GetClientAndS return (client, settings); } - private static void SetTemplates(string key, VaultSettings.LeaseSettings lease, + private static void SetTemplates(string key, VaultOptions.LeaseOptions lease, IDictionary configuration, IDictionary values) { if (lease.Templates is null || !lease.Templates.Any()) @@ -331,7 +329,7 @@ private static void SetTemplates(string key, VaultSettings.LeaseSettings lease, } } - private static IAuthMethodInfo GetAuthMethod(VaultSettings options) + private static IAuthMethodInfo GetAuthMethod(VaultOptions options) => options.AuthType?.ToLowerInvariant() switch { "token" => new TokenAuthMethodInfo(options.Token), diff --git a/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs b/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs index ef83211d..24235366 100644 --- a/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs +++ b/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs @@ -1,7 +1,7 @@ using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; -using Genocs.Secrets.Vault.Options; +using Genocs.Secrets.Vault.Configurations; using VaultSharp; using VaultSharp.V1.SecretsEngines; using VaultSharp.V1.SecretsEngines.PKI; @@ -11,12 +11,12 @@ namespace Genocs.Secrets.Vault.Internals; internal sealed class CertificatesIssuer : ICertificatesIssuer { private readonly IVaultClient _client; - private readonly VaultSettings.PkiSettings _options; + private readonly VaultOptions.PkiOptions _options; private readonly CertificateFormat _certificateFormat; private readonly PrivateKeyFormat _privateKeyFormat; private readonly string _mountPoint; - public CertificatesIssuer(IVaultClient client, VaultSettings options) + public CertificatesIssuer(IVaultClient client, VaultOptions options) { _client = client; _options = options.Pki; diff --git a/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs b/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs index a6d268f1..e65c9c12 100644 --- a/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs +++ b/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs @@ -1,5 +1,5 @@ using System.Text.Json; -using Genocs.Secrets.Vault.Options; +using Genocs.Secrets.Vault.Configurations; using VaultSharp; namespace Genocs.Secrets.Vault.Internals; @@ -7,9 +7,9 @@ namespace Genocs.Secrets.Vault.Internals; internal sealed class KeyValueSecrets : IKeyValueSecrets { private readonly IVaultClient _client; - private readonly VaultSettings _options; + private readonly VaultOptions _options; - public KeyValueSecrets(IVaultClient client, VaultSettings options) + public KeyValueSecrets(IVaultClient client, VaultOptions options) { _client = client; _options = options; diff --git a/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs b/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs index 94023818..25857843 100644 --- a/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs +++ b/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs @@ -1,4 +1,4 @@ -using Genocs.Secrets.Vault.Options; +using Genocs.Secrets.Vault.Configurations; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using VaultSharp; @@ -11,7 +11,7 @@ internal sealed class VaultHostedService : BackgroundService private readonly ILeaseService _leaseService; private readonly ICertificatesIssuer _certificatesIssuer; private readonly ICertificatesService _certificatesService; - private readonly VaultSettings _options; + private readonly VaultOptions _options; private readonly ILogger _logger; private readonly int _interval; @@ -20,7 +20,7 @@ public VaultHostedService( ILeaseService leaseService, ICertificatesIssuer certificatesIssuer, ICertificatesService certificatesService, - VaultSettings options, + VaultOptions options, ILogger logger) { _client = client; diff --git a/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs b/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs similarity index 57% rename from src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs rename to src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs index 113498cc..f2614b7e 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs @@ -1,11 +1,11 @@ -namespace Genocs.APIGateway.Options; +namespace Genocs.APIGateway.Configurations; -internal class MessagingSettings +internal class MessagingOptions { public bool Enabled { get; set; } - public IEnumerable? Endpoints { get; set; } + public IEnumerable? Endpoints { get; set; } - internal class EndpointSettings + internal class EndpointOptions { public string? Method { get; set; } public string? Path { get; set; } diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs index 5575cb06..d9665a2b 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs @@ -1,4 +1,4 @@ -using Genocs.APIGateway.Options; +using Genocs.APIGateway.Configurations; using Genocs.MessageBrokers.RabbitMQ; using Genocs.MessageBrokers.RabbitMQ.Conventions; using Microsoft.Extensions.Options; @@ -16,7 +16,7 @@ internal class MessagingMiddleware : IMiddleware private readonly ITracer _tracer; private readonly ICorrelationContextBuilder _correlationContextBuilder; private readonly CorrelationIdFactory _correlationIdFactory; - private readonly IDictionary> _endpoints; + private readonly IDictionary> _endpoints; public MessagingMiddleware( IRabbitMQClient rabbitMQClient, @@ -24,7 +24,7 @@ public MessagingMiddleware( ITracer tracer, ICorrelationContextBuilder correlationContextBuilder, CorrelationIdFactory correlationIdFactory, - IOptions messagingOptions) + IOptions messagingOptions) { if (messagingOptions is null) { @@ -39,7 +39,7 @@ public MessagingMiddleware( _endpoints = messagingOptions.Value.Endpoints?.Any() is true ? messagingOptions.Value.Endpoints.GroupBy(e => e.Method.ToUpperInvariant()) .ToDictionary(e => e.Key, e => e.ToList()) - : new Dictionary>(); + : new Dictionary>(); } public async Task InvokeAsync(HttpContext context, RequestDelegate next) diff --git a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs index 2653d378..1e7addfb 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs @@ -1,5 +1,5 @@ +using Genocs.APIGateway.Configurations; using Genocs.APIGateway.Framework; -using Genocs.APIGateway.Options; using Genocs.Auth; using Genocs.Common.Configurations; using Genocs.Core.Builders; @@ -32,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.Configure(Configuration.GetSection("messaging")); + services.Configure(Configuration.GetSection("messaging")); services.AddReverseProxy() .LoadFromConfig(Configuration.GetSection("ReverseProxy")); services.AddSingleton(); diff --git a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs index 27216af2..5401d00c 100644 --- a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs +++ b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs @@ -2,7 +2,7 @@ using Genocs.Core.CQRS.Commands; using Genocs.MessageBrokers; using Genocs.MessageBrokers.Outbox; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.Identities.Application.Decorators; @@ -16,7 +16,7 @@ internal sealed class OutboxCommandHandlerDecorator : ICommandHandler< private readonly bool _enabled; public OutboxCommandHandlerDecorator(ICommandHandler handler, IMessageOutbox outbox, - OutboxSettings outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) + OutboxOptions outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) { _handler = handler; _outbox = outbox; diff --git a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs index 1c3ef1dd..0bad3e59 100644 --- a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs +++ b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs @@ -2,7 +2,7 @@ using Genocs.Core.CQRS.Events; using Genocs.MessageBrokers; using Genocs.MessageBrokers.Outbox; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.Identities.Application.Decorators; @@ -16,7 +16,7 @@ internal sealed class OutboxEventHandlerDecorator : IEventHandler handler, IMessageOutbox outbox, - OutboxSettings outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) + OutboxOptions outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) { _handler = handler; _outbox = outbox; diff --git a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs index 802e1de3..4530716a 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs +++ b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs @@ -2,7 +2,7 @@ using Genocs.HTTP.Configurations; using Genocs.Orders.WebApi.DTO; using Genocs.Secrets.Vault; -using Genocs.Secrets.Vault.Options; +using Genocs.Secrets.Vault.Configurations; using Genocs.WebApi.Security.Configurations; namespace Genocs.Orders.WebApi.Services; @@ -27,7 +27,7 @@ public ProductServiceClient( IHttpClient client, ICertificatesService certificatesService, HttpClientOptions httpClientOptions, - VaultSettings vaultOptions, + VaultOptions vaultOptions, SecurityOptions securityOptions) { _client = client ?? throw new ArgumentNullException(nameof(client)); diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Options/SignalRSettings.cs b/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs similarity index 66% rename from src/apps/signalr/Genocs.SignalR.WebApi/Options/SignalRSettings.cs rename to src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs index 1b1572fa..6dc84226 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Options/SignalRSettings.cs +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.SignalR.WebApi.Options; +namespace Genocs.SignalR.WebApi.Configurations; /// /// The signalR Settings definition. /// -public class SignalRSettings +public class SignalROptions { public string? Backplane { get; set; } public string? Hub { get; set; } diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs b/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs index 4339e3f3..4a8d6756 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.SignalR.WebApi.Options; +using Genocs.SignalR.WebApi.Configurations; namespace Genocs.SignalR.WebApi.Framework; @@ -10,7 +10,7 @@ public static string ToUserGroup(this Guid userId) public static IGenocsBuilder AddSignalR(this IGenocsBuilder builder) { - var options = builder.Configuration.GetOptions("signalr"); + var options = builder.Configuration.GetOptions("signalr"); if (options is not null) { @@ -22,7 +22,7 @@ public static IGenocsBuilder AddSignalR(this IGenocsBuilder builder) public static IGenocsBuilder UseSignalR(this IGenocsBuilder builder) { - var options = builder.GetOptions("signalr"); + var options = builder.GetOptions("signalr"); if (options is not null) { From 3b27e463fa91d72fe87473c7d6918114896433cd Mon Sep 17 00:00:00 2001 From: Giovanni Nocco Date: Thu, 4 Jul 2024 12:03:28 +0200 Subject: [PATCH 07/17] Add verification service client and models - Introduced `Genocs.Core.Demo.WebApi.Options.VerificationServiceOptions` for API key configuration. - Added `IVerificationServiceClient` interface and `VerificationServiceClient` class in `Genocs.Core.Demo.WebApi.Infrastructure.Services` for user verification. - Implemented models `VerificationApiRequest`, `VerificationApiResponse`, and `PersonDetailsRequest` for request/response handling. - `VerificationServiceClient` handles HTTP communication with external verification service, including request serialization, header setting, and response deserialization. - Added error handling in `VerificationServiceClient` constructor for parameter validation and URL verification. - Configured dependency injection for `VerificationServiceClient` and its configurations. - Utilized `Newtonsoft.Json` for JSON serialization and deserialization. - Abstracted HTTP communication through `IHttpClient` to facilitate testing and decouple from concrete HTTP client library. --- .../VerificationServiceOptions.cs | 8 +++ .../IVerificationServiceClient.Models.cs | 66 +++++++++++++++++++ .../Services/IVerificationServiceClient.cs | 15 +++++ .../Services/VerificationServiceClient.cs | 65 ++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs diff --git a/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs b/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs new file mode 100644 index 00000000..2f847694 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs @@ -0,0 +1,8 @@ +namespace Genocs.Core.Demo.WebApi.Options; + +public class VerificationServiceOptions +{ + public const string Position = "VerificationService"; + + public string ApiKey { get; set; } = default!; +} diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs new file mode 100644 index 00000000..221a71f2 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs @@ -0,0 +1,66 @@ +using Newtonsoft.Json; + +namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; + +/// +/// The Internal User verification request. +/// +public class VerificationApiRequest +{ + [JsonProperty("type")] + public string? Type { get; set; } + + [JsonProperty("joinedDate")] + public string? JoinedDate { get; set; } + + [JsonProperty("email")] + public string? Email { get; set; } + + [JsonProperty("personDetails")] + public PersonDetailsRequest? Details { get; set; } +} + +public class PersonDetailsRequest +{ + [JsonProperty("firstName")] + public string? FirstName { get; set; } + + [JsonProperty("lastName")] + public string? LastName { get; set; } + + [JsonProperty("dob")] + public string? DateOfBirth { get; set; } + + [JsonProperty("gender")] + public string? Gender { get; set; } + + [JsonProperty("nationality")] + public string? Nationality { get; set; } +} + +/// +/// The internal User verification response. +/// +public class VerificationApiResponse +{ + [JsonProperty("id")] + public string? Id { get; set; } + + [JsonProperty("createdAt")] + public string? CreatedAt { get; set; } + + [JsonProperty("updatedAt")] + public string? UpdatedAt { get; set; } + + [JsonProperty("type")] + public string? Type { get; set; } + + [JsonProperty("joinedDate")] + public string? JoinedDate { get; set; } + + [JsonProperty("email")] + public string? Email { get; set; } + + [JsonProperty("personDetails")] + public PersonDetailsRequest? Details { get; set; } +} \ No newline at end of file diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs new file mode 100644 index 00000000..7129c59f --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs @@ -0,0 +1,15 @@ +namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; + +/// +/// The External WebApi client definition. +/// This API client is used to verify the user. +/// +public interface IVerificationServiceClient +{ + /// + /// Send a request To verify the user. + /// + /// The request with the user data. + /// The user verification response. + Task VerifyAsync(VerificationApiRequest request); +} diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs new file mode 100644 index 00000000..e9840a86 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs @@ -0,0 +1,65 @@ +using Genocs.Core.Demo.WebApi.Options; +using Genocs.HTTP; +using Genocs.HTTP.Configurations; +using Newtonsoft.Json; + +namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; + +/// +/// The Verification WebApi client implementation. +/// +public class VerificationServiceClient : IVerificationServiceClient +{ + private readonly IHttpClient _client; + private readonly string _url; + private readonly VerificationServiceOptions _externalServiceSettings; + + /// + /// The standard constructor. + /// + /// The http client. + /// The http client settings. + /// The security settings. + public VerificationServiceClient( + IHttpClient client, + HttpClientOptions httpClientSettings, + VerificationServiceOptions externalServiceSettings) + { + _client = client ?? throw new ArgumentNullException(nameof(client)); + _externalServiceSettings = externalServiceSettings ?? throw new ArgumentNullException(nameof(externalServiceSettings)); + + if (httpClientSettings is null) + { + throw new ArgumentNullException(nameof(httpClientSettings)); + } + + string? url = httpClientSettings?.Services?["user_verifier"]; + + if (string.IsNullOrWhiteSpace(url)) + { + throw new Exception("user_verifier http client settings cannot be null"); + } + + _url = url; + } + + private void SetHeaders() + { + _client.SetHeaders(h => h.TryAddWithoutValidation("Authorization", _externalServiceSettings.ApiKey)); + } + + /// + /// The method to verify the user. + /// + /// The verification api request. + /// The response. + public async Task VerifyAsync(VerificationApiRequest request) + { + SetHeaders(); + string serializedRequest = JsonConvert.SerializeObject(request); + using (var content = new StringContent(serializedRequest, System.Text.Encoding.UTF8, "application/json")) + { + return await _client.PostAsync($"{_url}/clients", request); + } + } +} \ No newline at end of file From 504fc40ee05a1ed6bc838a5b08195cb285feb8c1 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 10:59:35 +0200 Subject: [PATCH 08/17] Refactor configs and update docs across projects - Standardized namespace changes from `Options` to `Configurations` for clarity. - Enhanced README_NUGET.md for better NuGet package documentation. - Introduced and updated settings classes for logging, security, Swagger, and more. - Added and refined configuration builders for services like Jaeger, Redis, and Azure Key Vault. - Removed obsolete classes and settings to streamline configuration management. - Adopted nullable reference types for improved code robustness. - Updated GitHub Actions to support CI on both main and develop branches. - Enhanced project files for .NET 8 compatibility and incremental build optimizations. - Simplified logging setup with `StaticLogger.EnsureInitialized()`. - Refactored and enhanced settings for JWT, external services, and service discovery. - General cleanup, including removal of unused using directives and minor code adjustments. --- .github/workflows/build_and_test.yml | 4 +- Directory.Build.props | 19 +- containers/infrastructure-bare.yml | 2 - containers/infrastructure-elk.yml | 2 - containers/infrastructure-ml.yml | 2 - containers/infrastructure-monitoring.yml | 2 - containers/infrastructure-scaling.yml | 2 - containers/infrastructure-security.yml | 2 - containers/infrastructure-sqlserver.yml | 2 - demo-docker-compose.yml | 2 - .../AccessTokenValidatorMiddleware.cs | 2 +- src/Genocs.Auth/Builders/JwtOptionsBuilder.cs | 2 +- .../JwtSettings.cs | 6 +- src/Genocs.Auth/Extensions.cs | 5 +- src/Genocs.Auth/Genocs.Auth.csproj | 4 +- src/Genocs.Auth/Handlers/JwtHandler.cs | 2 +- src/Genocs.Auth/IJwtOptionsBuilder.cs | 2 +- .../{README.md => README_NUGET.md} | 2 +- .../Services/InMemoryAccessTokenService.cs | 2 +- .../AppSettings.cs | 2 +- src/Genocs.Common/Genocs.Common.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../Genocs.Core.Demo.WebApi.csproj | 1 + .../Extensions/BuilderExtensions.cs | 15 +- .../Extensions/ServiceCollectionExtensions.cs | 2 +- .../Services/ExternalServiceClient.cs | 9 +- .../Options/ExternalServiceSettings.cs | 24 +- src/Genocs.Core.Demo.WebApi/Program.cs | 9 +- src/Genocs.Core.Demo.Worker/Program.cs | 2 +- src/Genocs.Core/Builders/Extensions.cs | 2 +- src/Genocs.Core/Genocs.Core.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 ...onsBuilder.cs => ConsulSettingsBuilder.cs} | 22 +- .../ConsulSettings.cs | 2 +- .../Configurations/IConsulSettingsBuilder.cs | 15 + src/Genocs.Discovery.Consul/Extensions.cs | 8 +- .../Genocs.Discovery.Consul.csproj | 4 +- .../Http/ConsulHttpClient.cs | 2 +- .../ConsulServiceDiscoveryMessageHandler.cs | 2 +- .../Options/IConsulOptionsBuilder.cs | 15 - .../{README.md => README_NUGET.md} | 0 .../RestEaseSettings.cs | 0 src/Genocs.HTTP.RestEase/Extensions.cs | 10 +- .../Genocs.HTTP.RestEase.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../HttpClientSettings.cs | 12 +- src/Genocs.HTTP/Extensions.cs | 2 +- src/Genocs.HTTP/Genocs.HTTP.csproj | 4 +- src/Genocs.HTTP/GenocsHttpClient.cs | 26 +- src/Genocs.HTTP/GenocsHttpLoggingFilter.cs | 2 +- .../GenocsLoggingScopeHttpMessageHandler.cs | 12 +- .../{README.md => README_NUGET.md} | 0 .../Builders/FabioOptionsBuilder.cs | 50 --- .../Builders/FabioSettingsBuilder.cs | 50 +++ .../FabioSettings.cs | 2 +- .../IFabioSettingsBuilder.cs} | 26 +- src/Genocs.LoadBalancing.Fabio/Extensions.cs | 12 +- .../Genocs.LoadBalancing.Fabio.csproj | 4 +- .../Http/FabioHttpClient.cs | 10 +- .../MessageHandlers/FabioMessageHandler.cs | 19 +- .../{README.md => README_NUGET.md} | 0 .../AzureSettings.cs | 2 +- .../ConsoleSettings.cs | 2 +- .../ElkSettings.cs | 2 +- .../LocalFileSettings.cs | 2 +- .../LoggerSettings.cs | 2 +- .../LokiSettings.cs | 2 +- .../MongoSettings.cs | 2 +- .../SeqSettings.cs | 2 +- src/Genocs.Logging/Extensions.cs | 20 +- src/Genocs.Logging/Genocs.Logging.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 src/Genocs.Logging/Startup.cs | 29 ++ ...enocs.MessageBrokers.Outbox.MongoDB.csproj | 4 +- .../Internals/MongoMessageOutbox.cs | 2 +- .../Internals/MongoOutboxInitializer.cs | 2 +- .../{README.md => README_NUGET.md} | 0 .../OutboxSettings.cs | 2 +- .../MessageOutboxConfigurator.cs | 2 +- .../Extensions.cs | 2 +- .../Genocs.MessageBrokers.Outbox.csproj | 4 +- .../IMessageOutboxConfigurator.cs | 2 +- .../Outbox/InMemoryMessageOutbox.cs | 2 +- .../Processors/OutboxProcessor.cs | 2 +- .../{README.md => README_NUGET.md} | 0 .../Genocs.MessageBrokers.RabbitMQ.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../Genocs.MessageBrokers.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 ...nsBuilder.cs => MetricsSettingsBuilder.cs} | 20 +- .../Configurations/IMetricsSettingsBuilder.cs | 14 + .../MetricsSettings.cs | 4 +- src/Genocs.Metrics/AppMetrics/Extensions.cs | 8 +- .../AppMetrics/IMetricsOptionsBuilder.cs | 16 - src/Genocs.Metrics/Genocs.Metrics.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../Genocs.Monitoring.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../EncryptionUnitTest.cs | 5 - .../Builders/MongoDbOptionsBuilder.cs | 2 +- .../MongoDbEncryptionSettings.cs | 69 ++++ .../MongoDbSettings.cs | 2 +- .../Encryptions/AzureInitializer.cs | 39 +- .../Extensions/MongoDbExtensions.cs | 2 +- .../Genocs.Persistence.MongoDb.csproj | 4 +- .../IMongoDatabaseProvider.cs | 3 +- .../Initializers/MongoDbInitializer.cs | 2 +- .../MongoDatabaseProvider.cs | 4 +- .../Options/MongoDbEncryptionSettings.cs | 70 ---- .../{README.md => README_NUGET.md} | 0 .../Repositories/IMongoDbOptionsBuilder.cs | 2 +- ...ionsBuilder.cs => RedisSettingsBuilder.cs} | 8 +- .../Configurations/IRedisSettingsBuilder.cs | 8 + .../RedisSettings.cs | 2 +- src/Genocs.Persistence.Redis/Extensions.cs | 12 +- .../Genocs.Persistence.Redis.csproj | 4 +- .../IRedisOptionsBuilder.cs | 10 - .../{README.md => README_NUGET.md} | 0 .../DynamicQuery/TreeTraverseUnitTests.cs | 6 - .../Genocs.QueryBuilder.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../AzureKeyVaultSettings.cs | 2 +- .../Extensions.cs | 7 +- .../Genocs.Secrets.AzureKeyVault.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../VaultSettings.cs | 2 +- src/Genocs.Secrets.Vault/Extensions.cs | 2 +- .../Genocs.Secrets.Vault.csproj | 4 +- .../Internals/CertificatesIssuer.cs | 2 +- .../Internals/KeyValueSecrets.cs | 2 +- .../Internals/VaultHostedService.cs | 22 +- .../{README.md => README_NUGET.md} | 0 src/Genocs.Security/Genocs.Security.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../AzureServiceBusQueueSettings.cs | 15 + .../AzureServiceBusTopicSettings.cs | 17 + .../Genocs.ServiceBusAzure.csproj | 4 +- .../Options/AzureServiceBusQueueSettings.cs | 16 - .../Options/AzureServiceBusTopicSettings.cs | 18 - .../Queues/AzureServiceBusQueue.cs | 6 +- .../Interfaces/IAzureServiceBusQueue.cs | 7 +- .../{README.md => README_NUGET.md} | 0 .../Topics/AzureServiceBusTopic.cs | 371 +++++++++--------- .../Genocs.Tracing.Jaeger.RabbitMQ.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 src/Genocs.Tracing/Extensions.cs | 6 +- src/Genocs.Tracing/Genocs.Tracing.csproj | 4 +- .../Jaeger/Builders/JaegerOptionsBuilder.cs | 2 +- .../IJaegerOptionsBuilder.cs | 2 +- .../JaegerSettings.cs | 6 +- src/Genocs.Tracing/Jaeger/Extensions.cs | 2 +- .../{README.md => README_NUGET.md} | 0 .../Genocs.WebApi.CQRS.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../CertificateMiddleware.cs | 1 + .../SecuritySettings.cs | 2 +- src/Genocs.WebApi.Security/Extensions.cs | 1 + .../Genocs.WebApi.Security.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../Docs/Builders/SwaggerOptionsBuilder.cs | 6 +- .../ISwaggerOptionsBuilder.cs | 4 +- .../SwaggerSettings.cs} | 4 +- src/Genocs.WebApi.Swagger/Docs/Extensions.cs | 7 +- src/Genocs.WebApi.Swagger/Extensions.cs | 3 +- .../Genocs.WebApi.Swagger.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../Configurations/WebApiOptions.cs | 27 ++ .../WebApiSettings.cs | 4 +- src/Genocs.WebApi/EndpointsBuilder.cs | 6 +- src/Genocs.WebApi/Extensions.cs | 9 +- src/Genocs.WebApi/Genocs.WebApi.csproj | 4 +- .../{README.md => README_NUGET.md} | 0 .../Framework/CorrelationContextBuilder.cs | 4 +- .../api-gateway/Genocs.APIGateway/Startup.cs | 2 +- .../CorrelationIdFactory.cs | 25 +- .../OutboxCommandHandlerDecorator.cs | 2 +- .../Decorators/OutboxEventHandlerDecorator.cs | 2 +- .../Domain/Entities/User.cs | 13 +- .../Extensions.cs | 2 +- .../Genocs.Identities.WebApi/Program.cs | 9 +- .../orders/Genocs.Orders.WebApi/Program.cs | 9 +- .../Services/ProductServiceClient.cs | 6 +- .../Genocs.Products.WebApi/Domain/Product.cs | 3 +- .../Genocs.Products.WebApi/Program.cs | 9 +- .../signalr/Genocs.SignalR.WebApi/Program.cs | 9 +- 185 files changed, 833 insertions(+), 767 deletions(-) rename src/Genocs.Auth/{Options => Configurations}/JwtSettings.cs (94%) rename src/Genocs.Auth/{README.md => README_NUGET.md} (96%) rename src/Genocs.Common/{Options => Configurations}/AppSettings.cs (96%) rename src/Genocs.Common/{README.md => README_NUGET.md} (100%) rename src/Genocs.Core/{README.md => README_NUGET.md} (100%) rename src/Genocs.Discovery.Consul/Builders/{ConsulOptionsBuilder.cs => ConsulSettingsBuilder.cs} (53%) rename src/Genocs.Discovery.Consul/{Options => Configurations}/ConsulSettings.cs (93%) create mode 100644 src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs delete mode 100644 src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs rename src/Genocs.Discovery.Consul/{README.md => README_NUGET.md} (100%) rename src/Genocs.HTTP.RestEase/{Options => Configurations}/RestEaseSettings.cs (100%) rename src/Genocs.HTTP.RestEase/{README.md => README_NUGET.md} (100%) rename src/Genocs.HTTP/{Options => Configurations}/HttpClientSettings.cs (69%) rename src/Genocs.HTTP/{README.md => README_NUGET.md} (100%) delete mode 100644 src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs create mode 100644 src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs rename src/Genocs.LoadBalancing.Fabio/{Options => Configurations}/FabioSettings.cs (91%) rename src/Genocs.LoadBalancing.Fabio/{IFabioOptionsBuilder.cs => Configurations/IFabioSettingsBuilder.cs} (52%) rename src/Genocs.LoadBalancing.Fabio/{README.md => README_NUGET.md} (100%) rename src/Genocs.Logging/{Options => Configurations}/AzureSettings.cs (91%) rename src/Genocs.Logging/{Options => Configurations}/ConsoleSettings.cs (85%) rename src/Genocs.Logging/{Options => Configurations}/ElkSettings.cs (93%) rename src/Genocs.Logging/{Options => Configurations}/LocalFileSettings.cs (92%) rename src/Genocs.Logging/{Options => Configurations}/LoggerSettings.cs (96%) rename src/Genocs.Logging/{Options => Configurations}/LokiSettings.cs (97%) rename src/Genocs.Logging/{Options => Configurations}/MongoSettings.cs (85%) rename src/Genocs.Logging/{Options => Configurations}/SeqSettings.cs (77%) rename src/Genocs.Logging/{README.md => README_NUGET.md} (100%) create mode 100644 src/Genocs.Logging/Startup.cs rename src/Genocs.MessageBrokers.Outbox.MongoDB/{README.md => README_NUGET.md} (100%) rename src/Genocs.MessageBrokers.Outbox/{Options => Configurations}/OutboxSettings.cs (86%) rename src/Genocs.MessageBrokers.Outbox/{README.md => README_NUGET.md} (100%) rename src/Genocs.MessageBrokers.RabbitMQ/{README.md => README_NUGET.md} (100%) rename src/Genocs.MessageBrokers/{README.md => README_NUGET.md} (100%) rename src/Genocs.Metrics/AppMetrics/Builders/{MetricsOptionsBuilder.cs => MetricsSettingsBuilder.cs} (53%) create mode 100644 src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs rename src/Genocs.Metrics/AppMetrics/{Options => Configurations}/MetricsSettings.cs (92%) delete mode 100644 src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs rename src/Genocs.Metrics/{README.md => README_NUGET.md} (100%) rename src/Genocs.Monitoring/{README.md => README_NUGET.md} (100%) create mode 100644 src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs rename src/Genocs.Persistence.MongoDb/{Options => Configurations}/MongoDbSettings.cs (96%) delete mode 100644 src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs rename src/Genocs.Persistence.MongoDb/{README.md => README_NUGET.md} (100%) rename src/Genocs.Persistence.Redis/Builders/{RedisOptionsBuilder.cs => RedisSettingsBuilder.cs} (55%) create mode 100644 src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs rename src/Genocs.Persistence.Redis/{Options => Configurations}/RedisSettings.cs (91%) delete mode 100644 src/Genocs.Persistence.Redis/IRedisOptionsBuilder.cs rename src/Genocs.Persistence.Redis/{README.md => README_NUGET.md} (100%) rename src/Genocs.QueryBuilder/{README.md => README_NUGET.md} (100%) rename src/Genocs.Secrets.AzureKeyVault/{Options => Configurations}/AzureKeyVaultSettings.cs (90%) rename src/Genocs.Secrets.AzureKeyVault/{README.md => README_NUGET.md} (100%) rename src/Genocs.Secrets.Vault/{Options => Configurations}/VaultSettings.cs (97%) rename src/Genocs.Secrets.Vault/{README.md => README_NUGET.md} (100%) rename src/Genocs.Security/{README.md => README_NUGET.md} (100%) create mode 100644 src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs create mode 100644 src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs delete mode 100644 src/Genocs.ServiceBusAzure/Options/AzureServiceBusQueueSettings.cs delete mode 100644 src/Genocs.ServiceBusAzure/Options/AzureServiceBusTopicSettings.cs rename src/Genocs.ServiceBusAzure/{README.md => README_NUGET.md} (100%) rename src/Genocs.Tracing.Jaeger.RabbitMQ/{README.md => README_NUGET.md} (100%) rename src/Genocs.Tracing/Jaeger/{Options => Configurations}/IJaegerOptionsBuilder.cs (91%) rename src/Genocs.Tracing/Jaeger/{Options => Configurations}/JaegerSettings.cs (91%) rename src/Genocs.Tracing/{README.md => README_NUGET.md} (100%) rename src/Genocs.WebApi.CQRS/{README.md => README_NUGET.md} (100%) rename src/Genocs.WebApi.Security/{Options => Configurations}/SecuritySettings.cs (94%) rename src/Genocs.WebApi.Security/{README.md => README_NUGET.md} (100%) rename src/Genocs.WebApi.Swagger/Docs/{ => Configurations}/ISwaggerOptionsBuilder.cs (86%) rename src/Genocs.WebApi.Swagger/Docs/{SwaggerOptions.cs => Configurations/SwaggerSettings.cs} (80%) rename src/Genocs.WebApi.Swagger/{README.md => README_NUGET.md} (100%) create mode 100644 src/Genocs.WebApi/Configurations/WebApiOptions.cs rename src/Genocs.WebApi/{Options => Configurations}/WebApiSettings.cs (59%) rename src/Genocs.WebApi/{README.md => README_NUGET.md} (100%) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 5db7cfe0..536d0ea1 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -2,9 +2,9 @@ name: Build test and pack on: push: - branches: [ main ] + branches: [ main, develop ] pull_request: - branches: [ main ] + branches: [ main, develop ] jobs: build: diff --git a/Directory.Build.props b/Directory.Build.props index 984326b6..5b9ed5cc 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -22,9 +22,26 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + + true + + + true + + \ No newline at end of file diff --git a/containers/infrastructure-bare.yml b/containers/infrastructure-bare.yml index ba8e929a..31e236da 100644 --- a/containers/infrastructure-bare.yml +++ b/containers/infrastructure-bare.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: rabbitmq: image: masstransit/rabbitmq diff --git a/containers/infrastructure-elk.yml b/containers/infrastructure-elk.yml index d87f8929..3d03dfe6 100644 --- a/containers/infrastructure-elk.yml +++ b/containers/infrastructure-elk.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.3.2 diff --git a/containers/infrastructure-ml.yml b/containers/infrastructure-ml.yml index eba6aa7f..e3f0e21d 100644 --- a/containers/infrastructure-ml.yml +++ b/containers/infrastructure-ml.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: image_labeling: image: heartexlabs/label-studio:latest diff --git a/containers/infrastructure-monitoring.yml b/containers/infrastructure-monitoring.yml index 6c6b3ab6..7e9bcdcf 100644 --- a/containers/infrastructure-monitoring.yml +++ b/containers/infrastructure-monitoring.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: grafana: image: grafana/grafana diff --git a/containers/infrastructure-scaling.yml b/containers/infrastructure-scaling.yml index a7247e96..99ecf424 100644 --- a/containers/infrastructure-scaling.yml +++ b/containers/infrastructure-scaling.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: consul: image: hashicorp/consul diff --git a/containers/infrastructure-security.yml b/containers/infrastructure-security.yml index 07f089bf..3ecfd2c5 100644 --- a/containers/infrastructure-security.yml +++ b/containers/infrastructure-security.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: vault: image: hashicorp/vault diff --git a/containers/infrastructure-sqlserver.yml b/containers/infrastructure-sqlserver.yml index c88354d2..be0d0e94 100644 --- a/containers/infrastructure-sqlserver.yml +++ b/containers/infrastructure-sqlserver.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: sqlserver: diff --git a/demo-docker-compose.yml b/demo-docker-compose.yml index 2cccfe6b..fb63a465 100644 --- a/demo-docker-compose.yml +++ b/demo-docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.9' - services: application.webapi: image: genocs/demo-webapi:2.0.0 diff --git a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs index bf4b93cb..74aaad37 100644 --- a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs +++ b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; using Microsoft.AspNetCore.Http; using System.Net; diff --git a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs index 9ef51792..090698db 100644 --- a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs +++ b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; namespace Genocs.Auth.Builders; diff --git a/src/Genocs.Auth/Options/JwtSettings.cs b/src/Genocs.Auth/Configurations/JwtSettings.cs similarity index 94% rename from src/Genocs.Auth/Options/JwtSettings.cs rename to src/Genocs.Auth/Configurations/JwtSettings.cs index 08dfb6de..8a0311f6 100644 --- a/src/Genocs.Auth/Options/JwtSettings.cs +++ b/src/Genocs.Auth/Configurations/JwtSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Auth.Options; +namespace Genocs.Auth.Configurations; public class JwtSettings { @@ -12,7 +12,7 @@ public class JwtSettings /// public bool Enabled { get; set; } public IEnumerable? AllowAnonymousEndpoints { get; set; } - public CertificateOptions? Certificate { get; set; } + public CertificateSettings? Certificate { get; set; } public string? Algorithm { get; set; } public string? Issuer { get; set; } public string? IssuerSigningKey { get; set; } @@ -48,7 +48,7 @@ public class JwtSettings public string? NameClaimType { get; set; } public string? RoleClaimType { get; set; } - public class CertificateOptions + public class CertificateSettings { public string? Location { get; set; } public string? RawData { get; set; } diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index 4f74c0dc..75e2ffb3 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -1,5 +1,5 @@ +using Genocs.Auth.Configurations; using Genocs.Auth.Handlers; -using Genocs.Auth.Options; using Genocs.Auth.Services; using Genocs.Core.Builders; using Genocs.Security.Services; @@ -83,7 +83,7 @@ private static IGenocsBuilder AddJwt( if (jwtSettings.Certificate is not null) { X509Certificate2? certificate = null; - string password = jwtSettings.Certificate.Password; + string? password = jwtSettings.Certificate.Password; bool hasPassword = !string.IsNullOrWhiteSpace(password); if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.Location)) { @@ -208,7 +208,6 @@ public static IGenocsBuilder AddOpenIdJwt( return builder; } - /// /// It adds the private key JWT authentication. /// diff --git a/src/Genocs.Auth/Genocs.Auth.csproj b/src/Genocs.Auth/Genocs.Auth.csproj index ce0c8e54..d90636d6 100644 --- a/src/Genocs.Auth/Genocs.Auth.csproj +++ b/src/Genocs.Auth/Genocs.Auth.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Auth/Handlers/JwtHandler.cs b/src/Genocs.Auth/Handlers/JwtHandler.cs index f3ce917b..fe8ec6c3 100644 --- a/src/Genocs.Auth/Handlers/JwtHandler.cs +++ b/src/Genocs.Auth/Handlers/JwtHandler.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; diff --git a/src/Genocs.Auth/IJwtOptionsBuilder.cs b/src/Genocs.Auth/IJwtOptionsBuilder.cs index d3aa7cef..341a7542 100644 --- a/src/Genocs.Auth/IJwtOptionsBuilder.cs +++ b/src/Genocs.Auth/IJwtOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; namespace Genocs.Auth; diff --git a/src/Genocs.Auth/README.md b/src/Genocs.Auth/README_NUGET.md similarity index 96% rename from src/Genocs.Auth/README.md rename to src/Genocs.Auth/README_NUGET.md index 29459bfd..86096c0e 100644 --- a/src/Genocs.Auth/README.md +++ b/src/Genocs.Auth/README_NUGET.md @@ -3,7 +3,7 @@ This package contains a set of functionalities to handling authorization logic as JWT. First of all I have to say thanks to devmentors. -The libraries are built using .NET7. +The libraries are built using net8, net7, net6. ## Description diff --git a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs index 8e95a03f..07ebfce6 100644 --- a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs +++ b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs @@ -1,4 +1,4 @@ -using Genocs.Auth.Options; +using Genocs.Auth.Configurations; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Primitives; diff --git a/src/Genocs.Common/Options/AppSettings.cs b/src/Genocs.Common/Configurations/AppSettings.cs similarity index 96% rename from src/Genocs.Common/Options/AppSettings.cs rename to src/Genocs.Common/Configurations/AppSettings.cs index 3af8f1ef..70dedf7b 100644 --- a/src/Genocs.Common/Options/AppSettings.cs +++ b/src/Genocs.Common/Configurations/AppSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Common.Options; +namespace Genocs.Common.Configurations; /// /// The application settings. diff --git a/src/Genocs.Common/Genocs.Common.csproj b/src/Genocs.Common/Genocs.Common.csproj index 2ab02e42..b18067f9 100644 --- a/src/Genocs.Common/Genocs.Common.csproj +++ b/src/Genocs.Common/Genocs.Common.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Common/README.md b/src/Genocs.Common/README_NUGET.md similarity index 100% rename from src/Genocs.Common/README.md rename to src/Genocs.Common/README_NUGET.md diff --git a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj index 6a363384..dd2e6a27 100644 --- a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj +++ b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj @@ -40,6 +40,7 @@ + diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs index 0cdf5260..f41c1804 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs @@ -26,9 +26,18 @@ public static IGenocsBuilder AddApplicationServices(this IGenocsBuilder builder) builder.AddHttpClient(); // Add the External Service settings - var settings = new ExternalServiceSettings(); - builder.Configuration.GetSection(ExternalServiceSettings.Position).Bind(settings); - builder.Services.AddSingleton(settings); + // Option 1: In this way ExternalServiceSettings is available for dependency injection. + // var settings = new ExternalServiceSettings(); + // builder.Configuration.GetSection(ExternalServiceSettings.Position).Bind(settings); + // builder.Services.AddSingleton(settings); + + // Option 2: In this way ExternalServiceSettings is available for dependency injection. By using IOptions you can access the settings. + builder.Services.AddOptions() + .BindConfiguration(ExternalServiceSettings.Position) + .ValidateDataAnnotations() + .ValidateOnStart(); + + // builder.Services.AddSingleton, ConfigureWebApiSettings>(); // Add the External Service http Client builder.Services.AddTransient(); diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs index ef682b8b..ec7625ca 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -1,5 +1,5 @@ using Genocs.Core.Demo.WebApi.Options; -using Genocs.ServiceBusAzure.Options; +using Genocs.ServiceBusAzure.Configurations; using Genocs.ServiceBusAzure.Queues; using Genocs.ServiceBusAzure.Queues.Interfaces; using Genocs.ServiceBusAzure.Topics; diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs index 459ebd9c..0ea30e85 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs @@ -1,7 +1,8 @@ using Genocs.Core.Demo.WebApi.Options; using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.Security; +using Microsoft.Extensions.Options; using Newtonsoft.Json; namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; @@ -22,16 +23,16 @@ public class ExternalServiceClient : IExternalServiceClient /// The http client. /// The Hash service. /// The http client settings. - /// The security settings. + /// The security settings. public ExternalServiceClient( IHttpClient client, IHasher hasher, HttpClientSettings httpClientSettings, - ExternalServiceSettings externalServiceSettings) + IOptions options) { _client = client ?? throw new ArgumentNullException(nameof(client)); _hasher = hasher ?? throw new ArgumentNullException(nameof(hasher)); - _externalServiceSettings = externalServiceSettings ?? throw new ArgumentNullException(nameof(externalServiceSettings)); + _externalServiceSettings = options.Value ?? throw new ArgumentNullException(nameof(options)); if (httpClientSettings is null) { diff --git a/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs b/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs index 4a73893e..5b7386f4 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs @@ -1,10 +1,30 @@ -namespace Genocs.Core.Demo.WebApi.Options; +using System.ComponentModel.DataAnnotations; -public class ExternalServiceSettings +namespace Genocs.Core.Demo.WebApi.Options; + +public class ExternalServiceSettings : IValidatableObject { public const string Position = "ExternalService"; public string Caller { get; set; } = default!; public string Private { get; set; } = default!; public string Public { get; set; } = default!; + + public IEnumerable Validate(ValidationContext validationContext) + { + if (string.IsNullOrWhiteSpace(Caller)) + { + yield return new ValidationResult("No Caller defined in ExternalService config", new[] { nameof(Caller) }); + } + + if (string.IsNullOrWhiteSpace(Private)) + { + yield return new ValidationResult("No Private defined in ExternalService config", new[] { nameof(Private) }); + } + + if (string.IsNullOrWhiteSpace(Public)) + { + yield return new ValidationResult("No Public defined in ExternalService config", new[] { nameof(Public) }); + } + } } diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index a9436578..691a782d 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -8,17 +8,10 @@ using Genocs.Tracing; using Microsoft.Extensions.Diagnostics.HealthChecks; using Serilog; -using Serilog.Events; using System.Reflection; using System.Text.Json.Serialization; -Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("MassTransit", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .CreateLogger(); +StaticLogger.EnsureInitialized(); var builder = WebApplication.CreateBuilder(args); diff --git a/src/Genocs.Core.Demo.Worker/Program.cs b/src/Genocs.Core.Demo.Worker/Program.cs index 03bcee15..49527388 100644 --- a/src/Genocs.Core.Demo.Worker/Program.cs +++ b/src/Genocs.Core.Demo.Worker/Program.cs @@ -11,7 +11,6 @@ using Genocs.Persistence.MongoDb.Extensions; using Genocs.Persistence.MongoDb.Repositories; using Genocs.Persistence.MongoDb.Repositories.Clean; -using Genocs.ServiceBusAzure.Options; using Genocs.ServiceBusAzure.Queues; using Genocs.ServiceBusAzure.Queues.Interfaces; using Genocs.ServiceBusAzure.Topics; @@ -21,6 +20,7 @@ using Serilog; using Serilog.Events; using System.Reflection; +using Genocs.ServiceBusAzure.Configurations; Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() diff --git a/src/Genocs.Core/Builders/Extensions.cs b/src/Genocs.Core/Builders/Extensions.cs index 6cd7ed22..1d951979 100644 --- a/src/Genocs.Core/Builders/Extensions.cs +++ b/src/Genocs.Core/Builders/Extensions.cs @@ -1,4 +1,4 @@ -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Common.Types; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; diff --git a/src/Genocs.Core/Genocs.Core.csproj b/src/Genocs.Core/Genocs.Core.csproj index 7613dec3..6e259383 100644 --- a/src/Genocs.Core/Genocs.Core.csproj +++ b/src/Genocs.Core/Genocs.Core.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Updated to NET8 True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Core/README.md b/src/Genocs.Core/README_NUGET.md similarity index 100% rename from src/Genocs.Core/README.md rename to src/Genocs.Core/README_NUGET.md diff --git a/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs b/src/Genocs.Discovery.Consul/Builders/ConsulSettingsBuilder.cs similarity index 53% rename from src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs rename to src/Genocs.Discovery.Consul/Builders/ConsulSettingsBuilder.cs index 8c7e3685..23f1e1d8 100644 --- a/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs +++ b/src/Genocs.Discovery.Consul/Builders/ConsulSettingsBuilder.cs @@ -1,60 +1,60 @@ -using Genocs.Discovery.Consul.Options; +using Genocs.Discovery.Consul.Configurations; namespace Genocs.Discovery.Consul.Builders; -internal sealed class ConsulOptionsBuilder : IConsulOptionsBuilder +internal sealed class ConsulSettingsBuilder : IConsulSettingsBuilder { private readonly ConsulSettings _options = new(); - public IConsulOptionsBuilder Enable(bool enabled) + public IConsulSettingsBuilder Enable(bool enabled) { _options.Enabled = enabled; return this; } - public IConsulOptionsBuilder WithUrl(string url) + public IConsulSettingsBuilder WithUrl(string url) { _options.Url = url; return this; } - public IConsulOptionsBuilder WithService(string service) + public IConsulSettingsBuilder WithService(string service) { _options.Service = service; return this; } - public IConsulOptionsBuilder WithAddress(string address) + public IConsulSettingsBuilder WithAddress(string address) { _options.Address = address; return this; } - public IConsulOptionsBuilder WithEnabledPing(bool pingEnabled) + public IConsulSettingsBuilder WithEnabledPing(bool pingEnabled) { _options.PingEnabled = pingEnabled; return this; } - public IConsulOptionsBuilder WithPingEndpoint(string pingEndpoint) + public IConsulSettingsBuilder WithPingEndpoint(string pingEndpoint) { _options.PingEndpoint = pingEndpoint; return this; } - public IConsulOptionsBuilder WithPingInterval(string pingInterval) + public IConsulSettingsBuilder WithPingInterval(string pingInterval) { _options.PingInterval = pingInterval; return this; } - public IConsulOptionsBuilder WithRemoteAfterInterval(string remoteAfterInterval) + public IConsulSettingsBuilder WithRemoteAfterInterval(string remoteAfterInterval) { _options.RemoveAfterInterval = remoteAfterInterval; return this; } - public IConsulOptionsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace) + public IConsulSettingsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace) { _options.SkipLocalhostDockerDnsReplace = skipLocalhostDockerDnsReplace; return this; diff --git a/src/Genocs.Discovery.Consul/Options/ConsulSettings.cs b/src/Genocs.Discovery.Consul/Configurations/ConsulSettings.cs similarity index 93% rename from src/Genocs.Discovery.Consul/Options/ConsulSettings.cs rename to src/Genocs.Discovery.Consul/Configurations/ConsulSettings.cs index d16f9642..a07ff2ef 100644 --- a/src/Genocs.Discovery.Consul/Options/ConsulSettings.cs +++ b/src/Genocs.Discovery.Consul/Configurations/ConsulSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Discovery.Consul.Options; +namespace Genocs.Discovery.Consul.Configurations; public class ConsulSettings { diff --git a/src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs b/src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs new file mode 100644 index 00000000..1288918d --- /dev/null +++ b/src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs @@ -0,0 +1,15 @@ +namespace Genocs.Discovery.Consul.Configurations; + +public interface IConsulSettingsBuilder +{ + IConsulSettingsBuilder Enable(bool enabled); + IConsulSettingsBuilder WithUrl(string url); + IConsulSettingsBuilder WithService(string service); + IConsulSettingsBuilder WithAddress(string address); + IConsulSettingsBuilder WithEnabledPing(bool pingEnabled); + IConsulSettingsBuilder WithPingEndpoint(string pingEndpoint); + IConsulSettingsBuilder WithPingInterval(string pingInterval); + IConsulSettingsBuilder WithRemoteAfterInterval(string remoteAfterInterval); + IConsulSettingsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace); + ConsulSettings Build(); +} \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/Extensions.cs b/src/Genocs.Discovery.Consul/Extensions.cs index ecebcb98..e412aa8b 100644 --- a/src/Genocs.Discovery.Consul/Extensions.cs +++ b/src/Genocs.Discovery.Consul/Extensions.cs @@ -1,12 +1,12 @@ using Genocs.Core.Builders; using Genocs.Discovery.Consul.Builders; +using Genocs.Discovery.Consul.Configurations; using Genocs.Discovery.Consul.Http; using Genocs.Discovery.Consul.MessageHandlers; using Genocs.Discovery.Consul.Models; -using Genocs.Discovery.Consul.Options; using Genocs.Discovery.Consul.Services; using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.DependencyInjection; namespace Genocs.Discovery.Consul; @@ -34,10 +34,10 @@ public static IGenocsBuilder AddConsul( public static IGenocsBuilder AddConsul( this IGenocsBuilder builder, - Func buildOptions, + Func buildOptions, HttpClientSettings httpClientOptions) { - var options = buildOptions(new ConsulOptionsBuilder()).Build(); + var options = buildOptions(new ConsulSettingsBuilder()).Build(); return builder.AddConsul(options, httpClientOptions); } diff --git a/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj b/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj index a488d839..a6861387 100644 --- a/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj +++ b/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs b/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs index 5b8691fe..ac4f97fa 100644 --- a/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs +++ b/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs @@ -1,5 +1,5 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; namespace Genocs.Discovery.Consul.Http; diff --git a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs index 162f57a7..0888cb6f 100644 --- a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs +++ b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs @@ -1,4 +1,4 @@ -using Genocs.Discovery.Consul.Options; +using Genocs.Discovery.Consul.Configurations; namespace Genocs.Discovery.Consul.MessageHandlers; diff --git a/src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs b/src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs deleted file mode 100644 index c4d8d850..00000000 --- a/src/Genocs.Discovery.Consul/Options/IConsulOptionsBuilder.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Genocs.Discovery.Consul.Options; - -public interface IConsulOptionsBuilder -{ - IConsulOptionsBuilder Enable(bool enabled); - IConsulOptionsBuilder WithUrl(string url); - IConsulOptionsBuilder WithService(string service); - IConsulOptionsBuilder WithAddress(string address); - IConsulOptionsBuilder WithEnabledPing(bool pingEnabled); - IConsulOptionsBuilder WithPingEndpoint(string pingEndpoint); - IConsulOptionsBuilder WithPingInterval(string pingInterval); - IConsulOptionsBuilder WithRemoteAfterInterval(string remoteAfterInterval); - IConsulOptionsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace); - ConsulSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/README.md b/src/Genocs.Discovery.Consul/README_NUGET.md similarity index 100% rename from src/Genocs.Discovery.Consul/README.md rename to src/Genocs.Discovery.Consul/README_NUGET.md diff --git a/src/Genocs.HTTP.RestEase/Options/RestEaseSettings.cs b/src/Genocs.HTTP.RestEase/Configurations/RestEaseSettings.cs similarity index 100% rename from src/Genocs.HTTP.RestEase/Options/RestEaseSettings.cs rename to src/Genocs.HTTP.RestEase/Configurations/RestEaseSettings.cs diff --git a/src/Genocs.HTTP.RestEase/Extensions.cs b/src/Genocs.HTTP.RestEase/Extensions.cs index 70020773..430ebc98 100644 --- a/src/Genocs.HTTP.RestEase/Extensions.cs +++ b/src/Genocs.HTTP.RestEase/Extensions.cs @@ -1,12 +1,12 @@ using Genocs.Core.Builders; using Genocs.Discovery.Consul; -using Genocs.Discovery.Consul.Options; -using Genocs.HTTP.Options; +using Genocs.Discovery.Consul.Configurations; +using Genocs.HTTP.Configurations; using Genocs.HTTP.RestEase.Builders; using Genocs.HTTP.RestEase.Options; using Genocs.HTTP.RestEase.Serializers; using Genocs.LoadBalancing.Fabio; -using Genocs.LoadBalancing.Fabio.Options; +using Genocs.LoadBalancing.Fabio.Configurations; using Microsoft.Extensions.DependencyInjection; using RestEase; @@ -34,8 +34,8 @@ public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, st public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, string serviceName, Func buildOptions, - Func buildConsulOptions, - Func buildFabioOptions, + Func buildConsulOptions, + Func buildFabioOptions, HttpClientSettings httpClientOptions) where T : class { diff --git a/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj b/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj index d0424313..1892fb7b 100644 --- a/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj +++ b/src/Genocs.HTTP.RestEase/Genocs.HTTP.RestEase.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.HTTP.RestEase/README.md b/src/Genocs.HTTP.RestEase/README_NUGET.md similarity index 100% rename from src/Genocs.HTTP.RestEase/README.md rename to src/Genocs.HTTP.RestEase/README_NUGET.md diff --git a/src/Genocs.HTTP/Options/HttpClientSettings.cs b/src/Genocs.HTTP/Configurations/HttpClientSettings.cs similarity index 69% rename from src/Genocs.HTTP/Options/HttpClientSettings.cs rename to src/Genocs.HTTP/Configurations/HttpClientSettings.cs index 42fde541..ebae8708 100644 --- a/src/Genocs.HTTP/Options/HttpClientSettings.cs +++ b/src/Genocs.HTTP/Configurations/HttpClientSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.HTTP.Options; +namespace Genocs.HTTP.Configurations; /// /// The HttpClient Settings class. @@ -20,15 +20,15 @@ public class HttpClientSettings /// It defines the list of services to be registered. /// public IDictionary? Services { get; set; } - public RequestMaskingSettings RequestMasking { get; set; } + public RequestMaskingSettings? RequestMasking { get; set; } public bool RemoveCharsetFromContentType { get; set; } - public string CorrelationContextHeader { get; set; } - public string CorrelationIdHeader { get; set; } + public string? CorrelationContextHeader { get; set; } + public string? CorrelationIdHeader { get; set; } public class RequestMaskingSettings { public bool Enabled { get; set; } - public IEnumerable UrlParts { get; set; } - public string MaskTemplate { get; set; } + public IEnumerable? UrlParts { get; set; } + public string? MaskTemplate { get; set; } } } \ No newline at end of file diff --git a/src/Genocs.HTTP/Extensions.cs b/src/Genocs.HTTP/Extensions.cs index 13238b93..85387b13 100644 --- a/src/Genocs.HTTP/Extensions.cs +++ b/src/Genocs.HTTP/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Http; diff --git a/src/Genocs.HTTP/Genocs.HTTP.csproj b/src/Genocs.HTTP/Genocs.HTTP.csproj index 8179ec30..7260ea03 100644 --- a/src/Genocs.HTTP/Genocs.HTTP.csproj +++ b/src/Genocs.HTTP/Genocs.HTTP.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.HTTP/GenocsHttpClient.cs b/src/Genocs.HTTP/GenocsHttpClient.cs index c407de2a..e5fd254d 100644 --- a/src/Genocs.HTTP/GenocsHttpClient.cs +++ b/src/Genocs.HTTP/GenocsHttpClient.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Polly; using System.Net.Http.Headers; using System.Text; @@ -12,32 +12,32 @@ public class GenocsHttpClient : IHttpClient { private const string JsonContentType = "application/json"; private readonly HttpClient _client; - private readonly HttpClientSettings _options; + private readonly HttpClientSettings _settings; private readonly IHttpClientSerializer _serializer; public GenocsHttpClient( HttpClient client, - HttpClientSettings options, + HttpClientSettings settings, IHttpClientSerializer serializer, ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) { _client = client; - _options = options; + _settings = settings; _serializer = serializer; - if (!string.IsNullOrWhiteSpace(_options.CorrelationContextHeader)) + if (!string.IsNullOrWhiteSpace(_settings.CorrelationContextHeader)) { string correlationContext = correlationContextFactory.Create(); _client.DefaultRequestHeaders.TryAddWithoutValidation( - _options.CorrelationContextHeader, + _settings.CorrelationContextHeader, correlationContext); } - if (!string.IsNullOrWhiteSpace(_options.CorrelationIdHeader)) + if (!string.IsNullOrWhiteSpace(_settings.CorrelationIdHeader)) { string? correlationId = correlationIdFactory.Create(); _client.DefaultRequestHeaders.TryAddWithoutValidation( - _options.CorrelationIdHeader, + _settings.CorrelationIdHeader, correlationId); } } @@ -116,12 +116,12 @@ public Task> DeleteResultAsync(string uri, IHttpClientSerialize public Task SendAsync(HttpRequestMessage request) => Policy.Handle() - .WaitAndRetryAsync(_options.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) + .WaitAndRetryAsync(_settings.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) .ExecuteAsync(() => _client.SendAsync(request)); public Task SendAsync(HttpRequestMessage request, IHttpClientSerializer? serializer = null) => Policy.Handle() - .WaitAndRetryAsync(_options.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) + .WaitAndRetryAsync(_settings.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) .ExecuteAsync(async () => { var response = await _client.SendAsync(request); @@ -137,7 +137,7 @@ public Task SendAsync(HttpRequestMessage request, IHttpClientSerializer? s public Task> SendResultAsync(HttpRequestMessage request, IHttpClientSerializer? serializer = null) => Policy.Handle() - .WaitAndRetryAsync(_options.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) + .WaitAndRetryAsync(_settings.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) .ExecuteAsync(async () => { var response = await _client.SendAsync(request); @@ -205,7 +205,7 @@ protected virtual async Task> SendResultAsync( protected virtual Task SendAsync(string uri, Method method, HttpContent? content = null) => Policy.Handle() - .WaitAndRetryAsync(_options.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) + .WaitAndRetryAsync(_settings.Retries, r => TimeSpan.FromSeconds(Math.Pow(2, r))) .ExecuteAsync(() => { string requestUri = uri.StartsWith("http") ? uri : $"http://{uri}"; @@ -233,7 +233,7 @@ protected virtual Task GetResponseAsync(string uri, Method serializer ??= _serializer; var content = new StringContent(serializer.Serialize(data), Encoding.UTF8, JsonContentType); - if (_options.RemoveCharsetFromContentType && content.Headers.ContentType is not null) + if (_settings.RemoveCharsetFromContentType && content.Headers.ContentType is not null) { content.Headers.ContentType.CharSet = null; } diff --git a/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs b/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs index 7d30997a..a4b34417 100644 --- a/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs +++ b/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; diff --git a/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs b/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs index 529f245f..b354aa41 100644 --- a/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs +++ b/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Microsoft.Extensions.Logging; using System.Net; @@ -10,15 +10,15 @@ internal sealed class GenocsLoggingScopeHttpMessageHandler : DelegatingHandler private readonly HashSet _maskedRequestUrlParts; private readonly string _maskTemplate; - public GenocsLoggingScopeHttpMessageHandler(ILogger logger, HttpClientSettings options) + public GenocsLoggingScopeHttpMessageHandler(ILogger logger, HttpClientSettings settings) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _ = options ?? throw new ArgumentNullException(nameof(options)); + _ = settings ?? throw new ArgumentNullException(nameof(settings)); _maskedRequestUrlParts = - new HashSet(options.RequestMasking?.UrlParts ?? Enumerable.Empty()); - _maskTemplate = string.IsNullOrWhiteSpace(options.RequestMasking?.MaskTemplate) + new HashSet(settings.RequestMasking?.UrlParts ?? Enumerable.Empty()); + _maskTemplate = string.IsNullOrWhiteSpace(settings.RequestMasking?.MaskTemplate) ? "*****" - : options.RequestMasking.MaskTemplate; + : settings.RequestMasking.MaskTemplate; } protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) diff --git a/src/Genocs.HTTP/README.md b/src/Genocs.HTTP/README_NUGET.md similarity index 100% rename from src/Genocs.HTTP/README.md rename to src/Genocs.HTTP/README_NUGET.md diff --git a/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs deleted file mode 100644 index ec923b1d..00000000 --- a/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Genocs.LoadBalancing.Fabio.Options; - -namespace Genocs.LoadBalancing.Fabio.Builders; - -/// -/// The Fabio options builder -/// -public class FabioOptionsBuilder : IFabioOptionsBuilder -{ - private readonly FabioSettings _options = new(); - - /// - /// Enable or disable the Fabio load balancer - /// - /// - /// The option builder to be used for chain the build - public IFabioOptionsBuilder Enable(bool enabled) - { - _options.Enabled = enabled; - return this; - } - - /// - /// Set the Fabio url - /// - /// The url - /// The option builder to be used for chain the build - public IFabioOptionsBuilder WithUrl(string url) - { - _options.Url = url; - return this; - } - - /// - /// Set the Fabio service name - /// - /// The service name - /// The option builder to be used for chain the build - public IFabioOptionsBuilder WithService(string service) - { - _options.Service = service; - return this; - } - - /// - /// Build the Fabio options - /// - /// The Fabio options - public FabioSettings Build() => _options; -} \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs new file mode 100644 index 00000000..a1a8db29 --- /dev/null +++ b/src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs @@ -0,0 +1,50 @@ +using Genocs.LoadBalancing.Fabio.Configurations; + +namespace Genocs.LoadBalancing.Fabio.Builders; + +/// +/// The Fabio options builder. +/// +public class FabioSettingsBuilder : IFabioSettingsBuilder +{ + private readonly FabioSettings _settings = new(); + + /// + /// Enable or disable the Fabio load balancer. + /// + /// + /// The option builder to be used for chain the build. + public IFabioSettingsBuilder Enable(bool enabled) + { + _settings.Enabled = enabled; + return this; + } + + /// + /// Set the Fabio url. + /// + /// The url. + /// The option builder to be used for chain the build. + public IFabioSettingsBuilder WithUrl(string url) + { + _settings.Url = url; + return this; + } + + /// + /// Set the Fabio service name. + /// + /// The service name + /// The option builder to be used for chain the build. + public IFabioSettingsBuilder WithService(string service) + { + _settings.Service = service; + return this; + } + + /// + /// Build the Fabio options. + /// + /// The Fabio options. + public FabioSettings Build() => _settings; +} \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/Options/FabioSettings.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioSettings.cs similarity index 91% rename from src/Genocs.LoadBalancing.Fabio/Options/FabioSettings.cs rename to src/Genocs.LoadBalancing.Fabio/Configurations/FabioSettings.cs index f7e6d9ab..3419e0a2 100644 --- a/src/Genocs.LoadBalancing.Fabio/Options/FabioSettings.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.LoadBalancing.Fabio.Options; +namespace Genocs.LoadBalancing.Fabio.Configurations; /// /// The Fabio settings. diff --git a/src/Genocs.LoadBalancing.Fabio/IFabioOptionsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioSettingsBuilder.cs similarity index 52% rename from src/Genocs.LoadBalancing.Fabio/IFabioOptionsBuilder.cs rename to src/Genocs.LoadBalancing.Fabio/Configurations/IFabioSettingsBuilder.cs index 478c1cb3..14eb9d21 100644 --- a/src/Genocs.LoadBalancing.Fabio/IFabioOptionsBuilder.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioSettingsBuilder.cs @@ -1,32 +1,30 @@ -using Genocs.LoadBalancing.Fabio.Options; - -namespace Genocs.LoadBalancing.Fabio; +namespace Genocs.LoadBalancing.Fabio.Configurations; /// -/// The Fabio options builder interface definition +/// The Fabio options builder interface definition. /// -public interface IFabioOptionsBuilder +public interface IFabioSettingsBuilder { /// - /// Enable or disable the Fabio load balancer + /// Enable or disable the Fabio load balancer. /// /// - /// The option builder to be used for chain the build - IFabioOptionsBuilder Enable(bool enabled); + /// The option builder to be used for chain the build. + IFabioSettingsBuilder Enable(bool enabled); /// - /// Set the Fabio url + /// Set the Fabio url. /// - /// The url - /// The option builder to be used for chain the build - IFabioOptionsBuilder WithUrl(string url); + /// The url. + /// The option builder to be used for chain the build. + IFabioSettingsBuilder WithUrl(string url); /// /// Set the Fabio service name /// - /// The service name + /// The service name. /// The option builder to be used for chain the build - IFabioOptionsBuilder WithService(string service); + IFabioSettingsBuilder WithService(string service); /// /// Build the Fabio options diff --git a/src/Genocs.LoadBalancing.Fabio/Extensions.cs b/src/Genocs.LoadBalancing.Fabio/Extensions.cs index e0e507f9..127a3581 100644 --- a/src/Genocs.LoadBalancing.Fabio/Extensions.cs +++ b/src/Genocs.LoadBalancing.Fabio/Extensions.cs @@ -1,13 +1,13 @@ using Genocs.Core.Builders; using Genocs.Discovery.Consul; +using Genocs.Discovery.Consul.Configurations; using Genocs.Discovery.Consul.Models; -using Genocs.Discovery.Consul.Options; using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.LoadBalancing.Fabio.Builders; +using Genocs.LoadBalancing.Fabio.Configurations; using Genocs.LoadBalancing.Fabio.Http; using Genocs.LoadBalancing.Fabio.MessageHandlers; -using Genocs.LoadBalancing.Fabio.Options; using Microsoft.Extensions.DependencyInjection; namespace Genocs.LoadBalancing.Fabio; @@ -32,11 +32,11 @@ public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, string sectio } public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, - Func buildOptions, - Func buildConsulOptions, + Func buildOptions, + Func buildConsulOptions, HttpClientSettings httpClientOptions) { - var fabioOptions = buildOptions(new FabioOptionsBuilder()).Build(); + var fabioOptions = buildOptions(new FabioSettingsBuilder()).Build(); return builder.AddFabio(fabioOptions, httpClientOptions, b => b.AddConsul(buildConsulOptions, httpClientOptions)); } diff --git a/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj b/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj index fcb8230f..5fbe8c12 100644 --- a/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj +++ b/src/Genocs.LoadBalancing.Fabio/Genocs.LoadBalancing.Fabio.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs b/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs index cb622682..4415fef0 100644 --- a/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs +++ b/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs @@ -1,12 +1,16 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; namespace Genocs.LoadBalancing.Fabio.Http; internal sealed class FabioHttpClient : GenocsHttpClient, IFabioHttpClient { - public FabioHttpClient(HttpClient client, HttpClientSettings options, IHttpClientSerializer serializer, - ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) + public FabioHttpClient( + HttpClient client, + HttpClientSettings options, + IHttpClientSerializer serializer, + ICorrelationContextFactory correlationContextFactory, + ICorrelationIdFactory correlationIdFactory) : base(client, options, serializer, correlationContextFactory, correlationIdFactory) { } diff --git a/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs b/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs index 416fb18a..f9382130 100644 --- a/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs +++ b/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs @@ -1,27 +1,28 @@ -using Genocs.LoadBalancing.Fabio.Options; +using Genocs.LoadBalancing.Fabio.Configurations; namespace Genocs.LoadBalancing.Fabio.MessageHandlers; internal sealed class FabioMessageHandler : DelegatingHandler { - private readonly FabioSettings _options; + private readonly FabioSettings _settings; private readonly string _servicePath; - public FabioMessageHandler(FabioSettings options, string? serviceName = null) + public FabioMessageHandler(FabioSettings settings, string? serviceName = null) { - if (string.IsNullOrWhiteSpace(options.Url)) + if (string.IsNullOrWhiteSpace(settings.Url)) { throw new InvalidOperationException("Fabio URL was not provided."); } - _options = options; + _settings = settings; _servicePath = string.IsNullOrWhiteSpace(serviceName) ? string.Empty : $"{serviceName}/"; } - protected override Task SendAsync(HttpRequestMessage request, - CancellationToken cancellationToken) + protected override Task SendAsync( + HttpRequestMessage request, + CancellationToken cancellationToken) { - if (!_options.Enabled) + if (!_settings.Enabled) { return base.SendAsync(request, cancellationToken); } @@ -32,5 +33,5 @@ protected override Task SendAsync(HttpRequestMessage reques } private Uri GetRequestUri(HttpRequestMessage request) - => new($"{_options.Url}/{_servicePath}{request.RequestUri.Host}{request.RequestUri.PathAndQuery}"); + => new($"{_settings.Url}/{_servicePath}{request.RequestUri.Host}{request.RequestUri.PathAndQuery}"); } \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/README.md b/src/Genocs.LoadBalancing.Fabio/README_NUGET.md similarity index 100% rename from src/Genocs.LoadBalancing.Fabio/README.md rename to src/Genocs.LoadBalancing.Fabio/README_NUGET.md diff --git a/src/Genocs.Logging/Options/AzureSettings.cs b/src/Genocs.Logging/Configurations/AzureSettings.cs similarity index 91% rename from src/Genocs.Logging/Options/AzureSettings.cs rename to src/Genocs.Logging/Configurations/AzureSettings.cs index 387881f8..8f09c72a 100644 --- a/src/Genocs.Logging/Options/AzureSettings.cs +++ b/src/Genocs.Logging/Configurations/AzureSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Azure application insights logging settings. diff --git a/src/Genocs.Logging/Options/ConsoleSettings.cs b/src/Genocs.Logging/Configurations/ConsoleSettings.cs similarity index 85% rename from src/Genocs.Logging/Options/ConsoleSettings.cs rename to src/Genocs.Logging/Configurations/ConsoleSettings.cs index a647aa26..34953b04 100644 --- a/src/Genocs.Logging/Options/ConsoleSettings.cs +++ b/src/Genocs.Logging/Configurations/ConsoleSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Console Settings. diff --git a/src/Genocs.Logging/Options/ElkSettings.cs b/src/Genocs.Logging/Configurations/ElkSettings.cs similarity index 93% rename from src/Genocs.Logging/Options/ElkSettings.cs rename to src/Genocs.Logging/Configurations/ElkSettings.cs index b67d082d..992a13bc 100644 --- a/src/Genocs.Logging/Options/ElkSettings.cs +++ b/src/Genocs.Logging/Configurations/ElkSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Elasticsearch Settings. diff --git a/src/Genocs.Logging/Options/LocalFileSettings.cs b/src/Genocs.Logging/Configurations/LocalFileSettings.cs similarity index 92% rename from src/Genocs.Logging/Options/LocalFileSettings.cs rename to src/Genocs.Logging/Configurations/LocalFileSettings.cs index bc5d0993..05bf923c 100644 --- a/src/Genocs.Logging/Options/LocalFileSettings.cs +++ b/src/Genocs.Logging/Configurations/LocalFileSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// File settings for local file logging. diff --git a/src/Genocs.Logging/Options/LoggerSettings.cs b/src/Genocs.Logging/Configurations/LoggerSettings.cs similarity index 96% rename from src/Genocs.Logging/Options/LoggerSettings.cs rename to src/Genocs.Logging/Configurations/LoggerSettings.cs index a604ae66..3348aa22 100644 --- a/src/Genocs.Logging/Options/LoggerSettings.cs +++ b/src/Genocs.Logging/Configurations/LoggerSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// diff --git a/src/Genocs.Logging/Options/LokiSettings.cs b/src/Genocs.Logging/Configurations/LokiSettings.cs similarity index 97% rename from src/Genocs.Logging/Options/LokiSettings.cs rename to src/Genocs.Logging/Configurations/LokiSettings.cs index 9c19d209..0b189abb 100644 --- a/src/Genocs.Logging/Options/LokiSettings.cs +++ b/src/Genocs.Logging/Configurations/LokiSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// Relevant options for the Serilog Loki sink. diff --git a/src/Genocs.Logging/Options/MongoSettings.cs b/src/Genocs.Logging/Configurations/MongoSettings.cs similarity index 85% rename from src/Genocs.Logging/Options/MongoSettings.cs rename to src/Genocs.Logging/Configurations/MongoSettings.cs index a8e2e47b..6f5beb87 100644 --- a/src/Genocs.Logging/Options/MongoSettings.cs +++ b/src/Genocs.Logging/Configurations/MongoSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; /// /// MongoDb logging settings. diff --git a/src/Genocs.Logging/Options/SeqSettings.cs b/src/Genocs.Logging/Configurations/SeqSettings.cs similarity index 77% rename from src/Genocs.Logging/Options/SeqSettings.cs rename to src/Genocs.Logging/Configurations/SeqSettings.cs index 26432556..57bc042c 100644 --- a/src/Genocs.Logging/Options/SeqSettings.cs +++ b/src/Genocs.Logging/Configurations/SeqSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Logging.Options; +namespace Genocs.Logging.Configurations; public class SeqSettings { diff --git a/src/Genocs.Logging/Extensions.cs b/src/Genocs.Logging/Extensions.cs index 76fe5817..0ba7ec8c 100644 --- a/src/Genocs.Logging/Extensions.cs +++ b/src/Genocs.Logging/Extensions.cs @@ -1,6 +1,6 @@ -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; -using Genocs.Logging.Options; +using Genocs.Logging.Configurations; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; @@ -23,8 +23,8 @@ public static class Extensions public static IHostBuilder UseLogging( this IHostBuilder hostBuilder, Action? configure = null, - string? loggerSectionName = null, - string? appSectionName = null) + string? loggerSectionName = LoggerSettings.Position, + string? appSectionName = AppSettings.Position) => hostBuilder .ConfigureServices(services => services.AddSingleton()) .UseSerilog((context, loggerConfiguration) => @@ -167,10 +167,12 @@ private static void Configure(LoggerConfiguration loggerConfiguration, LoggerSet // azure application insights if (azureOptions.Enabled) { - loggerConfiguration.WriteTo.ApplicationInsights(new TelemetryConfiguration - { - ConnectionString = azureOptions.ConnectionString, - }, TelemetryConverter.Traces); + loggerConfiguration.WriteTo.ApplicationInsights( + new TelemetryConfiguration + { + ConnectionString = azureOptions.ConnectionString, + }, + TelemetryConverter.Traces); } } @@ -203,7 +205,7 @@ private static async Task LevelSwitch(HttpContext context) return; } - var level = context.Request.Query["level"].ToString(); + string level = context.Request.Query["level"].ToString(); if (string.IsNullOrEmpty(level)) { diff --git a/src/Genocs.Logging/Genocs.Logging.csproj b/src/Genocs.Logging/Genocs.Logging.csproj index 7e4d7cea..0cb22d85 100644 --- a/src/Genocs.Logging/Genocs.Logging.csproj +++ b/src/Genocs.Logging/Genocs.Logging.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Logging/README.md b/src/Genocs.Logging/README_NUGET.md similarity index 100% rename from src/Genocs.Logging/README.md rename to src/Genocs.Logging/README_NUGET.md diff --git a/src/Genocs.Logging/Startup.cs b/src/Genocs.Logging/Startup.cs new file mode 100644 index 00000000..d12034a6 --- /dev/null +++ b/src/Genocs.Logging/Startup.cs @@ -0,0 +1,29 @@ +using Serilog.Events; +using Serilog; + +namespace Genocs.Logging; + +/// +/// This helper function ensures that the logger is initialized. +/// +public static class StaticLogger +{ + /// + /// This helper function ensures that the logger is initialized. + /// Call this function before using the logger. + /// Generally in the Program.cs file at the beginning of the application. + /// + public static void EnsureInitialized() + { + if (Log.Logger is not Serilog.Core.Logger) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Debug() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("MassTransit", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.Console() + .CreateLogger(); + } + } +} diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj b/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj index b35fe693..f3243e6a 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Genocs.MessageBrokers.Outbox.MongoDB.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs index 291ef5f6..779c376b 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs @@ -1,5 +1,5 @@ +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Messages; -using Genocs.MessageBrokers.Outbox.Options; using Genocs.Persistence.MongoDb.Repositories; using Genocs.Persistence.MongoDb.Repositories.Mentor; using Microsoft.Extensions.Logging; diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs index 05d67b59..ff0560f9 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs @@ -1,6 +1,6 @@ using Genocs.Common.Types; +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Messages; -using Genocs.MessageBrokers.Outbox.Options; using MongoDB.Driver; namespace Genocs.MessageBrokers.Outbox.MongoDB.Internals; diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/README.md b/src/Genocs.MessageBrokers.Outbox.MongoDB/README_NUGET.md similarity index 100% rename from src/Genocs.MessageBrokers.Outbox.MongoDB/README.md rename to src/Genocs.MessageBrokers.Outbox.MongoDB/README_NUGET.md diff --git a/src/Genocs.MessageBrokers.Outbox/Options/OutboxSettings.cs b/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxSettings.cs similarity index 86% rename from src/Genocs.MessageBrokers.Outbox/Options/OutboxSettings.cs rename to src/Genocs.MessageBrokers.Outbox/Configurations/OutboxSettings.cs index f26273a7..52af1f3e 100644 --- a/src/Genocs.MessageBrokers.Outbox/Options/OutboxSettings.cs +++ b/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.MessageBrokers.Outbox.Options; +namespace Genocs.MessageBrokers.Outbox.Configurations; public class OutboxSettings { diff --git a/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs b/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs index 18aeb4dc..b03c9cfa 100644 --- a/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs +++ b/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.MessageBrokers.Outbox.Configurators; diff --git a/src/Genocs.MessageBrokers.Outbox/Extensions.cs b/src/Genocs.MessageBrokers.Outbox/Extensions.cs index ce2d06c4..330fe6e9 100644 --- a/src/Genocs.MessageBrokers.Outbox/Extensions.cs +++ b/src/Genocs.MessageBrokers.Outbox/Extensions.cs @@ -1,6 +1,6 @@ using Genocs.Core.Builders; +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Configurators; -using Genocs.MessageBrokers.Outbox.Options; using Genocs.MessageBrokers.Outbox.Outbox; using Genocs.MessageBrokers.Outbox.Processors; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj b/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj index 67133bd3..7d8cff6c 100644 --- a/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj +++ b/src/Genocs.MessageBrokers.Outbox/Genocs.MessageBrokers.Outbox.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs b/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs index dfd18932..7ddbb1e9 100644 --- a/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs +++ b/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.MessageBrokers.Outbox; diff --git a/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs b/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs index 316b435f..eee56670 100644 --- a/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs +++ b/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs @@ -1,5 +1,5 @@ +using Genocs.MessageBrokers.Outbox.Configurations; using Genocs.MessageBrokers.Outbox.Messages; -using Genocs.MessageBrokers.Outbox.Options; using Microsoft.Extensions.Logging; using System.Collections.Concurrent; diff --git a/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs b/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs index 67f5b005..9e789cc8 100644 --- a/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs +++ b/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs @@ -1,4 +1,4 @@ -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; diff --git a/src/Genocs.MessageBrokers.Outbox/README.md b/src/Genocs.MessageBrokers.Outbox/README_NUGET.md similarity index 100% rename from src/Genocs.MessageBrokers.Outbox/README.md rename to src/Genocs.MessageBrokers.Outbox/README_NUGET.md diff --git a/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj b/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj index 66f4cceb..e911d229 100644 --- a/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj +++ b/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.MessageBrokers.RabbitMQ/README.md b/src/Genocs.MessageBrokers.RabbitMQ/README_NUGET.md similarity index 100% rename from src/Genocs.MessageBrokers.RabbitMQ/README.md rename to src/Genocs.MessageBrokers.RabbitMQ/README_NUGET.md diff --git a/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj b/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj index 08feee1d..49ee7be5 100644 --- a/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj +++ b/src/Genocs.MessageBrokers/Genocs.MessageBrokers.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.MessageBrokers/README.md b/src/Genocs.MessageBrokers/README_NUGET.md similarity index 100% rename from src/Genocs.MessageBrokers/README.md rename to src/Genocs.MessageBrokers/README_NUGET.md diff --git a/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs similarity index 53% rename from src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs rename to src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs index ffd23f2e..1114bfc1 100644 --- a/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs +++ b/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs @@ -1,54 +1,54 @@ -using Genocs.Metrics.AppMetrics.Options; +using Genocs.Metrics.AppMetrics.Configurations; namespace Genocs.Metrics.AppMetrics.Builders; -internal sealed class MetricsOptionsBuilder : IMetricsOptionsBuilder +internal sealed class MetricsSettingsBuilder : IMetricsSettingsBuilder { private readonly MetricsSettings _options = new(); - public IMetricsOptionsBuilder Enable(bool enabled) + public IMetricsSettingsBuilder Enable(bool enabled) { _options.Enabled = enabled; return this; } - public IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled) + public IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled) { _options.InfluxEnabled = influxEnabled; return this; } - public IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled) + public IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled) { _options.PrometheusEnabled = prometheusEnabled; return this; } - public IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter) + public IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter) { _options.PrometheusFormatter = prometheusFormatter; return this; } - public IMetricsOptionsBuilder WithInfluxUrl(string influxUrl) + public IMetricsSettingsBuilder WithInfluxUrl(string influxUrl) { _options.InfluxUrl = influxUrl; return this; } - public IMetricsOptionsBuilder WithDatabase(string database) + public IMetricsSettingsBuilder WithDatabase(string database) { _options.Database = database; return this; } - public IMetricsOptionsBuilder WithInterval(int interval) + public IMetricsSettingsBuilder WithInterval(int interval) { _options.Interval = interval; return this; } - public IMetricsOptionsBuilder WithTags(IDictionary tags) + public IMetricsSettingsBuilder WithTags(IDictionary tags) { _options.Tags = tags; return this; diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs new file mode 100644 index 00000000..e9964080 --- /dev/null +++ b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs @@ -0,0 +1,14 @@ +namespace Genocs.Metrics.AppMetrics.Configurations; + +public interface IMetricsSettingsBuilder +{ + IMetricsSettingsBuilder Enable(bool enabled); + IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled); + IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled); + IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter); + IMetricsSettingsBuilder WithInfluxUrl(string influxUrl); + IMetricsSettingsBuilder WithDatabase(string database); + IMetricsSettingsBuilder WithInterval(int interval); + IMetricsSettingsBuilder WithTags(IDictionary tags); + MetricsSettings Build(); +} \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Options/MetricsSettings.cs b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs similarity index 92% rename from src/Genocs.Metrics/AppMetrics/Options/MetricsSettings.cs rename to src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs index 19f0144c..b633b797 100644 --- a/src/Genocs.Metrics/AppMetrics/Options/MetricsSettings.cs +++ b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Metrics.AppMetrics.Options; +namespace Genocs.Metrics.AppMetrics.Configurations; /// /// The MetricsSettings class. @@ -8,7 +8,7 @@ public class MetricsSettings /// /// Default section name. /// - public const string Position = "Metrics"; + public const string Position = "metrics"; /// /// It defines whether the section is enabled or not. diff --git a/src/Genocs.Metrics/AppMetrics/Extensions.cs b/src/Genocs.Metrics/AppMetrics/Extensions.cs index 4829b458..61253b08 100644 --- a/src/Genocs.Metrics/AppMetrics/Extensions.cs +++ b/src/Genocs.Metrics/AppMetrics/Extensions.cs @@ -4,11 +4,11 @@ using App.Metrics.AspNetCore.Health.Endpoints; using App.Metrics.AspNetCore.Tracking; using App.Metrics.Formatters.Prometheus; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; using Genocs.Metrics.AppMetrics; using Genocs.Metrics.AppMetrics.Builders; -using Genocs.Metrics.AppMetrics.Options; +using Genocs.Metrics.AppMetrics.Configurations; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -49,7 +49,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - Func buildOptions, + Func buildOptions, string appSectionName = AppSectionName) { if (string.IsNullOrWhiteSpace(appSectionName)) @@ -57,7 +57,7 @@ public static IGenocsBuilder AddMetrics( appSectionName = AppSectionName; } - var metricsOptions = buildOptions(new MetricsOptionsBuilder()).Build(); + var metricsOptions = buildOptions(new MetricsSettingsBuilder()).Build(); var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); diff --git a/src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs deleted file mode 100644 index dff0200c..00000000 --- a/src/Genocs.Metrics/AppMetrics/IMetricsOptionsBuilder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Genocs.Metrics.AppMetrics.Options; - -namespace Genocs.Metrics.AppMetrics; - -public interface IMetricsOptionsBuilder -{ - IMetricsOptionsBuilder Enable(bool enabled); - IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled); - IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled); - IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter); - IMetricsOptionsBuilder WithInfluxUrl(string influxUrl); - IMetricsOptionsBuilder WithDatabase(string database); - IMetricsOptionsBuilder WithInterval(int interval); - IMetricsOptionsBuilder WithTags(IDictionary tags); - MetricsSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Metrics/Genocs.Metrics.csproj b/src/Genocs.Metrics/Genocs.Metrics.csproj index 9916ef03..665a067c 100644 --- a/src/Genocs.Metrics/Genocs.Metrics.csproj +++ b/src/Genocs.Metrics/Genocs.Metrics.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Metrics/README.md b/src/Genocs.Metrics/README_NUGET.md similarity index 100% rename from src/Genocs.Metrics/README.md rename to src/Genocs.Metrics/README_NUGET.md diff --git a/src/Genocs.Monitoring/Genocs.Monitoring.csproj b/src/Genocs.Monitoring/Genocs.Monitoring.csproj index 2a945cb1..2330c2f9 100644 --- a/src/Genocs.Monitoring/Genocs.Monitoring.csproj +++ b/src/Genocs.Monitoring/Genocs.Monitoring.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Monitoring/README.md b/src/Genocs.Monitoring/README_NUGET.md similarity index 100% rename from src/Genocs.Monitoring/README.md rename to src/Genocs.Monitoring/README_NUGET.md diff --git a/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs b/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs index c799988e..abced899 100644 --- a/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs +++ b/src/Genocs.Persistence.MongoDb.UnitTests/EncryptionUnitTest.cs @@ -1,9 +1,4 @@ -using Genocs.Persistence.MongoDb.Encryptions; -using Genocs.Persistence.MongoDb.Options; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Options; -using Moq; -using Xunit; namespace Genocs.Persistence.MongoDb.UnitTests; diff --git a/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs b/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs index 99e3a861..385114a5 100644 --- a/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs +++ b/src/Genocs.Persistence.MongoDb/Builders/MongoDbOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; using Genocs.Persistence.MongoDb.Repositories; namespace Genocs.Persistence.MongoDb.Builders; diff --git a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs new file mode 100644 index 00000000..3124e3a3 --- /dev/null +++ b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs @@ -0,0 +1,69 @@ +namespace Genocs.Persistence.MongoDb.Configurations; + +/// +/// MongoDb encryption database Settings. +/// +public class MongoDbEncryptionSettings +{ + + /// + /// Default Section name + /// + public const string Position = "MongoDbEncryption"; + + /// + /// The Database connection string + /// + public string ConnectionString { get; set; } = default!; + + /// + /// The shared library used to encrypt + /// + public string LibPath { get; set; } = default!; + + /// + /// Azure Tenant Id + /// + public string TenantId { get; set; } = default!; + + /// + /// Azure Client Id + /// + public string ClientId { get; set; } = default!; + + /// + /// Azure Client Secret + /// + public string ClientSecret { get; set; } = default!; + + /// + /// Azure Client Secret + /// + public string KeyName { get; set; } = default!; + + /// + /// Azure Client Secret + /// + public string KeyVersion { get; set; } = default!; + + /// + /// Azure Client Secret + /// + public string KeyVaultEndpoint { get; set; } = default!; + + /// + /// Check if the MongoDbSettings object contains valid data + /// + /// MongoDbSettings object + /// return true if valid otherwise false + public static bool IsValid(MongoDbEncryptionSettings settings) + { + if (settings is null) return false; + + if (string.IsNullOrWhiteSpace(settings.ConnectionString)) return false; + if (string.IsNullOrWhiteSpace(settings.LibPath)) return false; + + return true; + + } +} diff --git a/src/Genocs.Persistence.MongoDb/Options/MongoDbSettings.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbSettings.cs similarity index 96% rename from src/Genocs.Persistence.MongoDb/Options/MongoDbSettings.cs rename to src/Genocs.Persistence.MongoDb/Configurations/MongoDbSettings.cs index 6dc46179..4d7be7be 100644 --- a/src/Genocs.Persistence.MongoDb/Options/MongoDbSettings.cs +++ b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbSettings.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace Genocs.Persistence.MongoDb.Options; +namespace Genocs.Persistence.MongoDb.Configurations; /// /// MongoDb database Settings. diff --git a/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs b/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs index ed2200f7..ff2f2be8 100644 --- a/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs +++ b/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs @@ -1,4 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; @@ -46,10 +46,12 @@ DataKeyOptions GetDataKeyOptions(List altNames) }); return dataKeyOptions; } + // end-datakeyopts // start-key-vault var keyVaultNamespace = CollectionNamespace.FromFullName("encryption.__keyVault"); + // end-key-vault // start-create-index @@ -65,13 +67,14 @@ DataKeyOptions GetDataKeyOptions(List altNames) var indexKeysDocument = builder.Ascending("keyAltNames"); var indexModel = new CreateIndexModel(indexKeysDocument, indexOptions); var keyVaultDatabase = keyVaultClient.GetDatabase(keyVaultNamespace.DatabaseNamespace.DatabaseName); + // Drop the Key Vault Collection in case you created this collection // in a previous run of this application. keyVaultDatabase.DropCollection(keyVaultNamespace.CollectionName); var keyVaultCollection = keyVaultDatabase.GetCollection(keyVaultNamespace.CollectionName); keyVaultCollection.Indexes.CreateOne(indexModel); - // end-create-index + // end-create-index // start-create-dek var clientEncryptionOptions = new ClientEncryptionOptions( @@ -96,12 +99,12 @@ BsonBinaryData CreateKeyGetID(DataKeyOptions options) var dataKeyId2 = CreateKeyGetID(dataKeyOptions2); var dataKeyId3 = CreateKeyGetID(dataKeyOptions3); var dataKeyId4 = CreateKeyGetID(dataKeyOptions4); + // end-create-dek // start-create-enc-collection var encryptedCollectionNamespace = CollectionNamespace.FromFullName("medicalRecords.patients"); - var encryptedFieldsMap = new Dictionary { { @@ -112,9 +115,9 @@ BsonBinaryData CreateKeyGetID(DataKeyOptions options) { new BsonDocument { - {"keyId", dataKeyId1}, - {"path", new BsonString("patientId")}, - {"bsonType", new BsonString("int")}, + { "keyId", dataKeyId1}, + { "path", new BsonString("patientId")}, + { "bsonType", new BsonString("int")}, { "queries", new BsonDocument { @@ -124,27 +127,27 @@ BsonBinaryData CreateKeyGetID(DataKeyOptions options) }, new BsonDocument { - {"keyId", dataKeyId2}, - {"path", new BsonString("medications")}, - {"bsonType", new BsonString("array")}, + { "keyId", dataKeyId2}, + { "path", new BsonString("medications")}, + { "bsonType", new BsonString("array")}, }, new BsonDocument { - {"keyId", dataKeyId3}, - {"path", new BsonString("patientRecord.ssn")}, - {"bsonType", new BsonString("string")}, + { "keyId", dataKeyId3}, + { "path", new BsonString("patientRecord.ssn")}, + { "bsonType", new BsonString("string")}, { "queries", new BsonDocument { - {"queryType", new BsonString("equality")} + { "queryType", new BsonString("equality")} } } }, new BsonDocument { - {"keyId", dataKeyId4}, - {"path", new BsonString("patientRecord.billing")}, - {"bsonType", new BsonString("object")}, + { "keyId", dataKeyId4}, + { "path", new BsonString("patientRecord.billing")}, + { "bsonType", new BsonString("object")}, }, } } @@ -154,8 +157,8 @@ BsonBinaryData CreateKeyGetID(DataKeyOptions options) var extraOptions = new Dictionary() { - {"cryptSharedLibPath", settings.LibPath}, - }; + { "cryptSharedLibPath", settings.LibPath }, + }; var autoEncryptionOptions = new AutoEncryptionOptions( keyVaultNamespace, diff --git a/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs b/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs index d418b605..693a8339 100644 --- a/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs +++ b/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs @@ -1,9 +1,9 @@ using Genocs.Common.Types; using Genocs.Core.Builders; using Genocs.Persistence.MongoDb.Builders; +using Genocs.Persistence.MongoDb.Configurations; using Genocs.Persistence.MongoDb.Factories; using Genocs.Persistence.MongoDb.Initializers; -using Genocs.Persistence.MongoDb.Options; using Genocs.Persistence.MongoDb.Repositories; using Genocs.Persistence.MongoDb.Repositories.Clean; using Genocs.Persistence.MongoDb.Repositories.Mentor; diff --git a/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj b/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj index eb912ede..08140949 100644 --- a/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj +++ b/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj @@ -20,7 +20,7 @@ icon.png git mongodb aggregate architecture boilerplate repository-patterns domain-driven-design dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Moved to NET8.0 True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Persistence.MongoDb/IMongoDatabaseProvider.cs b/src/Genocs.Persistence.MongoDb/IMongoDatabaseProvider.cs index d70620a1..5781822e 100644 --- a/src/Genocs.Persistence.MongoDb/IMongoDatabaseProvider.cs +++ b/src/Genocs.Persistence.MongoDb/IMongoDatabaseProvider.cs @@ -8,11 +8,10 @@ namespace Genocs.Persistence.MongoDb; public interface IMongoDatabaseProvider { /// - /// Gets the MongoClient + /// Gets the MongoClient. /// IMongoClient MongoClient { get; } - /// /// Gets the . /// diff --git a/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs b/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs index 11b4c6ad..f917c935 100644 --- a/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs +++ b/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs @@ -1,4 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; using Genocs.Persistence.MongoDb.Repositories; using MongoDB.Driver; diff --git a/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs b/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs index 412c8475..df5ae963 100644 --- a/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs +++ b/src/Genocs.Persistence.MongoDb/MongoDatabaseProvider.cs @@ -1,5 +1,5 @@ -using Genocs.Persistence.MongoDb.Encryptions; -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; +using Genocs.Persistence.MongoDb.Encryptions; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Driver.Core.Extensions.DiagnosticSources; diff --git a/src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs b/src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs deleted file mode 100644 index 35e03b2c..00000000 --- a/src/Genocs.Persistence.MongoDb/Options/MongoDbEncryptionSettings.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace Genocs.Persistence.MongoDb.Options -{ - /// - /// MongoDb encryption database Settings - /// - public class MongoDbEncryptionSettings - { - - /// - /// Default Section name - /// - public const string Position = "MongoDbEncryption"; - - /// - /// The Database connection string - /// - public string ConnectionString { get; set; } = default!; - - /// - /// The shared library used to encrypt - /// - public string LibPath { get; set; } = default!; - - /// - /// Azure Tenant Id - /// - public string TenantId { get; set; } = default!; - - /// - /// Azure Client Id - /// - public string ClientId { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string ClientSecret { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyName { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyVersion { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyVaultEndpoint { get; set; } = default!; - - /// - /// Check if the MongoDbSettings object contains valid data - /// - /// MongoDbSettings object - /// return true if valid otherwise false - public static bool IsValid(MongoDbEncryptionSettings settings) - { - if (settings is null) return false; - - if (string.IsNullOrWhiteSpace(settings.ConnectionString)) return false; - if (string.IsNullOrWhiteSpace(settings.LibPath)) return false; - - return true; - - } - } -} diff --git a/src/Genocs.Persistence.MongoDb/README.md b/src/Genocs.Persistence.MongoDb/README_NUGET.md similarity index 100% rename from src/Genocs.Persistence.MongoDb/README.md rename to src/Genocs.Persistence.MongoDb/README_NUGET.md diff --git a/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs b/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs index 36e91713..bcd5ce69 100644 --- a/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs +++ b/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.Persistence.MongoDb.Options; +using Genocs.Persistence.MongoDb.Configurations; namespace Genocs.Persistence.MongoDb.Repositories; diff --git a/src/Genocs.Persistence.Redis/Builders/RedisOptionsBuilder.cs b/src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs similarity index 55% rename from src/Genocs.Persistence.Redis/Builders/RedisOptionsBuilder.cs rename to src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs index bd0b4846..e2d0cbb1 100644 --- a/src/Genocs.Persistence.Redis/Builders/RedisOptionsBuilder.cs +++ b/src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs @@ -1,18 +1,18 @@ -using Genocs.Persistence.Redis.Options; +using Genocs.Persistence.Redis.Configurations; namespace Genocs.Persistence.Redis.Builders; -internal sealed class RedisOptionsBuilder : IRedisOptionsBuilder +internal sealed class RedisSettingsBuilder : IRedisSettingsBuilder { private readonly RedisSettings _options = new(); - public IRedisOptionsBuilder WithConnectionString(string connectionString) + public IRedisSettingsBuilder WithConnectionString(string connectionString) { _options.ConnectionString = connectionString; return this; } - public IRedisOptionsBuilder WithInstance(string instance) + public IRedisSettingsBuilder WithInstance(string instance) { _options.Instance = instance; return this; diff --git a/src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs b/src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs new file mode 100644 index 00000000..145fac47 --- /dev/null +++ b/src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs @@ -0,0 +1,8 @@ +namespace Genocs.Persistence.Redis.Configurations; + +public interface IRedisSettingsBuilder +{ + IRedisSettingsBuilder WithConnectionString(string connectionString); + IRedisSettingsBuilder WithInstance(string instance); + RedisSettings Build(); +} \ No newline at end of file diff --git a/src/Genocs.Persistence.Redis/Options/RedisSettings.cs b/src/Genocs.Persistence.Redis/Configurations/RedisSettings.cs similarity index 91% rename from src/Genocs.Persistence.Redis/Options/RedisSettings.cs rename to src/Genocs.Persistence.Redis/Configurations/RedisSettings.cs index 87d527ef..bd1176c0 100644 --- a/src/Genocs.Persistence.Redis/Options/RedisSettings.cs +++ b/src/Genocs.Persistence.Redis/Configurations/RedisSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Persistence.Redis.Options; +namespace Genocs.Persistence.Redis.Configurations; /// /// The Redis Options diff --git a/src/Genocs.Persistence.Redis/Extensions.cs b/src/Genocs.Persistence.Redis/Extensions.cs index e75eb044..87ffed86 100644 --- a/src/Genocs.Persistence.Redis/Extensions.cs +++ b/src/Genocs.Persistence.Redis/Extensions.cs @@ -1,14 +1,13 @@ using Genocs.Core.Builders; using Genocs.Persistence.Redis.Builders; -using Genocs.Persistence.Redis.Options; +using Genocs.Persistence.Redis.Configurations; using Microsoft.Extensions.DependencyInjection; using StackExchange.Redis; namespace Genocs.Persistence.Redis; - /// -/// The redis extensions +/// The redis extensions. /// public static class Extensions { @@ -37,10 +36,11 @@ public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, string sectio /// The Genocs builder /// /// - public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, - Func buildOptions) + public static IGenocsBuilder AddRedis( + this IGenocsBuilder builder, + Func buildOptions) { - var options = buildOptions(new RedisOptionsBuilder()).Build(); + var options = buildOptions(new RedisSettingsBuilder()).Build(); return builder.AddRedis(options); } diff --git a/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj b/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj index 5c0474e4..afc1dc66 100644 --- a/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj +++ b/src/Genocs.Persistence.Redis/Genocs.Persistence.Redis.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Persistence.Redis/IRedisOptionsBuilder.cs b/src/Genocs.Persistence.Redis/IRedisOptionsBuilder.cs deleted file mode 100644 index dd692c01..00000000 --- a/src/Genocs.Persistence.Redis/IRedisOptionsBuilder.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Genocs.Persistence.Redis.Options; - -namespace Genocs.Persistence.Redis; - -public interface IRedisOptionsBuilder -{ - IRedisOptionsBuilder WithConnectionString(string connectionString); - IRedisOptionsBuilder WithInstance(string instance); - RedisSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Persistence.Redis/README.md b/src/Genocs.Persistence.Redis/README_NUGET.md similarity index 100% rename from src/Genocs.Persistence.Redis/README.md rename to src/Genocs.Persistence.Redis/README_NUGET.md diff --git a/src/Genocs.QueryBuilder.UnitTests/DynamicQuery/TreeTraverseUnitTests.cs b/src/Genocs.QueryBuilder.UnitTests/DynamicQuery/TreeTraverseUnitTests.cs index b43c6ed5..d03016b0 100644 --- a/src/Genocs.QueryBuilder.UnitTests/DynamicQuery/TreeTraverseUnitTests.cs +++ b/src/Genocs.QueryBuilder.UnitTests/DynamicQuery/TreeTraverseUnitTests.cs @@ -53,10 +53,8 @@ private async Task BuildValidTreeLevel1() c01.ChildNodes = childrenLevel1; c02.ChildNodes = childrenLevel2; - List childrenLevel0 = new List { c01, c02 }; - TreeNode root = new TreeNode() { Name = "Root", Valid = true, ChildNodes = childrenLevel0 }; return await Task.Run(() => root); @@ -86,10 +84,8 @@ private async Task BuildInvalidTreeLevel1() c01.ChildNodes = childrenLevel1; c02.ChildNodes = childrenLevel2; - List childrenLevel0 = new List { c01, c02 }; - TreeNode root = new TreeNode() { Name = "Root", Valid = true, ChildNodes = childrenLevel0 }; return await Task.Run(() => root); @@ -156,7 +152,6 @@ private async Task BuildInvalidTreeLevel3() List childrenLevel4 = new List { c17, c18 }; List childrenLevel5 = new List { c19, c20 }; - c01.ChildNodes = childrenLevel1; c02.ChildNodes = childrenLevel2; @@ -167,7 +162,6 @@ private async Task BuildInvalidTreeLevel3() List childrenLevel0 = new List { c01, c02 }; - TreeNode root = new TreeNode() { Name = "Root", Valid = true, ChildNodes = childrenLevel0 }; return await Task.Run(() => root); diff --git a/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj b/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj index e4064be1..c66ba978 100644 --- a/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj +++ b/src/Genocs.QueryBuilder/Genocs.QueryBuilder.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.QueryBuilder/README.md b/src/Genocs.QueryBuilder/README_NUGET.md similarity index 100% rename from src/Genocs.QueryBuilder/README.md rename to src/Genocs.QueryBuilder/README_NUGET.md diff --git a/src/Genocs.Secrets.AzureKeyVault/Options/AzureKeyVaultSettings.cs b/src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultSettings.cs similarity index 90% rename from src/Genocs.Secrets.AzureKeyVault/Options/AzureKeyVaultSettings.cs rename to src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultSettings.cs index a5de48ac..b6ae8649 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Options/AzureKeyVaultSettings.cs +++ b/src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Secrets.AzureKeyVault.Options; +namespace Genocs.Secrets.AzureKeyVault.Configurations; /// /// The vault Setting definition. diff --git a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs index 5d5f3e36..fccbe0b5 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs +++ b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs @@ -1,6 +1,6 @@ using Azure.Identity; using Genocs.Core.Builders; -using Genocs.Secrets.AzureKeyVault.Options; +using Genocs.Secrets.AzureKeyVault.Configurations; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -26,6 +26,11 @@ public static IHostBuilder UseAzureKeyVault( => builder.ConfigureAppConfiguration((ctx, cfg) => { // TODO Test + if (string.IsNullOrWhiteSpace(sectionName)) + { + sectionName = AzureKeyVaultSettings.Position; + } + var settings = ctx.Configuration.GetOptions(sectionName); if (!settings.Enabled) { diff --git a/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj b/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj index 0fcc66fa..64d97c8d 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj +++ b/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Secrets.AzureKeyVault/README.md b/src/Genocs.Secrets.AzureKeyVault/README_NUGET.md similarity index 100% rename from src/Genocs.Secrets.AzureKeyVault/README.md rename to src/Genocs.Secrets.AzureKeyVault/README_NUGET.md diff --git a/src/Genocs.Secrets.Vault/Options/VaultSettings.cs b/src/Genocs.Secrets.Vault/Configurations/VaultSettings.cs similarity index 97% rename from src/Genocs.Secrets.Vault/Options/VaultSettings.cs rename to src/Genocs.Secrets.Vault/Configurations/VaultSettings.cs index 9d0bf271..993f64e8 100644 --- a/src/Genocs.Secrets.Vault/Options/VaultSettings.cs +++ b/src/Genocs.Secrets.Vault/Configurations/VaultSettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.Secrets.Vault.Options; +namespace Genocs.Secrets.Vault.Configurations; /// /// The vault Setting definition. diff --git a/src/Genocs.Secrets.Vault/Extensions.cs b/src/Genocs.Secrets.Vault/Extensions.cs index 914de108..b3bcb999 100644 --- a/src/Genocs.Secrets.Vault/Extensions.cs +++ b/src/Genocs.Secrets.Vault/Extensions.cs @@ -1,6 +1,6 @@ using Genocs.Core.Builders; +using Genocs.Secrets.Vault.Configurations; using Genocs.Secrets.Vault.Internals; -using Genocs.Secrets.Vault.Options; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Memory; diff --git a/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj b/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj index db18b217..82d4c858 100644 --- a/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj +++ b/src/Genocs.Secrets.Vault/Genocs.Secrets.Vault.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs b/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs index ef83211d..94b1d643 100644 --- a/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs +++ b/src/Genocs.Secrets.Vault/Internals/CertificatesIssuer.cs @@ -1,7 +1,7 @@ +using Genocs.Secrets.Vault.Configurations; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; -using Genocs.Secrets.Vault.Options; using VaultSharp; using VaultSharp.V1.SecretsEngines; using VaultSharp.V1.SecretsEngines.PKI; diff --git a/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs b/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs index a6d268f1..49016424 100644 --- a/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs +++ b/src/Genocs.Secrets.Vault/Internals/KeyValueSecrets.cs @@ -1,5 +1,5 @@ +using Genocs.Secrets.Vault.Configurations; using System.Text.Json; -using Genocs.Secrets.Vault.Options; using VaultSharp; namespace Genocs.Secrets.Vault.Internals; diff --git a/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs b/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs index 94023818..4ba695fd 100644 --- a/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs +++ b/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs @@ -1,4 +1,4 @@ -using Genocs.Secrets.Vault.Options; +using Genocs.Secrets.Vault.Configurations; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using VaultSharp; @@ -11,7 +11,7 @@ internal sealed class VaultHostedService : BackgroundService private readonly ILeaseService _leaseService; private readonly ICertificatesIssuer _certificatesIssuer; private readonly ICertificatesService _certificatesService; - private readonly VaultSettings _options; + private readonly VaultSettings _settings; private readonly ILogger _logger; private readonly int _interval; @@ -20,28 +20,28 @@ public VaultHostedService( ILeaseService leaseService, ICertificatesIssuer certificatesIssuer, ICertificatesService certificatesService, - VaultSettings options, + VaultSettings settings, ILogger logger) { _client = client; _leaseService = leaseService; _certificatesIssuer = certificatesIssuer; _certificatesService = certificatesService; - _options = options; + _settings = settings; _logger = logger; - _interval = _options.RenewalsInterval <= 0 ? 10 : _options.RenewalsInterval; + _interval = _settings.RenewalsInterval <= 0 ? 10 : _settings.RenewalsInterval; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - if (!_options.Enabled) + if (!_settings.Enabled) { return; } - if ((_options.Pki is null || !_options.Pki.Enabled) && - (_options.Lease is null || _options.Lease.All(l => !l.Value.Enabled) || - !_options.Lease.Any(l => l.Value.AutoRenewal))) + if ((_settings.Pki is null || !_settings.Pki.Enabled) && + (_settings.Lease is null || _settings.Lease.All(l => !l.Value.Enabled) || + !_settings.Lease.Any(l => l.Value.AutoRenewal))) { return; } @@ -53,7 +53,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) var now = DateTime.UtcNow; var nextIterationAt = now.AddSeconds(2 * _interval); - if (_options.Pki is not null && _options.Pki.Enabled) + if (_settings.Pki is not null && _settings.Pki.Enabled) { foreach (var (role, cert) in _certificatesService.All) { @@ -86,7 +86,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) await Task.Delay(interval.Subtract(DateTime.UtcNow - now), stoppingToken); } - if (!_options.RevokeLeaseOnShutdown) + if (!_settings.RevokeLeaseOnShutdown) { return; } diff --git a/src/Genocs.Secrets.Vault/README.md b/src/Genocs.Secrets.Vault/README_NUGET.md similarity index 100% rename from src/Genocs.Secrets.Vault/README.md rename to src/Genocs.Secrets.Vault/README_NUGET.md diff --git a/src/Genocs.Security/Genocs.Security.csproj b/src/Genocs.Security/Genocs.Security.csproj index 3d20591b..9885aab3 100644 --- a/src/Genocs.Security/Genocs.Security.csproj +++ b/src/Genocs.Security/Genocs.Security.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Moved tAligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Security/README.md b/src/Genocs.Security/README_NUGET.md similarity index 100% rename from src/Genocs.Security/README.md rename to src/Genocs.Security/README_NUGET.md diff --git a/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs new file mode 100644 index 00000000..c7cd6781 --- /dev/null +++ b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs @@ -0,0 +1,15 @@ +using Microsoft.Azure.ServiceBus; + +namespace Genocs.ServiceBusAzure.Configurations; + +public class AzureServiceBusQueueSettings +{ + public const string Position = "AzureServiceBusQueue"; + public string? ConnectionString { get; set; } + public string? QueueName { get; set; } + public int MaxConcurrentCalls { get; set; } = 20; + public int PrefetchCount { get; set; } = 100; + public ReceiveMode ReceiveMode { get; set; } = ReceiveMode.PeekLock; + public RetryPolicy RetryPolicy { get; set; } = RetryPolicy.Default; + public bool AutoComplete { get; set; } = true; +} diff --git a/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs new file mode 100644 index 00000000..26a16a4b --- /dev/null +++ b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs @@ -0,0 +1,17 @@ +using Microsoft.Azure.ServiceBus; + +namespace Genocs.ServiceBusAzure.Configurations; + +public class AzureServiceBusTopicSettings +{ + public const string Position = "AzureServiceBusTopic"; + public string? ConnectionString { get; set; } + public string? TopicName { get; set; } + public string? SubscriptionName { get; set; } + public int MaxConcurrentCalls { get; set; } = 20; + public int PrefetchCount { get; set; } = 100; + public ReceiveMode ReceiveMode { get; set; } = ReceiveMode.PeekLock; + public RetryPolicy RetryPolicy { get; set; } = RetryPolicy.Default; + public bool AutoComplete { get; set; } = true; +} + diff --git a/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj b/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj index 9dea0d80..4229ecf7 100644 --- a/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj +++ b/src/Genocs.ServiceBusAzure/Genocs.ServiceBusAzure.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.ServiceBusAzure/Options/AzureServiceBusQueueSettings.cs b/src/Genocs.ServiceBusAzure/Options/AzureServiceBusQueueSettings.cs deleted file mode 100644 index 815ad5ce..00000000 --- a/src/Genocs.ServiceBusAzure/Options/AzureServiceBusQueueSettings.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.Azure.ServiceBus; - -namespace Genocs.ServiceBusAzure.Options -{ - public class AzureServiceBusQueueSettings - { - public const string Position = "AzureServiceBusQueue"; - public string ConnectionString { get; set; } - public string QueueName { get; set; } - public int MaxConcurrentCalls { get; set; } = 20; - public int PrefetchCount { get; set; } = 100; - public ReceiveMode ReceiveMode { get; set; } = ReceiveMode.PeekLock; - public RetryPolicy RetryPolicy { get; set; } = RetryPolicy.Default; - public bool AutoComplete { get; set; } = true; - } -} diff --git a/src/Genocs.ServiceBusAzure/Options/AzureServiceBusTopicSettings.cs b/src/Genocs.ServiceBusAzure/Options/AzureServiceBusTopicSettings.cs deleted file mode 100644 index f66d4283..00000000 --- a/src/Genocs.ServiceBusAzure/Options/AzureServiceBusTopicSettings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.Azure.ServiceBus; - -namespace Genocs.ServiceBusAzure.Options -{ - public class AzureServiceBusTopicSettings - { - public const string Position = "AzureServiceBusTopic"; - public string ConnectionString { get; set; } - public string TopicName { get; set; } - public string SubscriptionName { get; set; } - public int MaxConcurrentCalls { get; set; } = 20; - public int PrefetchCount { get; set; } = 100; - public ReceiveMode ReceiveMode { get; set; } = ReceiveMode.PeekLock; - public RetryPolicy RetryPolicy { get; set; } = RetryPolicy.Default; - public bool AutoComplete { get; set; } = true; - } -} - diff --git a/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs b/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs index 6d17d772..04a2c8d5 100644 --- a/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs +++ b/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs @@ -1,15 +1,12 @@ using Genocs.Core.CQRS.Commands; -using Genocs.ServiceBusAzure.Options; +using Genocs.ServiceBusAzure.Configurations; using Genocs.ServiceBusAzure.Queues.Interfaces; using Microsoft.Azure.ServiceBus; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Text; -using System.Threading.Tasks; namespace Genocs.ServiceBusAzure.Queues; @@ -70,6 +67,7 @@ public AzureServiceBusQueue(AzureServiceBusQueueSettings options, { throw new ArgumentNullException(nameof(options)); } + _options = options; _logger = logger ?? throw new ArgumentNullException(nameof(logger)); diff --git a/src/Genocs.ServiceBusAzure/Queues/Interfaces/IAzureServiceBusQueue.cs b/src/Genocs.ServiceBusAzure/Queues/Interfaces/IAzureServiceBusQueue.cs index f544d3fc..2748c189 100644 --- a/src/Genocs.ServiceBusAzure/Queues/Interfaces/IAzureServiceBusQueue.cs +++ b/src/Genocs.ServiceBusAzure/Queues/Interfaces/IAzureServiceBusQueue.cs @@ -2,13 +2,14 @@ namespace Genocs.ServiceBusAzure.Queues.Interfaces; - /// -/// Azure Service bus +/// Azure Service bus. /// public interface IAzureServiceBusQueue { Task SendAsync(ICommand command); Task ScheduleAsync(ICommand command, DateTimeOffset offset); - void Consume() where T : ICommand where TH : ICommandHandlerLegacy; + void Consume() + where T : ICommand + where TH : ICommandHandlerLegacy; } diff --git a/src/Genocs.ServiceBusAzure/README.md b/src/Genocs.ServiceBusAzure/README_NUGET.md similarity index 100% rename from src/Genocs.ServiceBusAzure/README.md rename to src/Genocs.ServiceBusAzure/README_NUGET.md diff --git a/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs b/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs index 46367ca4..1684af7e 100644 --- a/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs +++ b/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs @@ -1,5 +1,5 @@ using Genocs.Core.CQRS.Events; -using Genocs.ServiceBusAzure.Options; +using Genocs.ServiceBusAzure.Configurations; using Genocs.ServiceBusAzure.Topics.Interfaces; using Microsoft.Azure.ServiceBus; using Microsoft.Extensions.DependencyInjection; @@ -8,240 +8,239 @@ using Newtonsoft.Json; using System.Text; -namespace Genocs.ServiceBusAzure.Topics +namespace Genocs.ServiceBusAzure.Topics; + +public class AzureServiceBusTopic : IAzureServiceBusTopic { - public class AzureServiceBusTopic : IAzureServiceBusTopic + private readonly TopicClient _topicClient; + private readonly AzureServiceBusTopicSettings _options; + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + private const string EVENT_SUFFIX = "Event"; + private readonly Dictionary> _handlers; + private readonly SubscriptionClient _subscriptionClient; + private readonly List _eventTypes; + + public AzureServiceBusTopic( + IOptions options, + IServiceProvider serviceProvider, + ILogger logger) { - private readonly TopicClient _topicClient; - private readonly AzureServiceBusTopicSettings _options; - private readonly ILogger _logger; - private readonly IServiceProvider _serviceProvider; - private const string EVENT_SUFFIX = "Event"; - private readonly Dictionary> _handlers; - private readonly SubscriptionClient _subscriptionClient; - private readonly List _eventTypes; - - public AzureServiceBusTopic(IOptions options, - IServiceProvider serviceProvider, - ILogger logger) + if (options == null) { - if (options == null) - { - throw new ArgumentNullException(nameof(options)); - } - _options = options.Value; - - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - - ServiceBusConnectionStringBuilder serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(_options.ConnectionString); - serviceBusConnectionStringBuilder.EntityPath = _options.TopicName; - _topicClient = new TopicClient(serviceBusConnectionStringBuilder, _options.RetryPolicy); - _handlers = new Dictionary>(); - _eventTypes = new List(); - if (!string.IsNullOrEmpty(_options.SubscriptionName)) - { - _subscriptionClient = new SubscriptionClient(serviceBusConnectionStringBuilder, _options.SubscriptionName); - RegisterSubscriptionClientMessageHandler(); - } + throw new ArgumentNullException(nameof(options)); } + _options = options.Value; + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - public AzureServiceBusTopic(AzureServiceBusTopicSettings options, - IServiceProvider serviceProvider, - ILogger logger) + ServiceBusConnectionStringBuilder serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(_options.ConnectionString); + serviceBusConnectionStringBuilder.EntityPath = _options.TopicName; + _topicClient = new TopicClient(serviceBusConnectionStringBuilder, _options.RetryPolicy); + _handlers = new Dictionary>(); + _eventTypes = new List(); + if (!string.IsNullOrEmpty(_options.SubscriptionName)) { - if (options == null) - { - throw new ArgumentNullException(nameof(options)); - } - _options = options; + _subscriptionClient = new SubscriptionClient(serviceBusConnectionStringBuilder, _options.SubscriptionName); + RegisterSubscriptionClientMessageHandler(); + } + } + public AzureServiceBusTopic( + AzureServiceBusTopicSettings options, + IServiceProvider serviceProvider, + ILogger logger) + { + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + _options = options; - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - ServiceBusConnectionStringBuilder serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(_options.ConnectionString); - serviceBusConnectionStringBuilder.EntityPath = _options.TopicName; - _topicClient = new TopicClient(serviceBusConnectionStringBuilder, _options.RetryPolicy); - _handlers = new Dictionary>(); - _eventTypes = new List(); - if (!string.IsNullOrEmpty(_options.SubscriptionName)) - { - _subscriptionClient = new SubscriptionClient(serviceBusConnectionStringBuilder, _options.SubscriptionName); - RegisterSubscriptionClientMessageHandler(); - } + ServiceBusConnectionStringBuilder serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(_options.ConnectionString); + serviceBusConnectionStringBuilder.EntityPath = _options.TopicName; + _topicClient = new TopicClient(serviceBusConnectionStringBuilder, _options.RetryPolicy); + _handlers = new Dictionary>(); + _eventTypes = new List(); + if (!string.IsNullOrEmpty(_options.SubscriptionName)) + { + _subscriptionClient = new SubscriptionClient(serviceBusConnectionStringBuilder, _options.SubscriptionName); + RegisterSubscriptionClientMessageHandler(); } + } + + public async Task PublishAsync(IEvent @event) + { + string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); + string jsonMessage = JsonConvert.SerializeObject(@event); + byte[] body = Encoding.UTF8.GetBytes(jsonMessage); - public async Task PublishAsync(IEvent @event) + var message = new Message { - string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); - string jsonMessage = JsonConvert.SerializeObject(@event); - byte[] body = Encoding.UTF8.GetBytes(jsonMessage); + MessageId = Guid.NewGuid().ToString(), + Body = body, + Label = eventName, + }; - var message = new Message - { - MessageId = Guid.NewGuid().ToString(), - Body = body, - Label = eventName, - }; + await _topicClient.SendAsync(message); - await _topicClient.SendAsync(message); + } - } + public async Task PublishAsync(IEvent @event, Dictionary filters) + { + string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); + string jsonMessage = JsonConvert.SerializeObject(@event); + byte[] body = Encoding.UTF8.GetBytes(jsonMessage); - public async Task PublishAsync(IEvent @event, Dictionary filters) + var message = new Message { - string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); - string jsonMessage = JsonConvert.SerializeObject(@event); - byte[] body = Encoding.UTF8.GetBytes(jsonMessage); + MessageId = Guid.NewGuid().ToString(), + Body = body, + Label = eventName, + }; - var message = new Message - { - MessageId = Guid.NewGuid().ToString(), - Body = body, - Label = eventName, - }; + foreach (KeyValuePair filter in filters) + { + message.UserProperties.Add(filter); + } - foreach (KeyValuePair filter in filters) - { - message.UserProperties.Add(filter); - } + await _topicClient.SendAsync(message); + } - await _topicClient.SendAsync(message); - } + public async Task ScheduleAsync(IEvent @event, DateTimeOffset offset) + { + string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); + string jsonMessage = JsonConvert.SerializeObject(@event); + byte[] body = Encoding.UTF8.GetBytes(jsonMessage); - public async Task ScheduleAsync(IEvent @event, DateTimeOffset offset) + var message = new Message { - string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); - string jsonMessage = JsonConvert.SerializeObject(@event); - byte[] body = Encoding.UTF8.GetBytes(jsonMessage); + MessageId = Guid.NewGuid().ToString(), + Body = body, + Label = eventName, + }; + await _topicClient.ScheduleMessageAsync(message, offset); + } - var message = new Message - { - MessageId = Guid.NewGuid().ToString(), - Body = body, - Label = eventName, - }; - await _topicClient.ScheduleMessageAsync(message, offset); - } + public async Task ScheduleAsync(IEvent @event, DateTimeOffset offset, Dictionary filters) + { + string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); + string jsonMessage = JsonConvert.SerializeObject(@event); + byte[] body = Encoding.UTF8.GetBytes(jsonMessage); - public async Task ScheduleAsync(IEvent @event, DateTimeOffset offset, Dictionary filters) + var message = new Message { - string eventName = @event.GetType().Name.Replace(EVENT_SUFFIX, string.Empty); - string jsonMessage = JsonConvert.SerializeObject(@event); - byte[] body = Encoding.UTF8.GetBytes(jsonMessage); + MessageId = Guid.NewGuid().ToString(), + Body = body, + Label = eventName, + }; - var message = new Message - { - MessageId = Guid.NewGuid().ToString(), - Body = body, - Label = eventName, - }; + foreach (KeyValuePair filter in filters) + { + message.UserProperties.Add(filter); + } - foreach (KeyValuePair filter in filters) - { - message.UserProperties.Add(filter); - } + await _topicClient.ScheduleMessageAsync(message, offset); + } + + /// + /// Todo + /// + /// + /// + /// + public void Subscribe() + where T : IEvent + where TH : IEventHandlerLegacy + { + string eventName = typeof(T).Name.Replace(EVENT_SUFFIX, ""); + string key = typeof(T).Name; + if (!_handlers.ContainsKey(key)) + { + _handlers.Add(key, new List()); - await _topicClient.ScheduleMessageAsync(message, offset); + //_subscriptionClient.AddRuleAsync(new RuleDescription + //{ + // Filter = new CorrelationFilter { Label = eventName.ToLower() }, + // Name = eventName + //}).GetAwaiter().GetResult(); } - /// - /// Todo - /// - /// - /// - /// - public void Subscribe() - where T : IEvent - where TH : IEventHandlerLegacy - { - string eventName = typeof(T).Name.Replace(EVENT_SUFFIX, ""); - string key = typeof(T).Name; - if (!_handlers.ContainsKey(key)) - { - _handlers.Add(key, new List()); + Type handlerType = typeof(TH); - //_subscriptionClient.AddRuleAsync(new RuleDescription - //{ - // Filter = new CorrelationFilter { Label = eventName.ToLower() }, - // Name = eventName - //}).GetAwaiter().GetResult(); - } + if (_handlers[key].Any(s => s.HandlerType == handlerType)) + { + throw new ArgumentException( + $"Handler Type '{typeof(TH).Name}' already registered for '{key}'", nameof(handlerType)); + } - Type handlerType = typeof(TH); + if (!_eventTypes.Contains(typeof(T))) + { + _eventTypes.Add(typeof(T)); + } - if (_handlers[key].Any(s => s.HandlerType == handlerType)) - { - throw new ArgumentException( - $"Handler Type '{typeof(TH).Name}' already registered for '{key}'", nameof(handlerType)); - } + _handlers[key].Add(SubscriptionInfo.Typed(handlerType)); + } - if (!_eventTypes.Contains(typeof(T))) + private void RegisterSubscriptionClientMessageHandler() + { + _subscriptionClient.RegisterMessageHandler( + async (message, token) => { - _eventTypes.Add(typeof(T)); - } + string eventName = $"{message.Label}{EVENT_SUFFIX}"; + string messageData = Encoding.UTF8.GetString(message.Body); - _handlers[key].Add(SubscriptionInfo.Typed(handlerType)); - } - - private void RegisterSubscriptionClientMessageHandler() - { - _subscriptionClient.RegisterMessageHandler( - async (message, token) => + // Complete the message so that it is not received again. + if (await ProcessEvent(eventName, messageData)) { - string eventName = $"{message.Label}{EVENT_SUFFIX}"; - string messageData = Encoding.UTF8.GetString(message.Body); - - // Complete the message so that it is not received again. - if (await ProcessEvent(eventName, messageData)) - { - await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken); - } - }, - new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = _options.MaxConcurrentCalls, AutoComplete = false }); - } + await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken); + } + }, + new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = _options.MaxConcurrentCalls, AutoComplete = false }); + } - private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - var ex = exceptionReceivedEventArgs.Exception; - var context = exceptionReceivedEventArgs.ExceptionReceivedContext; + private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) + { + var ex = exceptionReceivedEventArgs.Exception; + var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - _logger.LogError(ex, "ERROR handling message: {ExceptionMessage} - Context: {@ExceptionContext}", ex.Message, context); + _logger.LogError(ex, "ERROR handling message: {ExceptionMessage} - Context: {@ExceptionContext}", ex.Message, context); - return Task.CompletedTask; - } + return Task.CompletedTask; + } - private async Task ProcessEvent(string eventName, string message) + private async Task ProcessEvent(string eventName, string message) + { + bool processed = false; + if (_handlers.ContainsKey(eventName)) { - bool processed = false; - if (_handlers.ContainsKey(eventName)) + using (var scope = _serviceProvider.CreateScope()) { - using (var scope = _serviceProvider.CreateScope()) - { - var subscriptions = _handlers[eventName]; + var subscriptions = _handlers[eventName]; - foreach (var subscription in subscriptions) + foreach (var subscription in subscriptions) + { + object handler = scope.ServiceProvider.GetRequiredService(subscription.HandlerType); + if (handler != null) { - object handler = scope.ServiceProvider.GetRequiredService(subscription.HandlerType); - if (handler != null) - { - var eventType = _eventTypes.SingleOrDefault(e => e.Name == eventName); - object command = JsonConvert.DeserializeObject(message, eventType); - var concreteType = typeof(IEventHandler<>).MakeGenericType(eventType); - await (Task)concreteType.GetMethod("HandleEvent").Invoke(handler, new object[] { command }); - } + var eventType = _eventTypes.SingleOrDefault(e => e.Name == eventName); + object command = JsonConvert.DeserializeObject(message, eventType); + var concreteType = typeof(IEventHandler<>).MakeGenericType(eventType); + await (Task)concreteType.GetMethod("HandleEvent").Invoke(handler, new object[] { command }); } } - - processed = true; - } - else - { - _logger.LogError($"Event '{eventName}' do not contains handlers. Check whether Subscribe is set"); } - return processed; + processed = true; + } + else + { + _logger.LogError($"Event '{eventName}' do not contains handlers. Check whether Subscribe is set"); } + + return processed; } } diff --git a/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj b/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj index a2b2c3ff..a9fe3afe 100644 --- a/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj +++ b/src/Genocs.Tracing.Jaeger.RabbitMQ/Genocs.Tracing.Jaeger.RabbitMQ.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Tracing.Jaeger.RabbitMQ/README.md b/src/Genocs.Tracing.Jaeger.RabbitMQ/README_NUGET.md similarity index 100% rename from src/Genocs.Tracing.Jaeger.RabbitMQ/README.md rename to src/Genocs.Tracing.Jaeger.RabbitMQ/README_NUGET.md diff --git a/src/Genocs.Tracing/Extensions.cs b/src/Genocs.Tracing/Extensions.cs index beb99dfb..96ae78e0 100644 --- a/src/Genocs.Tracing/Extensions.cs +++ b/src/Genocs.Tracing/Extensions.cs @@ -1,8 +1,8 @@ using Azure.Monitor.OpenTelemetry.Exporter; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; -using Genocs.Logging.Options; -using Genocs.Tracing.Jaeger.Options; +using Genocs.Logging.Configurations; +using Genocs.Tracing.Jaeger.Configurations; using Jaeger.Samplers; using Jaeger.Senders.Thrift; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Genocs.Tracing/Genocs.Tracing.csproj b/src/Genocs.Tracing/Genocs.Tracing.csproj index 10143fd3..66524a87 100644 --- a/src/Genocs.Tracing/Genocs.Tracing.csproj +++ b/src/Genocs.Tracing/Genocs.Tracing.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs b/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs index 831f4f07..1bb7c940 100644 --- a/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs +++ b/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.Tracing.Jaeger.Options; +using Genocs.Tracing.Jaeger.Configurations; namespace Genocs.Tracing.Jaeger.Builders; diff --git a/src/Genocs.Tracing/Jaeger/Options/IJaegerOptionsBuilder.cs b/src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs similarity index 91% rename from src/Genocs.Tracing/Jaeger/Options/IJaegerOptionsBuilder.cs rename to src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs index a1792dc6..5e9ab003 100644 --- a/src/Genocs.Tracing/Jaeger/Options/IJaegerOptionsBuilder.cs +++ b/src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs @@ -1,4 +1,4 @@ -namespace Genocs.Tracing.Jaeger.Options; +namespace Genocs.Tracing.Jaeger.Configurations; public interface IJaegerOptionsBuilder { diff --git a/src/Genocs.Tracing/Jaeger/Options/JaegerSettings.cs b/src/Genocs.Tracing/Jaeger/Configurations/JaegerSettings.cs similarity index 91% rename from src/Genocs.Tracing/Jaeger/Options/JaegerSettings.cs rename to src/Genocs.Tracing/Jaeger/Configurations/JaegerSettings.cs index 94ef5b0b..59528f09 100644 --- a/src/Genocs.Tracing/Jaeger/Options/JaegerSettings.cs +++ b/src/Genocs.Tracing/Jaeger/Configurations/JaegerSettings.cs @@ -1,12 +1,12 @@ -namespace Genocs.Tracing.Jaeger.Options; +namespace Genocs.Tracing.Jaeger.Configurations; /// -/// Jaeger Settings +/// Jaeger Settings. /// public class JaegerSettings { /// - /// Default section name + /// Default section name. /// public const string Position = "jaeger"; diff --git a/src/Genocs.Tracing/Jaeger/Extensions.cs b/src/Genocs.Tracing/Jaeger/Extensions.cs index 664f1c6a..59d3af36 100644 --- a/src/Genocs.Tracing/Jaeger/Extensions.cs +++ b/src/Genocs.Tracing/Jaeger/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.Tracing.Jaeger.Options; +using Genocs.Tracing.Jaeger.Configurations; using Genocs.Tracing.Jaeger.Tracers; using Jaeger; using Jaeger.Reporters; diff --git a/src/Genocs.Tracing/README.md b/src/Genocs.Tracing/README_NUGET.md similarity index 100% rename from src/Genocs.Tracing/README.md rename to src/Genocs.Tracing/README_NUGET.md diff --git a/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj b/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj index c985d721..e3b0e060 100644 --- a/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj +++ b/src/Genocs.WebApi.CQRS/Genocs.WebApi.CQRS.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.WebApi.CQRS/README.md b/src/Genocs.WebApi.CQRS/README_NUGET.md similarity index 100% rename from src/Genocs.WebApi.CQRS/README.md rename to src/Genocs.WebApi.CQRS/README_NUGET.md diff --git a/src/Genocs.WebApi.Security/CertificateMiddleware.cs b/src/Genocs.WebApi.Security/CertificateMiddleware.cs index ea5e18d8..3111aed3 100644 --- a/src/Genocs.WebApi.Security/CertificateMiddleware.cs +++ b/src/Genocs.WebApi.Security/CertificateMiddleware.cs @@ -1,3 +1,4 @@ +using Genocs.WebApi.Security.Configurations; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System.Security.Cryptography.X509Certificates; diff --git a/src/Genocs.WebApi.Security/Options/SecuritySettings.cs b/src/Genocs.WebApi.Security/Configurations/SecuritySettings.cs similarity index 94% rename from src/Genocs.WebApi.Security/Options/SecuritySettings.cs rename to src/Genocs.WebApi.Security/Configurations/SecuritySettings.cs index 08fb937a..bab3c180 100644 --- a/src/Genocs.WebApi.Security/Options/SecuritySettings.cs +++ b/src/Genocs.WebApi.Security/Configurations/SecuritySettings.cs @@ -1,4 +1,4 @@ -namespace Genocs.WebApi.Security; +namespace Genocs.WebApi.Security.Configurations; public class SecuritySettings { diff --git a/src/Genocs.WebApi.Security/Extensions.cs b/src/Genocs.WebApi.Security/Extensions.cs index a615b8c6..957802e4 100644 --- a/src/Genocs.WebApi.Security/Extensions.cs +++ b/src/Genocs.WebApi.Security/Extensions.cs @@ -1,4 +1,5 @@ using Genocs.Core.Builders; +using Genocs.WebApi.Security.Configurations; using Microsoft.AspNetCore.Authentication.Certificate; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj index 6b36bd67..f3664774 100644 --- a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj +++ b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.WebApi.Security/README.md b/src/Genocs.WebApi.Security/README_NUGET.md similarity index 100% rename from src/Genocs.WebApi.Security/README.md rename to src/Genocs.WebApi.Security/README_NUGET.md diff --git a/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs index 90e21984..7c34637a 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs @@ -1,8 +1,10 @@ +using Genocs.WebApi.Swagger.Docs.Configurations; + namespace Genocs.WebApi.Swagger.Docs.Builders; internal sealed class SwaggerOptionsBuilder : ISwaggerOptionsBuilder { - private readonly SwaggerOptions _options = new(); + private readonly SwaggerSettings _options = new(); public ISwaggerOptionsBuilder Enable(bool enabled) { @@ -52,5 +54,5 @@ public ISwaggerOptionsBuilder SerializeAsOpenApiV2(bool serializeAsOpenApiV2) return this; } - public SwaggerOptions Build() => _options; + public SwaggerSettings Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.WebApi.Swagger/Docs/ISwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs similarity index 86% rename from src/Genocs.WebApi.Swagger/Docs/ISwaggerOptionsBuilder.cs rename to src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs index 1527d2a4..e500e9e7 100644 --- a/src/Genocs.WebApi.Swagger/Docs/ISwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs @@ -1,4 +1,4 @@ -namespace Genocs.WebApi.Swagger.Docs; +namespace Genocs.WebApi.Swagger.Docs.Configurations; public interface ISwaggerOptionsBuilder { @@ -10,5 +10,5 @@ public interface ISwaggerOptionsBuilder ISwaggerOptionsBuilder WithRoutePrefix(string routePrefix); ISwaggerOptionsBuilder IncludeSecurity(bool includeSecurity); ISwaggerOptionsBuilder SerializeAsOpenApiV2(bool serializeAsOpenApiV2); - SwaggerOptions Build(); + SwaggerSettings Build(); } \ No newline at end of file diff --git a/src/Genocs.WebApi.Swagger/Docs/SwaggerOptions.cs b/src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerSettings.cs similarity index 80% rename from src/Genocs.WebApi.Swagger/Docs/SwaggerOptions.cs rename to src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerSettings.cs index 30e30d6c..4045b00b 100644 --- a/src/Genocs.WebApi.Swagger/Docs/SwaggerOptions.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerSettings.cs @@ -1,6 +1,6 @@ -namespace Genocs.WebApi.Swagger.Docs; +namespace Genocs.WebApi.Swagger.Docs.Configurations; -public class SwaggerOptions +public class SwaggerSettings { public bool Enabled { get; set; } public bool ReDocEnabled { get; set; } diff --git a/src/Genocs.WebApi.Swagger/Docs/Extensions.cs b/src/Genocs.WebApi.Swagger/Docs/Extensions.cs index b752a211..1f6d8ce7 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Extensions.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Extensions.cs @@ -1,5 +1,6 @@ using Genocs.Core.Builders; using Genocs.WebApi.Swagger.Docs.Builders; +using Genocs.WebApi.Swagger.Docs.Configurations; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; @@ -18,7 +19,7 @@ public static IGenocsBuilder AddSwaggerDocs(this IGenocsBuilder builder, string sectionName = SectionName; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); return builder.AddSwaggerDocs(options); } @@ -28,7 +29,7 @@ public static IGenocsBuilder AddSwaggerDocs(this IGenocsBuilder builder, Func(); + var options = builder.ApplicationServices.GetRequiredService(); if (!options.Enabled) { return builder; diff --git a/src/Genocs.WebApi.Swagger/Extensions.cs b/src/Genocs.WebApi.Swagger/Extensions.cs index 585d9ceb..1282e417 100644 --- a/src/Genocs.WebApi.Swagger/Extensions.cs +++ b/src/Genocs.WebApi.Swagger/Extensions.cs @@ -1,5 +1,6 @@ using Genocs.Core.Builders; using Genocs.WebApi.Swagger.Docs; +using Genocs.WebApi.Swagger.Docs.Configurations; using Genocs.WebApi.Swagger.Filters; using Microsoft.Extensions.DependencyInjection; @@ -22,7 +23,7 @@ public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, s public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, Func buildOptions) => builder.AddWebApiSwaggerDocs(b => b.AddSwaggerDocs(buildOptions)); - public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, SwaggerOptions options) + public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, SwaggerSettings options) => builder.AddWebApiSwaggerDocs(b => b.AddSwaggerDocs(options)); private static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, Action registerSwagger) diff --git a/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj b/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj index 1bf96a4b..53bbdc00 100644 --- a/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj +++ b/src/Genocs.WebApi.Swagger/Genocs.WebApi.Swagger.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.WebApi.Swagger/README.md b/src/Genocs.WebApi.Swagger/README_NUGET.md similarity index 100% rename from src/Genocs.WebApi.Swagger/README.md rename to src/Genocs.WebApi.Swagger/README_NUGET.md diff --git a/src/Genocs.WebApi/Configurations/WebApiOptions.cs b/src/Genocs.WebApi/Configurations/WebApiOptions.cs new file mode 100644 index 00000000..ce60fd06 --- /dev/null +++ b/src/Genocs.WebApi/Configurations/WebApiOptions.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Options; + +namespace Genocs.WebApi.Configurations; + +/// +/// The WebApiSettings definition. +/// Move to WebApiSettings.cs. +/// +public class WebApiOptions : IConfigureNamedOptions +{ + private readonly WebApiSettings _jwtSettings; + + public WebApiOptions(IOptions jwtSettings) + { + _jwtSettings = jwtSettings.Value; + } + + public void Configure(string? name, WebApiSettings options) + { + Configure(options); + } + + public void Configure(WebApiSettings options) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/Genocs.WebApi/Options/WebApiSettings.cs b/src/Genocs.WebApi/Configurations/WebApiSettings.cs similarity index 59% rename from src/Genocs.WebApi/Options/WebApiSettings.cs rename to src/Genocs.WebApi/Configurations/WebApiSettings.cs index f7429c94..805f7fe3 100644 --- a/src/Genocs.WebApi/Options/WebApiSettings.cs +++ b/src/Genocs.WebApi/Configurations/WebApiSettings.cs @@ -1,7 +1,7 @@ -namespace Genocs.WebApi.Options; +namespace Genocs.WebApi.Configurations; /// -/// The WebApiSettings definiiton. +/// The WebApiSettings definition. /// public class WebApiSettings { diff --git a/src/Genocs.WebApi/EndpointsBuilder.cs b/src/Genocs.WebApi/EndpointsBuilder.cs index 1173be2b..12bb2d69 100644 --- a/src/Genocs.WebApi/EndpointsBuilder.cs +++ b/src/Genocs.WebApi/EndpointsBuilder.cs @@ -108,7 +108,7 @@ public IEndpointsBuilder Put(string path, Func context return this; } - public IEndpointsBuilder Delete(string path, Func context = null, + public IEndpointsBuilder Delete(string path, Func? context = null, Action endpoint = null, bool auth = false, string? roles = null, params string[] policies) { @@ -120,8 +120,8 @@ public IEndpointsBuilder Delete(string path, Func context = n return this; } - public IEndpointsBuilder Delete(string path, Func context = null, - Action endpoint = null, bool auth = false, string roles = null, + public IEndpointsBuilder Delete(string path, Func? context = null, + Action endpoint = null, bool auth = false, string? roles = null, params string[] policies) where T : class { diff --git a/src/Genocs.WebApi/Extensions.cs b/src/Genocs.WebApi/Extensions.cs index cdbec57e..cc7f9c40 100644 --- a/src/Genocs.WebApi/Extensions.cs +++ b/src/Genocs.WebApi/Extensions.cs @@ -1,9 +1,9 @@ using Genocs.Common.Types; using Genocs.Core.Builders; using Genocs.WebApi; +using Genocs.WebApi.Configurations; using Genocs.WebApi.Exceptions; using Genocs.WebApi.Formatters; -using Genocs.WebApi.Options; using Genocs.WebApi.Requests; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; @@ -53,8 +53,11 @@ public static IApplicationBuilder UseEndpoints(this IApplicationBuilder app, Act } [Description("By default System JSON serializer is being used. If Newtonsoft JSON serializer is used then it sets Kestrel's and IIS ServerOptions AllowSynchronousIO = true")] - public static IGenocsBuilder AddWebApi(this IGenocsBuilder builder, Action configureMvc = null, - IJsonSerializer jsonSerializer = null, string sectionName = SectionName) + public static IGenocsBuilder AddWebApi( + this IGenocsBuilder builder, + Action? configureMvc = null, + IJsonSerializer? jsonSerializer = null, + string sectionName = SectionName) { if (string.IsNullOrWhiteSpace(sectionName)) { diff --git a/src/Genocs.WebApi/Genocs.WebApi.csproj b/src/Genocs.WebApi/Genocs.WebApi.csproj index ededa441..e820915c 100644 --- a/src/Genocs.WebApi/Genocs.WebApi.csproj +++ b/src/Genocs.WebApi/Genocs.WebApi.csproj @@ -20,7 +20,7 @@ icon.png git aggregate architecture boilerplate ddd ddd-architecture design-patterns docker domain-driven-design dotnet dotnetcore dotnet-core microservice microservices solid solid-principles - README.md + README_NUGET.md Aligned to the ecosystem True latest @@ -35,7 +35,7 @@ True \ - + True \ diff --git a/src/Genocs.WebApi/README.md b/src/Genocs.WebApi/README_NUGET.md similarity index 100% rename from src/Genocs.WebApi/README.md rename to src/Genocs.WebApi/README_NUGET.md diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs index c8299cf4..0b96c4a2 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Framework/CorrelationContextBuilder.cs @@ -8,8 +8,8 @@ public CorrelationContext Build( HttpContext context, string correlationId, string spanContext, - string name = null, - string resourceId = null) + string? name = null, + string? resourceId = null) => new CorrelationContext { CorrelationId = correlationId, diff --git a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs index a2dae299..3c29680f 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs @@ -1,7 +1,7 @@ using Genocs.APIGateway.Framework; using Genocs.APIGateway.Options; using Genocs.Auth; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; using Genocs.MessageBrokers.RabbitMQ; using Genocs.Metrics.Prometheus; diff --git a/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs b/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs index b9231895..a279c762 100644 --- a/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs +++ b/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs @@ -1,5 +1,5 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.MessageBrokers; using Microsoft.AspNetCore.Http; @@ -11,17 +11,24 @@ internal class CorrelationIdFactory : ICorrelationIdFactory private readonly IMessagePropertiesAccessor _messagePropertiesAccessor; private readonly IHttpContextAccessor _httpContextAccessor; - private readonly string _header; + private readonly string? _header; - public CorrelationIdFactory(IMessagePropertiesAccessor messagePropertiesAccessor, - IHttpContextAccessor httpContextAccessor, HttpClientSettings httpClientOptions) + public CorrelationIdFactory( + IMessagePropertiesAccessor messagePropertiesAccessor, + IHttpContextAccessor httpContextAccessor, + HttpClientSettings httpClientOptions) { - _messagePropertiesAccessor = messagePropertiesAccessor; - _httpContextAccessor = httpContextAccessor; + if (httpClientOptions is null) + { + throw new ArgumentNullException(nameof(httpClientOptions)); + } + + _messagePropertiesAccessor = messagePropertiesAccessor ?? throw new ArgumentNullException(nameof(messagePropertiesAccessor)); + _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); _header = httpClientOptions.CorrelationIdHeader; } - private static string CorrelationId + private static string? CorrelationId { get => Holder.Value?.Id; set @@ -41,7 +48,7 @@ private static string CorrelationId private class CorrelationIdHolder { - public string Id; + public string? Id; } public string Create() @@ -51,7 +58,7 @@ public string Create() return CorrelationId; } - var correlationId = _messagePropertiesAccessor.MessageProperties?.CorrelationId; + string? correlationId = _messagePropertiesAccessor.MessageProperties?.CorrelationId; if (!string.IsNullOrWhiteSpace(correlationId)) { CorrelationId = correlationId; diff --git a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs index 27216af2..a7eb7f09 100644 --- a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs +++ b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs @@ -2,7 +2,7 @@ using Genocs.Core.CQRS.Commands; using Genocs.MessageBrokers; using Genocs.MessageBrokers.Outbox; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.Identities.Application.Decorators; diff --git a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs index 1c3ef1dd..06e73609 100644 --- a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs +++ b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs @@ -2,7 +2,7 @@ using Genocs.Core.CQRS.Events; using Genocs.MessageBrokers; using Genocs.MessageBrokers.Outbox; -using Genocs.MessageBrokers.Outbox.Options; +using Genocs.MessageBrokers.Outbox.Configurations; namespace Genocs.Identities.Application.Decorators; diff --git a/src/apps/identity/Genocs.Identities.Application/Domain/Entities/User.cs b/src/apps/identity/Genocs.Identities.Application/Domain/Entities/User.cs index 46bbe004..9e69be07 100644 --- a/src/apps/identity/Genocs.Identities.Application/Domain/Entities/User.cs +++ b/src/apps/identity/Genocs.Identities.Application/Domain/Entities/User.cs @@ -12,8 +12,16 @@ public class User : AggregateRoot public IEnumerable? Permissions { get; private set; } public bool Locked { get; private set; } - public User(Guid id, string email, string name, string password, string role, DateTime createdAt, - IEnumerable? permissions = null, bool locked = false) : base(id) + public User( + Guid id, + string email, + string name, + string password, + string role, + DateTime createdAt, + IEnumerable? permissions = null, + bool locked = false) + : base(id) { if (string.IsNullOrWhiteSpace(email)) { @@ -45,7 +53,6 @@ public User(Guid id, string email, string name, string password, string role, Da Locked = locked; } - public bool Lock() { if (Locked) diff --git a/src/apps/identity/Genocs.Identities.Application/Extensions.cs b/src/apps/identity/Genocs.Identities.Application/Extensions.cs index 593c58a1..ae8f138d 100644 --- a/src/apps/identity/Genocs.Identities.Application/Extensions.cs +++ b/src/apps/identity/Genocs.Identities.Application/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Auth; -using Genocs.Common.Options; +using Genocs.Common.Configurations; using Genocs.Core.Builders; using Genocs.Core.CQRS.Commands; using Genocs.Core.CQRS.Events; diff --git a/src/apps/identity/Genocs.Identities.WebApi/Program.cs b/src/apps/identity/Genocs.Identities.WebApi/Program.cs index b19e5aa5..afd5507a 100644 --- a/src/apps/identity/Genocs.Identities.WebApi/Program.cs +++ b/src/apps/identity/Genocs.Identities.WebApi/Program.cs @@ -9,15 +9,8 @@ using Genocs.WebApi; using Genocs.WebApi.CQRS; using Serilog; -using Serilog.Events; -Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("MassTransit", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .CreateLogger(); +StaticLogger.EnsureInitialized(); var builder = WebApplication.CreateBuilder(args); diff --git a/src/apps/orders/Genocs.Orders.WebApi/Program.cs b/src/apps/orders/Genocs.Orders.WebApi/Program.cs index 45e41f78..9d14e35f 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Program.cs +++ b/src/apps/orders/Genocs.Orders.WebApi/Program.cs @@ -30,15 +30,8 @@ using Genocs.WebApi.Swagger; using Genocs.WebApi.Swagger.Docs; using Serilog; -using Serilog.Events; -Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("MassTransit", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .CreateLogger(); +StaticLogger.EnsureInitialized(); var builder = WebApplication.CreateBuilder(args); diff --git a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs index 1577cb9b..77f0cda4 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs +++ b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs @@ -1,9 +1,9 @@ using Genocs.HTTP; -using Genocs.HTTP.Options; +using Genocs.HTTP.Configurations; using Genocs.Orders.WebApi.DTO; using Genocs.Secrets.Vault; -using Genocs.Secrets.Vault.Options; -using Genocs.WebApi.Security; +using Genocs.Secrets.Vault.Configurations; +using Genocs.WebApi.Security.Configurations; namespace Genocs.Orders.WebApi.Services; diff --git a/src/apps/products/Genocs.Products.WebApi/Domain/Product.cs b/src/apps/products/Genocs.Products.WebApi/Domain/Product.cs index 65f3dbec..986e8262 100644 --- a/src/apps/products/Genocs.Products.WebApi/Domain/Product.cs +++ b/src/apps/products/Genocs.Products.WebApi/Domain/Product.cs @@ -2,9 +2,8 @@ namespace Genocs.Products.WebApi.Domain; - /// -/// The product definition +/// The product definition. /// public class Product : IIdentifiable { diff --git a/src/apps/products/Genocs.Products.WebApi/Program.cs b/src/apps/products/Genocs.Products.WebApi/Program.cs index 684c6646..f8f71171 100644 --- a/src/apps/products/Genocs.Products.WebApi/Program.cs +++ b/src/apps/products/Genocs.Products.WebApi/Program.cs @@ -28,15 +28,8 @@ using Genocs.WebApi.Swagger; using Genocs.WebApi.Swagger.Docs; using Serilog; -using Serilog.Events; -Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("MassTransit", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .CreateLogger(); +StaticLogger.EnsureInitialized(); var builder = WebApplication.CreateBuilder(args); diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Program.cs b/src/apps/signalr/Genocs.SignalR.WebApi/Program.cs index 6ddbe92a..627bca5a 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Program.cs +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Program.cs @@ -22,15 +22,8 @@ using Genocs.WebApi.Swagger; using Genocs.WebApi.Swagger.Docs; using Serilog; -using Serilog.Events; -Log.Logger = new LoggerConfiguration() - .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("MassTransit", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .CreateLogger(); +StaticLogger.EnsureInitialized(); var builder = WebApplication.CreateBuilder(args); From cc6c097d28854b584d3df34f9dc3ea6c4be78db9 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 14:51:21 +0200 Subject: [PATCH 09/17] Merge issues --- .../AccessTokenValidatorMiddleware.cs | 2 +- src/Genocs.Auth/Builders/JwtOptionsBuilder.cs | 4 +- .../IJwtOptionsBuilder.cs | 6 +- .../{JwtSettings.cs => JwtOptions.cs} | 6 +- src/Genocs.Auth/Extensions.cs | 150 +++++++++--------- src/Genocs.Auth/Handlers/JwtHandler.cs | 4 +- .../Services/InMemoryAccessTokenService.cs | 2 +- .../{AppSettings.cs => AppOptions.cs} | 2 +- .../ExternalServiceOptions.cs} | 5 +- .../RabbitMQOptions.cs} | 2 +- .../SecretOptions.cs} | 2 +- .../VerificationServiceOptions.cs | 8 + .../Controllers/HomeController.cs | 4 +- .../Extensions/BuilderExtensions.cs | 6 +- .../Extensions/ServiceCollectionExtensions.cs | 14 +- .../Services/ExternalServiceClient.cs | 14 +- .../IVerificationServiceClient.Models.cs | 66 ++++++++ .../Services/IVerificationServiceClient.cs | 15 ++ .../Services/VerificationServiceClient.cs | 65 ++++++++ src/Genocs.Core.Demo.WebApi/Program.cs | 7 +- src/Genocs.Core/Builders/Extensions.cs | 10 +- src/Genocs.Core/README_NUGET.md | 6 +- ...ingsBuilder.cs => ConsulOptionsBuilder.cs} | 24 +-- .../{ConsulSettings.cs => ConsulOptions.cs} | 11 +- .../Configurations/IConsulOptionsBuilder.cs | 15 ++ .../Configurations/IConsulSettingsBuilder.cs | 15 -- src/Genocs.Discovery.Consul/Extensions.cs | 18 +-- .../Http/ConsulHttpClient.cs | 8 +- .../ConsulServiceDiscoveryMessageHandler.cs | 19 ++- ...eBuilders.cs => RestEaseOptionsBuilder.cs} | 18 +-- .../Configurations/IRestEaseOptionsBuilder.cs | 8 + ...RestEaseSettings.cs => RestEaseOptions.cs} | 0 src/Genocs.HTTP.RestEase/Extensions.cs | 31 ++-- .../IRestEaseServiceBuilder.cs | 4 +- .../IRestEaseSettingsBuilder.cs | 10 -- ...ClientSettings.cs => HttpClientOptions.cs} | 9 +- src/Genocs.HTTP/Extensions.cs | 2 +- src/Genocs.HTTP/GenocsHttpClient.cs | 4 +- src/Genocs.HTTP/GenocsHttpLoggingFilter.cs | 4 +- .../GenocsLoggingScopeHttpMessageHandler.cs | 2 +- ...tingsBuilder.cs => FabioOptionsBuilder.cs} | 12 +- .../{FabioSettings.cs => FabioOptions.cs} | 4 +- ...ingsBuilder.cs => IFabioOptionsBuilder.cs} | 18 +-- src/Genocs.LoadBalancing.Fabio/Extensions.cs | 22 ++- .../Http/FabioHttpClient.cs | 2 +- .../MessageHandlers/FabioMessageHandler.cs | 4 +- .../{AzureSettings.cs => AzureOptions.cs} | 0 .../{ConsoleSettings.cs => ConsoleOptions.cs} | 0 .../{ElkSettings.cs => ElkOptions.cs} | 0 ...calFileSettings.cs => LocalFileOptions.cs} | 0 .../{LoggerSettings.cs => LoggerOptions.cs} | 4 - .../{LokiSettings.cs => LokiOptions.cs} | 0 .../{MongoSettings.cs => MongoOptions.cs} | 0 .../{SeqSettings.cs => SeqOptions.cs} | 0 src/Genocs.Logging/Extensions.cs | 30 ++-- .../Internals/MongoMessageOutbox.cs | 5 +- .../Internals/MongoOutboxInitializer.cs | 4 +- .../{OutboxSettings.cs => OutboxOptions.cs} | 2 +- .../MessageOutboxConfigurator.cs | 4 +- .../Extensions.cs | 2 +- .../IMessageOutboxConfigurator.cs | 2 +- .../Messages/OutboxMessage.cs | 4 +- .../Outbox/InMemoryMessageOutbox.cs | 2 +- .../Processors/OutboxProcessor.cs | 4 +- .../Builders/MetricsSettingsBuilder.cs | 20 +-- src/Genocs.Metrics/AppMetrics/Extensions.cs | 8 +- .../MongoDbEncryptionOptions.cs | 69 ++++++++ .../Encryptions/AzureInitializer.cs | 6 +- .../Extensions/MongoDbExtensions.cs | 28 ++-- .../Initializers/MongoDbInitializer.cs | 2 +- .../Repositories/IMongoDbOptionsBuilder.cs | 36 ----- .../Extensions.cs | 9 +- src/Genocs.Secrets.Vault/Extensions.cs | 38 +++-- .../Internals/VaultHostedService.cs | 4 +- .../Builders/DispatcherEndpointsBuilder.cs | 24 ++- .../Genocs.WebApi.Security.csproj | 4 + .../Docs/Builders/SwaggerOptionsBuilder.cs | 58 ------- .../Configurations/ISwaggerOptionsBuilder.cs | 1 - .../MessagingOptions.cs} | 10 +- .../Framework/MessagingMiddleware.cs | 8 +- .../api-gateway/Genocs.APIGateway/Startup.cs | 6 +- .../CorrelationIdFactory.cs | 2 +- .../OutboxCommandHandlerDecorator.cs | 2 +- .../Decorators/OutboxEventHandlerDecorator.cs | 2 +- .../Extensions.cs | 2 +- .../Services/ProductServiceClient.cs | 4 +- .../SignalROptions.cs} | 4 +- .../Framework/Extensions.cs | 6 +- testEnvironments.json | 17 ++ 89 files changed, 640 insertions(+), 457 deletions(-) rename src/Genocs.Auth/{ => Configurations}/IJwtOptionsBuilder.cs (83%) rename src/Genocs.Auth/Configurations/{JwtSettings.cs => JwtOptions.cs} (94%) rename src/Genocs.Common/Configurations/{AppSettings.cs => AppOptions.cs} (97%) rename src/Genocs.Core.Demo.WebApi/{Options/ExternalServiceSettings.cs => Configurations/ExternalServiceOptions.cs} (87%) rename src/Genocs.Core.Demo.WebApi/{Options/RabbitMQSettings.cs => Configurations/RabbitMQOptions.cs} (92%) rename src/Genocs.Core.Demo.WebApi/{Options/SecretSettings.cs => Configurations/SecretOptions.cs} (92%) create mode 100644 src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs rename src/Genocs.Discovery.Consul/Builders/{ConsulSettingsBuilder.cs => ConsulOptionsBuilder.cs} (50%) rename src/Genocs.Discovery.Consul/Configurations/{ConsulSettings.cs => ConsulOptions.cs} (75%) create mode 100644 src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs delete mode 100644 src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs rename src/Genocs.HTTP.RestEase/Builders/{RestEaseBuilders.cs => RestEaseOptionsBuilder.cs} (62%) create mode 100644 src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs rename src/Genocs.HTTP.RestEase/Configurations/{RestEaseSettings.cs => RestEaseOptions.cs} (100%) delete mode 100644 src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs rename src/Genocs.HTTP/Configurations/{HttpClientSettings.cs => HttpClientOptions.cs} (81%) rename src/Genocs.LoadBalancing.Fabio/Builders/{FabioSettingsBuilder.cs => FabioOptionsBuilder.cs} (76%) rename src/Genocs.LoadBalancing.Fabio/Configurations/{FabioSettings.cs => FabioOptions.cs} (91%) rename src/Genocs.LoadBalancing.Fabio/Configurations/{IFabioSettingsBuilder.cs => IFabioOptionsBuilder.cs} (68%) rename src/Genocs.Logging/Configurations/{AzureSettings.cs => AzureOptions.cs} (100%) rename src/Genocs.Logging/Configurations/{ConsoleSettings.cs => ConsoleOptions.cs} (100%) rename src/Genocs.Logging/Configurations/{ElkSettings.cs => ElkOptions.cs} (100%) rename src/Genocs.Logging/Configurations/{LocalFileSettings.cs => LocalFileOptions.cs} (100%) rename src/Genocs.Logging/Configurations/{LoggerSettings.cs => LoggerOptions.cs} (86%) rename src/Genocs.Logging/Configurations/{LokiSettings.cs => LokiOptions.cs} (100%) rename src/Genocs.Logging/Configurations/{MongoSettings.cs => MongoOptions.cs} (100%) rename src/Genocs.Logging/Configurations/{SeqSettings.cs => SeqOptions.cs} (100%) rename src/Genocs.MessageBrokers.Outbox/Configurations/{OutboxSettings.cs => OutboxOptions.cs} (93%) create mode 100644 src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs delete mode 100644 src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs delete mode 100644 src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs rename src/apps/api-gateway/Genocs.APIGateway/{Options/MessagingSettings.cs => Configurations/MessagingOptions.cs} (51%) rename src/apps/signalr/Genocs.SignalR.WebApi/{Options/SignalRSettings.cs => Configurations/SignalROptions.cs} (66%) create mode 100644 testEnvironments.json diff --git a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs index 74aaad37..b0de9341 100644 --- a/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs +++ b/src/Genocs.Auth/AccessTokenValidatorMiddleware.cs @@ -17,7 +17,7 @@ public class AccessTokenValidatorMiddleware : IMiddleware /// /// The access token service. /// The options. - public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, JwtSettings options) + public AccessTokenValidatorMiddleware(IAccessTokenService accessTokenService, JwtOptions options) { _accessTokenService = accessTokenService; _endpoints = options.AllowAnonymousEndpoints ?? Enumerable.Empty(); diff --git a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs index 090698db..c81ab262 100644 --- a/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs +++ b/src/Genocs.Auth/Builders/JwtOptionsBuilder.cs @@ -4,7 +4,7 @@ namespace Genocs.Auth.Builders; internal sealed class JwtOptionsBuilder : IJwtOptionsBuilder { - private readonly JwtSettings _options = new(); + private readonly JwtOptions _options = new(); public IJwtOptionsBuilder WithIssuerSigningKey(string issuerSigningKey) { @@ -48,6 +48,6 @@ public IJwtOptionsBuilder WithValidAudience(string validAudience) return this; } - public JwtSettings Build() + public JwtOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Auth/IJwtOptionsBuilder.cs b/src/Genocs.Auth/Configurations/IJwtOptionsBuilder.cs similarity index 83% rename from src/Genocs.Auth/IJwtOptionsBuilder.cs rename to src/Genocs.Auth/Configurations/IJwtOptionsBuilder.cs index 341a7542..9675c881 100644 --- a/src/Genocs.Auth/IJwtOptionsBuilder.cs +++ b/src/Genocs.Auth/Configurations/IJwtOptionsBuilder.cs @@ -1,6 +1,4 @@ -using Genocs.Auth.Configurations; - -namespace Genocs.Auth; +namespace Genocs.Auth.Configurations; public interface IJwtOptionsBuilder { @@ -10,5 +8,5 @@ public interface IJwtOptionsBuilder IJwtOptionsBuilder WithLifetimeValidation(bool validateLifetime); IJwtOptionsBuilder WithAudienceValidation(bool validateAudience); IJwtOptionsBuilder WithValidAudience(string validAudience); - JwtSettings Build(); + JwtOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.Auth/Configurations/JwtSettings.cs b/src/Genocs.Auth/Configurations/JwtOptions.cs similarity index 94% rename from src/Genocs.Auth/Configurations/JwtSettings.cs rename to src/Genocs.Auth/Configurations/JwtOptions.cs index 8a0311f6..cc181c18 100644 --- a/src/Genocs.Auth/Configurations/JwtSettings.cs +++ b/src/Genocs.Auth/Configurations/JwtOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.Auth.Configurations; -public class JwtSettings +public class JwtOptions { /// /// Default section name. @@ -12,7 +12,7 @@ public class JwtSettings /// public bool Enabled { get; set; } public IEnumerable? AllowAnonymousEndpoints { get; set; } - public CertificateSettings? Certificate { get; set; } + public CertificateOptions? Certificate { get; set; } public string? Algorithm { get; set; } public string? Issuer { get; set; } public string? IssuerSigningKey { get; set; } @@ -48,7 +48,7 @@ public class JwtSettings public string? NameClaimType { get; set; } public string? RoleClaimType { get; set; } - public class CertificateSettings + public class CertificateOptions { public string? Location { get; set; } public string? RawData { get; set; } diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index 75e2ffb3..27b6a1d6 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -23,21 +23,21 @@ public static class Extensions public static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - string sectionName = JwtSettings.Position, + string sectionName = JwtOptions.Position, Action? optionsFactory = null) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = JwtSettings.Position; + sectionName = JwtOptions.Position; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); return builder.AddJwt(options, optionsFactory); } private static IGenocsBuilder AddJwt( this IGenocsBuilder builder, - JwtSettings jwtSettings, + JwtOptions options, Action? optionsFactory = null) { if (!builder.TryRegister(RegistryName)) @@ -50,53 +50,53 @@ private static IGenocsBuilder AddJwt( builder.Services.AddSingleton(); builder.Services.AddTransient(); - if (!jwtSettings.Enabled) + if (!options.Enabled) { builder.Services.AddSingleton(); } var tokenValidationParameters = new TokenValidationParameters { - RequireAudience = jwtSettings.RequireAudience, - ValidIssuer = jwtSettings.ValidIssuer, - ValidIssuers = jwtSettings.ValidIssuers, - ValidateActor = jwtSettings.ValidateActor, - ValidAudience = jwtSettings.ValidAudience, - ValidAudiences = jwtSettings.ValidAudiences, - ValidateAudience = jwtSettings.ValidateAudience, - ValidateIssuer = jwtSettings.ValidateIssuer, - ValidateLifetime = jwtSettings.ValidateLifetime, - ValidateTokenReplay = jwtSettings.ValidateTokenReplay, - ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey, - SaveSigninToken = jwtSettings.SaveSigninToken, - RequireExpirationTime = jwtSettings.RequireExpirationTime, - RequireSignedTokens = jwtSettings.RequireSignedTokens, + RequireAudience = options.RequireAudience, + ValidIssuer = options.ValidIssuer, + ValidIssuers = options.ValidIssuers, + ValidateActor = options.ValidateActor, + ValidAudience = options.ValidAudience, + ValidAudiences = options.ValidAudiences, + ValidateAudience = options.ValidateAudience, + ValidateIssuer = options.ValidateIssuer, + ValidateLifetime = options.ValidateLifetime, + ValidateTokenReplay = options.ValidateTokenReplay, + ValidateIssuerSigningKey = options.ValidateIssuerSigningKey, + SaveSigninToken = options.SaveSigninToken, + RequireExpirationTime = options.RequireExpirationTime, + RequireSignedTokens = options.RequireSignedTokens, ClockSkew = TimeSpan.Zero }; - if (!string.IsNullOrWhiteSpace(jwtSettings.AuthenticationType)) + if (!string.IsNullOrWhiteSpace(options.AuthenticationType)) { - tokenValidationParameters.AuthenticationType = jwtSettings.AuthenticationType; + tokenValidationParameters.AuthenticationType = options.AuthenticationType; } bool hasCertificate = false; - if (jwtSettings.Certificate is not null) + if (options.Certificate is not null) { X509Certificate2? certificate = null; - string? password = jwtSettings.Certificate.Password; + string? password = options.Certificate.Password; bool hasPassword = !string.IsNullOrWhiteSpace(password); - if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.Location)) + if (!string.IsNullOrWhiteSpace(options.Certificate.Location)) { certificate = hasPassword - ? new X509Certificate2(jwtSettings.Certificate.Location, password) - : new X509Certificate2(jwtSettings.Certificate.Location); + ? new X509Certificate2(options.Certificate.Location, password) + : new X509Certificate2(options.Certificate.Location); string keyType = certificate.HasPrivateKey ? "with private key" : "with public key only"; - Console.WriteLine($"Loaded X.509 certificate from location: '{jwtSettings.Certificate.Location}' {keyType}."); + Console.WriteLine($"Loaded X.509 certificate from location: '{options.Certificate.Location}' {keyType}."); } - if (!string.IsNullOrWhiteSpace(jwtSettings.Certificate.RawData)) + if (!string.IsNullOrWhiteSpace(options.Certificate.RawData)) { - byte[] rawData = Convert.FromBase64String(jwtSettings.Certificate.RawData); + byte[] rawData = Convert.FromBase64String(options.Certificate.RawData); certificate = hasPassword ? new X509Certificate2(rawData, password) : new X509Certificate2(rawData); @@ -106,9 +106,9 @@ private static IGenocsBuilder AddJwt( if (certificate is not null) { - if (string.IsNullOrWhiteSpace(jwtSettings.Algorithm)) + if (string.IsNullOrWhiteSpace(options.Algorithm)) { - jwtSettings.Algorithm = SecurityAlgorithms.RsaSha256; + options.Algorithm = SecurityAlgorithms.RsaSha256; } hasCertificate = true; @@ -118,54 +118,54 @@ private static IGenocsBuilder AddJwt( } } - if (!string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey) && !hasCertificate) + if (!string.IsNullOrWhiteSpace(options.IssuerSigningKey) && !hasCertificate) { - if (string.IsNullOrWhiteSpace(jwtSettings.Algorithm) || hasCertificate) + if (string.IsNullOrWhiteSpace(options.Algorithm) || hasCertificate) { - jwtSettings.Algorithm = SecurityAlgorithms.HmacSha256; + options.Algorithm = SecurityAlgorithms.HmacSha256; } - byte[] rawKey = Encoding.UTF8.GetBytes(jwtSettings.IssuerSigningKey); + byte[] rawKey = Encoding.UTF8.GetBytes(options.IssuerSigningKey); tokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(rawKey); Console.WriteLine("Using symmetric encryption for issuing tokens."); } - if (!string.IsNullOrWhiteSpace(jwtSettings.NameClaimType)) + if (!string.IsNullOrWhiteSpace(options.NameClaimType)) { - tokenValidationParameters.NameClaimType = jwtSettings.NameClaimType; + tokenValidationParameters.NameClaimType = options.NameClaimType; } - if (!string.IsNullOrWhiteSpace(jwtSettings.RoleClaimType)) + if (!string.IsNullOrWhiteSpace(options.RoleClaimType)) { - tokenValidationParameters.RoleClaimType = jwtSettings.RoleClaimType; + tokenValidationParameters.RoleClaimType = options.RoleClaimType; } builder.Services .AddAuthentication(o => { - o.DefaultAuthenticateScheme = jwtSettings.Challenge; - o.DefaultChallengeScheme = jwtSettings.Challenge; - o.DefaultScheme = jwtSettings.Challenge; + o.DefaultAuthenticateScheme = options.Challenge; + o.DefaultChallengeScheme = options.Challenge; + o.DefaultScheme = options.Challenge; }) .AddJwtBearer(o => { - o.Authority = jwtSettings.Authority; - o.Audience = jwtSettings.Audience; - o.MetadataAddress = jwtSettings.MetadataAddress; - o.SaveToken = jwtSettings.SaveToken; - o.RefreshOnIssuerKeyNotFound = jwtSettings.RefreshOnIssuerKeyNotFound; - o.RequireHttpsMetadata = jwtSettings.RequireHttpsMetadata; - o.IncludeErrorDetails = jwtSettings.IncludeErrorDetails; + o.Authority = options.Authority; + o.Audience = options.Audience; + o.MetadataAddress = options.MetadataAddress; + o.SaveToken = options.SaveToken; + o.RefreshOnIssuerKeyNotFound = options.RefreshOnIssuerKeyNotFound; + o.RequireHttpsMetadata = options.RequireHttpsMetadata; + o.IncludeErrorDetails = options.IncludeErrorDetails; o.TokenValidationParameters = tokenValidationParameters; - if (!string.IsNullOrWhiteSpace(jwtSettings.Challenge)) + if (!string.IsNullOrWhiteSpace(options.Challenge)) { - o.Challenge = jwtSettings.Challenge; + o.Challenge = options.Challenge; } optionsFactory?.Invoke(o); }); - builder.Services.AddSingleton(jwtSettings); + builder.Services.AddSingleton(options); builder.Services.AddSingleton(tokenValidationParameters); return builder; @@ -180,29 +180,28 @@ private static IGenocsBuilder AddJwt( /// The Genocs builder you can use for chain. public static IGenocsBuilder AddOpenIdJwt( this IGenocsBuilder builder, - string sectionName = JwtSettings.Position) + string sectionName = JwtOptions.Position) { - var jwtSettings = new JwtSettings(); - builder.Configuration.GetSection(sectionName).Bind(jwtSettings); + JwtOptions options = builder.Configuration.GetOptions(sectionName); - string metadataAddress = $"{jwtSettings.Issuer}{jwtSettings.MetadataAddress}"; + string metadataAddress = $"{options.Issuer}{options.MetadataAddress}"; var configurationManager = new ConfigurationManager(metadataAddress, new OpenIdConnectConfigurationRetriever()); builder.Services .AddAuthentication(o => { - o.DefaultAuthenticateScheme = jwtSettings.Challenge; - o.DefaultChallengeScheme = jwtSettings.Challenge; - o.DefaultScheme = jwtSettings.Challenge; + o.DefaultAuthenticateScheme = options.Challenge; + o.DefaultChallengeScheme = options.Challenge; + o.DefaultScheme = options.Challenge; }) .AddJwtBearer(o => { - o.IncludeErrorDetails = jwtSettings.IncludeErrorDetails; - o.RefreshOnIssuerKeyNotFound = jwtSettings.RefreshOnIssuerKeyNotFound; + o.IncludeErrorDetails = options.IncludeErrorDetails; + o.RefreshOnIssuerKeyNotFound = options.RefreshOnIssuerKeyNotFound; o.MetadataAddress = metadataAddress; o.ConfigurationManager = configurationManager; - o.Audience = jwtSettings.Audience; + o.Audience = options.Audience; }); return builder; @@ -217,22 +216,21 @@ public static IGenocsBuilder AddOpenIdJwt( /// Whenever mandatory data like 'IssuerSigningKey' is missing. public static IGenocsBuilder AddPrivateKeyJwt( this IGenocsBuilder builder, - string sectionName = JwtSettings.Position) + string sectionName = JwtOptions.Position) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = JwtSettings.Position; + sectionName = JwtOptions.Position; } - var jwtSettings = new JwtSettings(); - builder.Configuration.GetSection(sectionName).Bind(jwtSettings); + JwtOptions options = builder.Configuration.GetOptions(sectionName); - if (string.IsNullOrWhiteSpace(jwtSettings.IssuerSigningKey)) + if (string.IsNullOrWhiteSpace(options.IssuerSigningKey)) { throw new InvalidOperationException("Issuer signing key is missing."); } - SecurityKey signingKey = SecurityKeyBuilder.CreateRsaSecurityKey(jwtSettings.IssuerSigningKey); + SecurityKey signingKey = SecurityKeyBuilder.CreateRsaSecurityKey(options.IssuerSigningKey); builder.Services .AddAuthentication(o => @@ -241,17 +239,17 @@ public static IGenocsBuilder AddPrivateKeyJwt( }) .AddJwtBearer(o => { - o.SaveToken = jwtSettings.SaveToken; - o.RequireHttpsMetadata = jwtSettings.RequireHttpsMetadata; + o.SaveToken = options.SaveToken; + o.RequireHttpsMetadata = options.RequireHttpsMetadata; o.TokenValidationParameters = new TokenValidationParameters() { IssuerSigningKey = signingKey, - ValidateAudience = jwtSettings.ValidateAudience, - ValidAudience = jwtSettings.ValidAudience, - ValidateIssuer = jwtSettings.ValidateIssuer, - ValidIssuer = jwtSettings.ValidIssuer, - ValidateLifetime = jwtSettings.ValidateLifetime, - ValidateIssuerSigningKey = jwtSettings.ValidateIssuerSigningKey + ValidateAudience = options.ValidateAudience, + ValidAudience = options.ValidAudience, + ValidateIssuer = options.ValidateIssuer, + ValidIssuer = options.ValidIssuer, + ValidateLifetime = options.ValidateLifetime, + ValidateIssuerSigningKey = options.ValidateIssuerSigningKey }; }); diff --git a/src/Genocs.Auth/Handlers/JwtHandler.cs b/src/Genocs.Auth/Handlers/JwtHandler.cs index fe8ec6c3..36e197e0 100644 --- a/src/Genocs.Auth/Handlers/JwtHandler.cs +++ b/src/Genocs.Auth/Handlers/JwtHandler.cs @@ -20,12 +20,12 @@ internal sealed class JwtHandler : IJwtHandler }; private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler = new(); - private readonly JwtSettings _options; + private readonly JwtOptions _options; private readonly TokenValidationParameters _tokenValidationParameters; private readonly SigningCredentials _signingCredentials; private readonly string? _issuer; - public JwtHandler(JwtSettings options, TokenValidationParameters tokenValidationParameters) + public JwtHandler(JwtOptions options, TokenValidationParameters tokenValidationParameters) { var issuerSigningKey = tokenValidationParameters.IssuerSigningKey; if (issuerSigningKey is null) diff --git a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs index 07ebfce6..8ce4fb58 100644 --- a/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs +++ b/src/Genocs.Auth/Services/InMemoryAccessTokenService.cs @@ -14,7 +14,7 @@ internal sealed class InMemoryAccessTokenService : IAccessTokenService public InMemoryAccessTokenService( IMemoryCache cache, IHttpContextAccessor httpContextAccessor, - JwtSettings jwtOptions) + JwtOptions jwtOptions) { _cache = cache; _httpContextAccessor = httpContextAccessor; diff --git a/src/Genocs.Common/Configurations/AppSettings.cs b/src/Genocs.Common/Configurations/AppOptions.cs similarity index 97% rename from src/Genocs.Common/Configurations/AppSettings.cs rename to src/Genocs.Common/Configurations/AppOptions.cs index 70dedf7b..a5596f68 100644 --- a/src/Genocs.Common/Configurations/AppSettings.cs +++ b/src/Genocs.Common/Configurations/AppOptions.cs @@ -3,7 +3,7 @@ namespace Genocs.Common.Configurations; /// /// The application settings. /// -public class AppSettings +public class AppOptions { /// /// Default section name. diff --git a/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs b/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs similarity index 87% rename from src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs rename to src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs index 5b7386f4..c52cacaa 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/ExternalServiceSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs @@ -2,7 +2,10 @@ namespace Genocs.Core.Demo.WebApi.Options; -public class ExternalServiceSettings : IValidatableObject +/// +/// This class implements Options pattern with Validation. +/// +public class ExternalServiceOptions : IValidatableObject { public const string Position = "ExternalService"; diff --git a/src/Genocs.Core.Demo.WebApi/Options/RabbitMQSettings.cs b/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs similarity index 92% rename from src/Genocs.Core.Demo.WebApi/Options/RabbitMQSettings.cs rename to src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs index 0afe6136..92bc8656 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/RabbitMQSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.Core.Demo.WebApi.Options; -public class RabbitMQSettings +public class RabbitMQOptions { public const string Position = "RabbitMQ"; diff --git a/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs b/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs similarity index 92% rename from src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs rename to src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs index 08d05a8a..51ef9d67 100644 --- a/src/Genocs.Core.Demo.WebApi/Options/SecretSettings.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.Core.Demo.WebApi.Options; -public class SecretSettings +public class SecretOptions { /// /// Default section name. diff --git a/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs b/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs new file mode 100644 index 00000000..2f847694 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs @@ -0,0 +1,8 @@ +namespace Genocs.Core.Demo.WebApi.Options; + +public class VerificationServiceOptions +{ + public const string Position = "VerificationService"; + + public string ApiKey { get; set; } = default!; +} diff --git a/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs b/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs index 44726b15..9aaea49b 100644 --- a/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs +++ b/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs @@ -7,9 +7,9 @@ namespace Genocs.Core.Demo.WebApi.Controllers; [Route("")] public class HomeController : ControllerBase { - public readonly SecretSettings _secretSettings; + public readonly SecretOptions _secretSettings; - public HomeController(SecretSettings secretSettings) + public HomeController(SecretOptions secretSettings) { _secretSettings = secretSettings ?? throw new ArgumentNullException(nameof(secretSettings)); } diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs index f41c1804..f4fe8d8d 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs @@ -32,12 +32,14 @@ public static IGenocsBuilder AddApplicationServices(this IGenocsBuilder builder) // builder.Services.AddSingleton(settings); // Option 2: In this way ExternalServiceSettings is available for dependency injection. By using IOptions you can access the settings. - builder.Services.AddOptions() - .BindConfiguration(ExternalServiceSettings.Position) + builder.Services.AddOptions() + .BindConfiguration(ExternalServiceOptions.Position) .ValidateDataAnnotations() .ValidateOnStart(); // builder.Services.AddSingleton, ConfigureWebApiSettings>(); + ExternalServiceOptions settings = builder.Configuration.GetOptions(ExternalServiceOptions.Position); + builder.Services.AddSingleton(settings); // Add the External Service http Client builder.Services.AddTransient(); diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs index ec7625ca..4d0f1984 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ -using Genocs.Core.Demo.WebApi.Options; +using Genocs.Core.Builders; +using Genocs.Core.Demo.WebApi.Options; using Genocs.ServiceBusAzure.Configurations; using Genocs.ServiceBusAzure.Queues; using Genocs.ServiceBusAzure.Queues.Interfaces; @@ -50,10 +51,9 @@ public static IServiceCollection AddAzureServiceBusQueue(this IServiceCollection public static IServiceCollection AddCustomMassTransit(this IServiceCollection services, IConfiguration configuration) { - var rabbitMQSettings = new RabbitMQSettings(); - configuration.GetSection(RabbitMQSettings.Position).Bind(rabbitMQSettings); + RabbitMQOptions options = configuration.GetOptions(RabbitMQOptions.Position); - services.AddSingleton(rabbitMQSettings); + services.AddSingleton(options); services.AddMassTransit(x => { @@ -63,11 +63,11 @@ public static IServiceCollection AddCustomMassTransit(this IServiceCollection se { cfg.ConfigureEndpoints(context); //cfg.UseHealthCheck(context); - cfg.Host(rabbitMQSettings.HostName, rabbitMQSettings.VirtualHost, + cfg.Host(options.HostName, options.VirtualHost, h => { - h.Username(rabbitMQSettings.UserName); - h.Password(rabbitMQSettings.Password); + h.Username(options.UserName); + h.Password(options.Password); } ); }); diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs index 0bce6027..f7716aff 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs @@ -15,7 +15,7 @@ public class ExternalServiceClient : IExternalServiceClient private readonly IHttpClient _client; private readonly string _url; private readonly IHasher _hasher; - private readonly ExternalServiceOptions _externalServiceSettings; + private readonly ExternalServiceOptions _externalServiceOptions; /// /// The standard constructor. @@ -27,12 +27,12 @@ public class ExternalServiceClient : IExternalServiceClient public ExternalServiceClient( IHttpClient client, IHasher hasher, - HttpClientSettings httpClientSettings, - IOptions options) + HttpClientOptions httpClientSettings, + IOptions options) { _client = client ?? throw new ArgumentNullException(nameof(client)); _hasher = hasher ?? throw new ArgumentNullException(nameof(hasher)); - _externalServiceSettings = options.Value ?? throw new ArgumentNullException(nameof(options)); + _externalServiceOptions = options.Value ?? throw new ArgumentNullException(nameof(options)); if (httpClientSettings is null) { @@ -51,8 +51,8 @@ public ExternalServiceClient( private void SetHeaders(string request) { - string hash = _hasher.Hash(request, _externalServiceSettings.Private); - string headerData = $"Credential={_externalServiceSettings.Public}, Signature={hash}"; + string hash = _hasher.Hash(request, _externalServiceOptions.Private); + string headerData = $"Credential={_externalServiceOptions.Public}, Signature={hash}"; _client.SetHeaders(h => h.TryAddWithoutValidation("Authorization", headerData)); } @@ -67,7 +67,7 @@ public async Task IssueAsync(IssuingRequest request) SetHeaders(serializedRequest); using (var content = new StringContent(serializedRequest, System.Text.Encoding.UTF8, "application/json")) { - return await _client.PostAsync($"{_url}/redemptions/gift-cards/{_externalServiceSettings.Caller}/direct-issue", content); + return await _client.PostAsync($"{_url}/redemptions/gift-cards/{_externalServiceOptions.Caller}/direct-issue", content); } } diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs new file mode 100644 index 00000000..221a71f2 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.Models.cs @@ -0,0 +1,66 @@ +using Newtonsoft.Json; + +namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; + +/// +/// The Internal User verification request. +/// +public class VerificationApiRequest +{ + [JsonProperty("type")] + public string? Type { get; set; } + + [JsonProperty("joinedDate")] + public string? JoinedDate { get; set; } + + [JsonProperty("email")] + public string? Email { get; set; } + + [JsonProperty("personDetails")] + public PersonDetailsRequest? Details { get; set; } +} + +public class PersonDetailsRequest +{ + [JsonProperty("firstName")] + public string? FirstName { get; set; } + + [JsonProperty("lastName")] + public string? LastName { get; set; } + + [JsonProperty("dob")] + public string? DateOfBirth { get; set; } + + [JsonProperty("gender")] + public string? Gender { get; set; } + + [JsonProperty("nationality")] + public string? Nationality { get; set; } +} + +/// +/// The internal User verification response. +/// +public class VerificationApiResponse +{ + [JsonProperty("id")] + public string? Id { get; set; } + + [JsonProperty("createdAt")] + public string? CreatedAt { get; set; } + + [JsonProperty("updatedAt")] + public string? UpdatedAt { get; set; } + + [JsonProperty("type")] + public string? Type { get; set; } + + [JsonProperty("joinedDate")] + public string? JoinedDate { get; set; } + + [JsonProperty("email")] + public string? Email { get; set; } + + [JsonProperty("personDetails")] + public PersonDetailsRequest? Details { get; set; } +} \ No newline at end of file diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs new file mode 100644 index 00000000..7129c59f --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/IVerificationServiceClient.cs @@ -0,0 +1,15 @@ +namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; + +/// +/// The External WebApi client definition. +/// This API client is used to verify the user. +/// +public interface IVerificationServiceClient +{ + /// + /// Send a request To verify the user. + /// + /// The request with the user data. + /// The user verification response. + Task VerifyAsync(VerificationApiRequest request); +} diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs new file mode 100644 index 00000000..e9840a86 --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs @@ -0,0 +1,65 @@ +using Genocs.Core.Demo.WebApi.Options; +using Genocs.HTTP; +using Genocs.HTTP.Configurations; +using Newtonsoft.Json; + +namespace Genocs.Core.Demo.WebApi.Infrastructure.Services; + +/// +/// The Verification WebApi client implementation. +/// +public class VerificationServiceClient : IVerificationServiceClient +{ + private readonly IHttpClient _client; + private readonly string _url; + private readonly VerificationServiceOptions _externalServiceSettings; + + /// + /// The standard constructor. + /// + /// The http client. + /// The http client settings. + /// The security settings. + public VerificationServiceClient( + IHttpClient client, + HttpClientOptions httpClientSettings, + VerificationServiceOptions externalServiceSettings) + { + _client = client ?? throw new ArgumentNullException(nameof(client)); + _externalServiceSettings = externalServiceSettings ?? throw new ArgumentNullException(nameof(externalServiceSettings)); + + if (httpClientSettings is null) + { + throw new ArgumentNullException(nameof(httpClientSettings)); + } + + string? url = httpClientSettings?.Services?["user_verifier"]; + + if (string.IsNullOrWhiteSpace(url)) + { + throw new Exception("user_verifier http client settings cannot be null"); + } + + _url = url; + } + + private void SetHeaders() + { + _client.SetHeaders(h => h.TryAddWithoutValidation("Authorization", _externalServiceSettings.ApiKey)); + } + + /// + /// The method to verify the user. + /// + /// The verification api request. + /// The response. + public async Task VerifyAsync(VerificationApiRequest request) + { + SetHeaders(); + string serializedRequest = JsonConvert.SerializeObject(request); + using (var content = new StringContent(serializedRequest, System.Text.Encoding.UTF8, "application/json")) + { + return await _client.PostAsync($"{_url}/clients", request); + } + } +} \ No newline at end of file diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index 691a782d..6fbac463 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -6,6 +6,7 @@ using Genocs.Persistence.MongoDb.Extensions; using Genocs.Secrets.AzureKeyVault; using Genocs.Tracing; +using Genocs.WebApi.Security; using Microsoft.Extensions.Diagnostics.HealthChecks; using Serilog; using System.Reflection; @@ -23,7 +24,6 @@ services .AddGenocs(builder.Configuration) - .AddPrivateKeyJwt() .AddOpenTelemetry() .AddMongoFast() .RegisterMongoRepositories(Assembly.GetExecutingAssembly()) @@ -39,10 +39,9 @@ services.AddHealthChecks(); -services.Configure(builder.Configuration.GetSection(SecretSettings.Position)); +services.Configure(builder.Configuration.GetSection(SecretOptions.Position)); -var settings = new SecretSettings(); -builder.Configuration.GetSection(SecretSettings.Position).Bind(settings); +SecretOptions settings = builder.Configuration.GetOptions(SecretOptions.Position); services.AddSingleton(settings); services.Configure(options => diff --git a/src/Genocs.Core/Builders/Extensions.cs b/src/Genocs.Core/Builders/Extensions.cs index 1d951979..8436b812 100644 --- a/src/Genocs.Core/Builders/Extensions.cs +++ b/src/Genocs.Core/Builders/Extensions.cs @@ -20,18 +20,18 @@ public static class Extensions public static IGenocsBuilder AddGenocs(this IServiceCollection services, IConfiguration? configuration = null) { var builder = GenocsBuilder.Create(services, configuration); - var options = builder.GetOptions(AppSettings.Position); - services.AddSingleton(options); + var settings = builder.GetOptions(AppOptions.Position); + services.AddSingleton(settings); builder.Services.AddMemoryCache(); services.AddSingleton(); - if (!options.DisplayBanner || string.IsNullOrWhiteSpace(options.Name)) + if (!settings.DisplayBanner || string.IsNullOrWhiteSpace(settings.Name)) { return builder; } - string version = options.DisplayVersion ? $" {options.Version}" : string.Empty; - Console.WriteLine(Figgle.FiggleFonts.Doom.Render(options.Name + version)); + string version = settings.DisplayVersion ? $" {settings.Version}" : string.Empty; + Console.WriteLine(Figgle.FiggleFonts.Doom.Render(settings.Name + version)); ConsoleColor current = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("Runtime Version: {0}", Environment.Version.ToString()); diff --git a/src/Genocs.Core/README_NUGET.md b/src/Genocs.Core/README_NUGET.md index 2683d26d..7aebc35c 100644 --- a/src/Genocs.Core/README_NUGET.md +++ b/src/Genocs.Core/README_NUGET.md @@ -1,7 +1,7 @@ # .NET Core library This package contains a set of base functionalities designed by Genocs. -The library is built to be used on .NET standard 2.1 and NET6 or NET7 as well. +The library is built to be used on .NET standard 2.1 and NET6, NET7 NET8. ## Description @@ -15,6 +15,10 @@ Please check the GitHub repository getting more info. ## Release notes +### [2024-06-22] 6.0.0-preview.1.0 +- Upgrade toward Version 6.0.0 +- + ### [2024-01-23] 5.0.6 - Refactory Settings - Updated nuget packages diff --git a/src/Genocs.Discovery.Consul/Builders/ConsulSettingsBuilder.cs b/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs similarity index 50% rename from src/Genocs.Discovery.Consul/Builders/ConsulSettingsBuilder.cs rename to src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs index 23f1e1d8..f5b29178 100644 --- a/src/Genocs.Discovery.Consul/Builders/ConsulSettingsBuilder.cs +++ b/src/Genocs.Discovery.Consul/Builders/ConsulOptionsBuilder.cs @@ -2,63 +2,63 @@ namespace Genocs.Discovery.Consul.Builders; -internal sealed class ConsulSettingsBuilder : IConsulSettingsBuilder +internal sealed class ConsulOptionsBuilder : IConsulOptionsBuilder { - private readonly ConsulSettings _options = new(); + private readonly ConsulOptions _options = new(); - public IConsulSettingsBuilder Enable(bool enabled) + public IConsulOptionsBuilder Enable(bool enabled) { _options.Enabled = enabled; return this; } - public IConsulSettingsBuilder WithUrl(string url) + public IConsulOptionsBuilder WithUrl(string url) { _options.Url = url; return this; } - public IConsulSettingsBuilder WithService(string service) + public IConsulOptionsBuilder WithService(string service) { _options.Service = service; return this; } - public IConsulSettingsBuilder WithAddress(string address) + public IConsulOptionsBuilder WithAddress(string address) { _options.Address = address; return this; } - public IConsulSettingsBuilder WithEnabledPing(bool pingEnabled) + public IConsulOptionsBuilder WithEnabledPing(bool pingEnabled) { _options.PingEnabled = pingEnabled; return this; } - public IConsulSettingsBuilder WithPingEndpoint(string pingEndpoint) + public IConsulOptionsBuilder WithPingEndpoint(string pingEndpoint) { _options.PingEndpoint = pingEndpoint; return this; } - public IConsulSettingsBuilder WithPingInterval(string pingInterval) + public IConsulOptionsBuilder WithPingInterval(string pingInterval) { _options.PingInterval = pingInterval; return this; } - public IConsulSettingsBuilder WithRemoteAfterInterval(string remoteAfterInterval) + public IConsulOptionsBuilder WithRemoteAfterInterval(string remoteAfterInterval) { _options.RemoveAfterInterval = remoteAfterInterval; return this; } - public IConsulSettingsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace) + public IConsulOptionsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace) { _options.SkipLocalhostDockerDnsReplace = skipLocalhostDockerDnsReplace; return this; } - public ConsulSettings Build() => _options; + public ConsulOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/Configurations/ConsulSettings.cs b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs similarity index 75% rename from src/Genocs.Discovery.Consul/Configurations/ConsulSettings.cs rename to src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs index a07ff2ef..3f1f6cc9 100644 --- a/src/Genocs.Discovery.Consul/Configurations/ConsulSettings.cs +++ b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs @@ -1,7 +1,12 @@ namespace Genocs.Discovery.Consul.Configurations; -public class ConsulSettings +public class ConsulOptions { + /// + /// Default section name. + /// + public const string Position = "consul"; + public bool Enabled { get; set; } public string? Url { get; set; } public string? Service { get; set; } @@ -15,9 +20,9 @@ public class ConsulSettings public IDictionary? Meta { get; set; } public bool EnableTagOverride { get; set; } public bool SkipLocalhostDockerDnsReplace { get; set; } - public ConnectSettings? Connect { get; set; } + public ConnectOptions? Connect { get; set; } - public class ConnectSettings + public class ConnectOptions { public bool Enabled { get; set; } } diff --git a/src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs b/src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs new file mode 100644 index 00000000..63b5aeda --- /dev/null +++ b/src/Genocs.Discovery.Consul/Configurations/IConsulOptionsBuilder.cs @@ -0,0 +1,15 @@ +namespace Genocs.Discovery.Consul.Configurations; + +public interface IConsulOptionsBuilder +{ + IConsulOptionsBuilder Enable(bool enabled); + IConsulOptionsBuilder WithUrl(string url); + IConsulOptionsBuilder WithService(string service); + IConsulOptionsBuilder WithAddress(string address); + IConsulOptionsBuilder WithEnabledPing(bool pingEnabled); + IConsulOptionsBuilder WithPingEndpoint(string pingEndpoint); + IConsulOptionsBuilder WithPingInterval(string pingInterval); + IConsulOptionsBuilder WithRemoteAfterInterval(string remoteAfterInterval); + IConsulOptionsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace); + ConsulOptions Build(); +} \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs b/src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs deleted file mode 100644 index 1288918d..00000000 --- a/src/Genocs.Discovery.Consul/Configurations/IConsulSettingsBuilder.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Genocs.Discovery.Consul.Configurations; - -public interface IConsulSettingsBuilder -{ - IConsulSettingsBuilder Enable(bool enabled); - IConsulSettingsBuilder WithUrl(string url); - IConsulSettingsBuilder WithService(string service); - IConsulSettingsBuilder WithAddress(string address); - IConsulSettingsBuilder WithEnabledPing(bool pingEnabled); - IConsulSettingsBuilder WithPingEndpoint(string pingEndpoint); - IConsulSettingsBuilder WithPingInterval(string pingInterval); - IConsulSettingsBuilder WithRemoteAfterInterval(string remoteAfterInterval); - IConsulSettingsBuilder WithSkippingLocalhostDockerDnsReplace(bool skipLocalhostDockerDnsReplace); - ConsulSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Discovery.Consul/Extensions.cs b/src/Genocs.Discovery.Consul/Extensions.cs index e412aa8b..a8a8c511 100644 --- a/src/Genocs.Discovery.Consul/Extensions.cs +++ b/src/Genocs.Discovery.Consul/Extensions.cs @@ -27,24 +27,24 @@ public static IGenocsBuilder AddConsul( sectionName = SectionName; } - var consulOptions = builder.GetOptions(sectionName); - var httpClientOptions = builder.GetOptions(httpClientSectionName); + var consulOptions = builder.GetOptions(sectionName); + var httpClientOptions = builder.GetOptions(httpClientSectionName); return builder.AddConsul(consulOptions, httpClientOptions); } public static IGenocsBuilder AddConsul( this IGenocsBuilder builder, - Func buildOptions, - HttpClientSettings httpClientOptions) + Func buildOptions, + HttpClientOptions httpClientOptions) { - var options = buildOptions(new ConsulSettingsBuilder()).Build(); + var options = buildOptions(new ConsulOptionsBuilder()).Build(); return builder.AddConsul(options, httpClientOptions); } public static IGenocsBuilder AddConsul( this IGenocsBuilder builder, - ConsulSettings options, - HttpClientSettings httpClientOptions) + ConsulOptions options, + HttpClientOptions httpClientOptions) { builder.Services.AddSingleton(options); if (!options.Enabled || !builder.TryRegister(RegistryName)) @@ -78,9 +78,9 @@ public static void AddConsulHttpClient(this IGenocsBuilder builder, string clien => builder.Services.AddHttpClient(clientName) .AddHttpMessageHandler(c => new ConsulServiceDiscoveryMessageHandler( c.GetRequiredService(), - c.GetRequiredService(), serviceName, true)); + c.GetRequiredService(), serviceName, true)); - private static ServiceRegistration CreateConsulAgentRegistration(this IGenocsBuilder builder, ConsulSettings options) + private static ServiceRegistration CreateConsulAgentRegistration(this IGenocsBuilder builder, ConsulOptions options) { bool enabled = options.Enabled; string? consulEnabled = Environment.GetEnvironmentVariable("CONSUL_ENABLED")?.ToLowerInvariant(); diff --git a/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs b/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs index ac4f97fa..23bef586 100644 --- a/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs +++ b/src/Genocs.Discovery.Consul/Http/ConsulHttpClient.cs @@ -5,8 +5,12 @@ namespace Genocs.Discovery.Consul.Http; internal sealed class ConsulHttpClient : GenocsHttpClient, IConsulHttpClient { - public ConsulHttpClient(HttpClient client, HttpClientSettings options, IHttpClientSerializer serializer, - ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) + public ConsulHttpClient( + HttpClient client, + HttpClientOptions options, + IHttpClientSerializer serializer, + ICorrelationContextFactory correlationContextFactory, + ICorrelationIdFactory correlationIdFactory) : base(client, options, serializer, correlationContextFactory, correlationIdFactory) { } diff --git a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs index 0888cb6f..481db53f 100644 --- a/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs +++ b/src/Genocs.Discovery.Consul/MessageHandlers/ConsulServiceDiscoveryMessageHandler.cs @@ -5,25 +5,30 @@ namespace Genocs.Discovery.Consul.MessageHandlers; internal sealed class ConsulServiceDiscoveryMessageHandler : DelegatingHandler { private readonly IConsulServicesRegistry _servicesRegistry; - private readonly ConsulSettings _options; + private readonly ConsulOptions _options; private readonly string? _serviceName; private readonly bool? _overrideRequestUri; public ConsulServiceDiscoveryMessageHandler( IConsulServicesRegistry servicesRegistry, - ConsulSettings options, + ConsulOptions options, string? serviceName = null, bool? overrideRequestUri = null) { - if (string.IsNullOrWhiteSpace(options.Url)) - { - throw new InvalidOperationException("Consul URL was not provided."); - } - _servicesRegistry = servicesRegistry; _options = options; _serviceName = serviceName; _overrideRequestUri = overrideRequestUri; + + if (!options.Enabled) + { + return; + } + + if (string.IsNullOrWhiteSpace(options.Url)) + { + throw new InvalidOperationException("Consul URL was not provided."); + } } protected override async Task SendAsync( diff --git a/src/Genocs.HTTP.RestEase/Builders/RestEaseBuilders.cs b/src/Genocs.HTTP.RestEase/Builders/RestEaseOptionsBuilder.cs similarity index 62% rename from src/Genocs.HTTP.RestEase/Builders/RestEaseBuilders.cs rename to src/Genocs.HTTP.RestEase/Builders/RestEaseOptionsBuilder.cs index da1d0b69..55bb2367 100644 --- a/src/Genocs.HTTP.RestEase/Builders/RestEaseBuilders.cs +++ b/src/Genocs.HTTP.RestEase/Builders/RestEaseOptionsBuilder.cs @@ -1,26 +1,26 @@ -using Genocs.HTTP.RestEase.Options; +using Genocs.HTTP.RestEase.Configurations; namespace Genocs.HTTP.RestEase.Builders; -internal sealed class RestEaseSettingsBuilder : IRestEaseSettingsBuilder +internal sealed class RestEaseOptionsBuilder : IRestEaseOptionsBuilder { - private readonly RestEaseSettings _options = new(); - private readonly List _services = new(); + private readonly RestEaseOptions _options = new(); + private readonly List _services = new(); - public IRestEaseSettingsBuilder WithLoadBalancer(string loadBalancer) + public IRestEaseOptionsBuilder WithLoadBalancer(string loadBalancer) { _options.LoadBalancer = loadBalancer; return this; } - public IRestEaseSettingsBuilder WithService(Func buildService) + public IRestEaseOptionsBuilder WithService(Func buildService) { var service = buildService(new RestEaseServiceBuilder()).Build(); _services.Add(service); return this; } - public RestEaseSettings Build() + public RestEaseOptions Build() { _options.Services = _services; return _options; @@ -28,7 +28,7 @@ public RestEaseSettings Build() private class RestEaseServiceBuilder : IRestEaseServiceBuilder { - private readonly RestEaseSettings.Service _service = new(); + private readonly RestEaseOptions.Service _service = new(); public IRestEaseServiceBuilder WithName(string name) { @@ -54,6 +54,6 @@ public IRestEaseServiceBuilder WithPort(int port) return this; } - public RestEaseSettings.Service Build() => _service; + public RestEaseOptions.Service Build() => _service; } } \ No newline at end of file diff --git a/src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs b/src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs new file mode 100644 index 00000000..f013109a --- /dev/null +++ b/src/Genocs.HTTP.RestEase/Configurations/IRestEaseOptionsBuilder.cs @@ -0,0 +1,8 @@ +namespace Genocs.HTTP.RestEase.Configurations; + +public interface IRestEaseOptionsBuilder +{ + IRestEaseOptionsBuilder WithLoadBalancer(string loadBalancer); + IRestEaseOptionsBuilder WithService(Func buildService); + RestEaseOptions Build(); +} \ No newline at end of file diff --git a/src/Genocs.HTTP.RestEase/Configurations/RestEaseSettings.cs b/src/Genocs.HTTP.RestEase/Configurations/RestEaseOptions.cs similarity index 100% rename from src/Genocs.HTTP.RestEase/Configurations/RestEaseSettings.cs rename to src/Genocs.HTTP.RestEase/Configurations/RestEaseOptions.cs diff --git a/src/Genocs.HTTP.RestEase/Extensions.cs b/src/Genocs.HTTP.RestEase/Extensions.cs index d22e4477..d37c8ce0 100644 --- a/src/Genocs.HTTP.RestEase/Extensions.cs +++ b/src/Genocs.HTTP.RestEase/Extensions.cs @@ -17,9 +17,13 @@ public static class Extensions private const string SectionName = "restEase"; private const string RegistryName = "http.restEase"; - public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, string serviceName, - string sectionName = SectionName, string consulSectionName = "consul", string fabioSectionName = "fabio", - string httpClientSectionName = "httpClient") + public static IGenocsBuilder AddServiceClient( + this IGenocsBuilder builder, + string serviceName, + string sectionName = SectionName, + string consulSectionName = "consul", + string fabioSectionName = "fabio", + string httpClientSectionName = "httpClient") where T : class { if (string.IsNullOrWhiteSpace(sectionName)) @@ -33,10 +37,10 @@ public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, st } public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, string serviceName, - Func buildOptions, - Func buildConsulOptions, - Func buildFabioOptions, - HttpClientSettings httpClientOptions) + Func buildOptions, + Func buildConsulOptions, + Func buildFabioOptions, + HttpClientOptions httpClientOptions) where T : class { var options = buildOptions(new RestEaseOptionsBuilder()).Build(); @@ -44,12 +48,15 @@ public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, st b => b.AddFabio(buildFabioOptions, buildConsulOptions, httpClientOptions)); } - public static IGenocsBuilder AddServiceClient(this IGenocsBuilder builder, string serviceName, - RestEaseOptions options, ConsulOptions consulOptions, FabioOptions fabioOptions, - HttpClientOptions httpClientOptions) + public static IGenocsBuilder AddServiceClient( + this IGenocsBuilder builder, + string serviceName, + RestEaseOptions options, + ConsulOptions consulOptions, + FabioOptions fabioOptions, + HttpClientOptions httpClientOptions) where T : class - => builder.AddServiceClient(serviceName, options, - b => b.AddFabio(fabioOptions, consulOptions, httpClientOptions)); + => builder.AddServiceClient(serviceName, options, b => b.AddFabio(fabioOptions, consulOptions, httpClientOptions)); private static IGenocsBuilder AddServiceClient( this IGenocsBuilder builder, diff --git a/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs b/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs index 680728ac..bcbdae00 100644 --- a/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs +++ b/src/Genocs.HTTP.RestEase/IRestEaseServiceBuilder.cs @@ -1,4 +1,4 @@ -using Genocs.HTTP.RestEase.Options; +using Genocs.HTTP.RestEase.Configurations; namespace Genocs.HTTP.RestEase; @@ -8,5 +8,5 @@ public interface IRestEaseServiceBuilder IRestEaseServiceBuilder WithScheme(string scheme); IRestEaseServiceBuilder WithHost(string host); IRestEaseServiceBuilder WithPort(int port); - RestEaseSettings.Service Build(); + RestEaseOptions.Service Build(); } \ No newline at end of file diff --git a/src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs b/src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs deleted file mode 100644 index 15353665..00000000 --- a/src/Genocs.HTTP.RestEase/IRestEaseSettingsBuilder.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Genocs.HTTP.RestEase.Options; - -namespace Genocs.HTTP.RestEase; - -public interface IRestEaseSettingsBuilder -{ - IRestEaseSettingsBuilder WithLoadBalancer(string loadBalancer); - IRestEaseSettingsBuilder WithService(Func buildService); - RestEaseSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.HTTP/Configurations/HttpClientSettings.cs b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs similarity index 81% rename from src/Genocs.HTTP/Configurations/HttpClientSettings.cs rename to src/Genocs.HTTP/Configurations/HttpClientOptions.cs index d7aac11a..1310bfaf 100644 --- a/src/Genocs.HTTP/Configurations/HttpClientSettings.cs +++ b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs @@ -5,6 +5,11 @@ namespace Genocs.HTTP.Configurations; /// public class HttpClientOptions { + /// + /// Default section name. + /// + public const string Position = "httpClient"; + /// /// It defines if set consul as service discovery or Fabio as load balancer. /// Allowed values are: consul, Fabio. @@ -20,11 +25,7 @@ public class HttpClientOptions /// It defines the list of services to be registered. /// public IDictionary? Services { get; set; } -<<<<<<<< HEAD:src/Genocs.HTTP/Configurations/HttpClientSettings.cs - public RequestMaskingSettings? RequestMasking { get; set; } -======== public RequestMaskingOptions? RequestMasking { get; set; } ->>>>>>>> 3b27e463fa91d72fe87473c7d6918114896433cd:src/Genocs.HTTP/Configurations/HttpClientOptions.cs public bool RemoveCharsetFromContentType { get; set; } public string? CorrelationContextHeader { get; set; } public string? CorrelationIdHeader { get; set; } diff --git a/src/Genocs.HTTP/Extensions.cs b/src/Genocs.HTTP/Extensions.cs index 85387b13..908bb7d1 100644 --- a/src/Genocs.HTTP/Extensions.cs +++ b/src/Genocs.HTTP/Extensions.cs @@ -38,7 +38,7 @@ public static IGenocsBuilder AddHttpClient( throw new ArgumentException("HTTP client name cannot be empty.", nameof(clientName)); } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); if (maskedRequestUrlParts is not null && options.RequestMasking is not null) { options.RequestMasking.UrlParts = maskedRequestUrlParts; diff --git a/src/Genocs.HTTP/GenocsHttpClient.cs b/src/Genocs.HTTP/GenocsHttpClient.cs index e5fd254d..63d02470 100644 --- a/src/Genocs.HTTP/GenocsHttpClient.cs +++ b/src/Genocs.HTTP/GenocsHttpClient.cs @@ -12,12 +12,12 @@ public class GenocsHttpClient : IHttpClient { private const string JsonContentType = "application/json"; private readonly HttpClient _client; - private readonly HttpClientSettings _settings; + private readonly HttpClientOptions _settings; private readonly IHttpClientSerializer _serializer; public GenocsHttpClient( HttpClient client, - HttpClientSettings settings, + HttpClientOptions settings, IHttpClientSerializer serializer, ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) diff --git a/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs b/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs index a4b34417..8ba7d583 100644 --- a/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs +++ b/src/Genocs.HTTP/GenocsHttpLoggingFilter.cs @@ -8,9 +8,9 @@ namespace Genocs.HTTP; internal sealed class GenocsHttpLoggingFilter : IHttpMessageHandlerBuilderFilter { private readonly ILoggerFactory _loggerFactory; - private readonly HttpClientSettings _options; + private readonly HttpClientOptions _options; - public GenocsHttpLoggingFilter(ILoggerFactory loggerFactory, HttpClientSettings options) + public GenocsHttpLoggingFilter(ILoggerFactory loggerFactory, HttpClientOptions options) { _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); _options = options; diff --git a/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs b/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs index b354aa41..0753c680 100644 --- a/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs +++ b/src/Genocs.HTTP/GenocsLoggingScopeHttpMessageHandler.cs @@ -10,7 +10,7 @@ internal sealed class GenocsLoggingScopeHttpMessageHandler : DelegatingHandler private readonly HashSet _maskedRequestUrlParts; private readonly string _maskTemplate; - public GenocsLoggingScopeHttpMessageHandler(ILogger logger, HttpClientSettings settings) + public GenocsLoggingScopeHttpMessageHandler(ILogger logger, HttpClientOptions settings) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _ = settings ?? throw new ArgumentNullException(nameof(settings)); diff --git a/src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs similarity index 76% rename from src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs rename to src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs index a1a8db29..559c03cb 100644 --- a/src/Genocs.LoadBalancing.Fabio/Builders/FabioSettingsBuilder.cs +++ b/src/Genocs.LoadBalancing.Fabio/Builders/FabioOptionsBuilder.cs @@ -5,16 +5,16 @@ namespace Genocs.LoadBalancing.Fabio.Builders; /// /// The Fabio options builder. /// -public class FabioSettingsBuilder : IFabioSettingsBuilder +public class FabioOptionsBuilder : IFabioOptionsBuilder { - private readonly FabioSettings _settings = new(); + private readonly FabioOptions _settings = new(); /// /// Enable or disable the Fabio load balancer. /// /// /// The option builder to be used for chain the build. - public IFabioSettingsBuilder Enable(bool enabled) + public IFabioOptionsBuilder Enable(bool enabled) { _settings.Enabled = enabled; return this; @@ -25,7 +25,7 @@ public IFabioSettingsBuilder Enable(bool enabled) /// /// The url. /// The option builder to be used for chain the build. - public IFabioSettingsBuilder WithUrl(string url) + public IFabioOptionsBuilder WithUrl(string url) { _settings.Url = url; return this; @@ -36,7 +36,7 @@ public IFabioSettingsBuilder WithUrl(string url) /// /// The service name /// The option builder to be used for chain the build. - public IFabioSettingsBuilder WithService(string service) + public IFabioOptionsBuilder WithService(string service) { _settings.Service = service; return this; @@ -46,5 +46,5 @@ public IFabioSettingsBuilder WithService(string service) /// Build the Fabio options. /// /// The Fabio options. - public FabioSettings Build() => _settings; + public FabioOptions Build() => _settings; } \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/Configurations/FabioSettings.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs similarity index 91% rename from src/Genocs.LoadBalancing.Fabio/Configurations/FabioSettings.cs rename to src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs index 3419e0a2..28803892 100644 --- a/src/Genocs.LoadBalancing.Fabio/Configurations/FabioSettings.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs @@ -3,7 +3,7 @@ namespace Genocs.LoadBalancing.Fabio.Configurations; /// /// The Fabio settings. /// -public class FabioSettings +public class FabioOptions { /// /// The default Fabio section name. @@ -11,7 +11,7 @@ public class FabioSettings public const string Position = "fabio"; /// - /// Gets or sets a value indicating whether this is enabled. + /// Gets or sets a value indicating whether this is enabled. /// public bool Enabled { get; set; } diff --git a/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioSettingsBuilder.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioOptionsBuilder.cs similarity index 68% rename from src/Genocs.LoadBalancing.Fabio/Configurations/IFabioSettingsBuilder.cs rename to src/Genocs.LoadBalancing.Fabio/Configurations/IFabioOptionsBuilder.cs index 14eb9d21..e0f711fe 100644 --- a/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioSettingsBuilder.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/IFabioOptionsBuilder.cs @@ -3,32 +3,32 @@ namespace Genocs.LoadBalancing.Fabio.Configurations; /// /// The Fabio options builder interface definition. /// -public interface IFabioSettingsBuilder +public interface IFabioOptionsBuilder { /// /// Enable or disable the Fabio load balancer. /// /// /// The option builder to be used for chain the build. - IFabioSettingsBuilder Enable(bool enabled); + IFabioOptionsBuilder Enable(bool enabled); /// /// Set the Fabio url. /// /// The url. /// The option builder to be used for chain the build. - IFabioSettingsBuilder WithUrl(string url); + IFabioOptionsBuilder WithUrl(string url); /// - /// Set the Fabio service name + /// Set the Fabio service name. /// /// The service name. - /// The option builder to be used for chain the build - IFabioSettingsBuilder WithService(string service); + /// The option builder to be used for chain the build. + IFabioOptionsBuilder WithService(string service); /// - /// Build the Fabio options + /// Build the Fabio options. /// - /// The Fabio options - FabioSettings Build(); + /// The Fabio options. + FabioOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.LoadBalancing.Fabio/Extensions.cs b/src/Genocs.LoadBalancing.Fabio/Extensions.cs index 01284147..ba3ded7a 100644 --- a/src/Genocs.LoadBalancing.Fabio/Extensions.cs +++ b/src/Genocs.LoadBalancing.Fabio/Extensions.cs @@ -16,8 +16,11 @@ public static class Extensions { private const string RegistryName = "loadBalancing.fabio"; - public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, string sectionName = FabioOptions.Position, - string consulSectionName = "consul", string httpClientSectionName = "httpClient") + public static IGenocsBuilder AddFabio( + this IGenocsBuilder builder, + string sectionName = FabioOptions.Position, + string consulSectionName = ConsulOptions.Position, + string httpClientSectionName = HttpClientOptions.Position) { if (string.IsNullOrWhiteSpace(sectionName)) { @@ -27,16 +30,19 @@ public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, string sectio var fabioOptions = builder.GetOptions(sectionName); var consulOptions = builder.GetOptions(consulSectionName); var httpClientOptions = builder.GetOptions(httpClientSectionName); - return builder.AddFabio(fabioOptions, httpClientOptions, - b => b.AddConsul(consulOptions, httpClientOptions)); + + return builder.AddFabio( + fabioOptions, + httpClientOptions, + b => b.AddConsul(consulOptions, httpClientOptions)); } public static IGenocsBuilder AddFabio(this IGenocsBuilder builder, - Func buildOptions, - Func buildConsulOptions, - HttpClientSettings httpClientOptions) + Func buildOptions, + Func buildConsulOptions, + HttpClientOptions httpClientOptions) { - var fabioOptions = buildOptions(new FabioSettingsBuilder()).Build(); + var fabioOptions = buildOptions(new FabioOptionsBuilder()).Build(); return builder.AddFabio(fabioOptions, httpClientOptions, b => b.AddConsul(buildConsulOptions, httpClientOptions)); } diff --git a/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs b/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs index 4415fef0..f3517a66 100644 --- a/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs +++ b/src/Genocs.LoadBalancing.Fabio/Http/FabioHttpClient.cs @@ -7,7 +7,7 @@ internal sealed class FabioHttpClient : GenocsHttpClient, IFabioHttpClient { public FabioHttpClient( HttpClient client, - HttpClientSettings options, + HttpClientOptions options, IHttpClientSerializer serializer, ICorrelationContextFactory correlationContextFactory, ICorrelationIdFactory correlationIdFactory) diff --git a/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs b/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs index f9382130..a7304722 100644 --- a/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs +++ b/src/Genocs.LoadBalancing.Fabio/MessageHandlers/FabioMessageHandler.cs @@ -4,10 +4,10 @@ namespace Genocs.LoadBalancing.Fabio.MessageHandlers; internal sealed class FabioMessageHandler : DelegatingHandler { - private readonly FabioSettings _settings; + private readonly FabioOptions _settings; private readonly string _servicePath; - public FabioMessageHandler(FabioSettings settings, string? serviceName = null) + public FabioMessageHandler(FabioOptions settings, string? serviceName = null) { if (string.IsNullOrWhiteSpace(settings.Url)) { diff --git a/src/Genocs.Logging/Configurations/AzureSettings.cs b/src/Genocs.Logging/Configurations/AzureOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/AzureSettings.cs rename to src/Genocs.Logging/Configurations/AzureOptions.cs diff --git a/src/Genocs.Logging/Configurations/ConsoleSettings.cs b/src/Genocs.Logging/Configurations/ConsoleOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/ConsoleSettings.cs rename to src/Genocs.Logging/Configurations/ConsoleOptions.cs diff --git a/src/Genocs.Logging/Configurations/ElkSettings.cs b/src/Genocs.Logging/Configurations/ElkOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/ElkSettings.cs rename to src/Genocs.Logging/Configurations/ElkOptions.cs diff --git a/src/Genocs.Logging/Configurations/LocalFileSettings.cs b/src/Genocs.Logging/Configurations/LocalFileOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/LocalFileSettings.cs rename to src/Genocs.Logging/Configurations/LocalFileOptions.cs diff --git a/src/Genocs.Logging/Configurations/LoggerSettings.cs b/src/Genocs.Logging/Configurations/LoggerOptions.cs similarity index 86% rename from src/Genocs.Logging/Configurations/LoggerSettings.cs rename to src/Genocs.Logging/Configurations/LoggerOptions.cs index aebbd380..087f9da8 100644 --- a/src/Genocs.Logging/Configurations/LoggerSettings.cs +++ b/src/Genocs.Logging/Configurations/LoggerOptions.cs @@ -1,8 +1,4 @@ namespace Genocs.Logging.Configurations; -<<<<<<<< HEAD:src/Genocs.Logging/Configurations/LoggerSettings.cs - -======== ->>>>>>>> 3b27e463fa91d72fe87473c7d6918114896433cd:src/Genocs.Logging/Configurations/LoggerOptions.cs /// /// Logger Settings. diff --git a/src/Genocs.Logging/Configurations/LokiSettings.cs b/src/Genocs.Logging/Configurations/LokiOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/LokiSettings.cs rename to src/Genocs.Logging/Configurations/LokiOptions.cs diff --git a/src/Genocs.Logging/Configurations/MongoSettings.cs b/src/Genocs.Logging/Configurations/MongoOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/MongoSettings.cs rename to src/Genocs.Logging/Configurations/MongoOptions.cs diff --git a/src/Genocs.Logging/Configurations/SeqSettings.cs b/src/Genocs.Logging/Configurations/SeqOptions.cs similarity index 100% rename from src/Genocs.Logging/Configurations/SeqSettings.cs rename to src/Genocs.Logging/Configurations/SeqOptions.cs diff --git a/src/Genocs.Logging/Extensions.cs b/src/Genocs.Logging/Extensions.cs index 0ba7ec8c..41997920 100644 --- a/src/Genocs.Logging/Extensions.cs +++ b/src/Genocs.Logging/Extensions.cs @@ -23,24 +23,24 @@ public static class Extensions public static IHostBuilder UseLogging( this IHostBuilder hostBuilder, Action? configure = null, - string? loggerSectionName = LoggerSettings.Position, - string? appSectionName = AppSettings.Position) + string? loggerSectionName = LoggerOptions.Position, + string? appSectionName = AppOptions.Position) => hostBuilder .ConfigureServices(services => services.AddSingleton()) .UseSerilog((context, loggerConfiguration) => { if (string.IsNullOrWhiteSpace(loggerSectionName)) { - loggerSectionName = LoggerSettings.Position; + loggerSectionName = LoggerOptions.Position; } if (string.IsNullOrWhiteSpace(appSectionName)) { - appSectionName = AppSettings.Position; + appSectionName = AppOptions.Position; } - var loggerOptions = context.Configuration.GetOptions(loggerSectionName); - var appOptions = context.Configuration.GetOptions(appSectionName); + var loggerOptions = context.Configuration.GetOptions(loggerSectionName); + var appOptions = context.Configuration.GetOptions(appSectionName); MapOptions(loggerOptions, appOptions, loggerConfiguration, context.HostingEnvironment.EnvironmentName); configure?.Invoke(context, loggerConfiguration); @@ -52,8 +52,8 @@ public static IEndpointConventionBuilder MapLogLevelHandler( => builder.MapPost(endpointRoute, LevelSwitch); private static void MapOptions( - LoggerSettings loggerOptions, - AppSettings appOptions, + LoggerOptions loggerOptions, + AppOptions appOptions, LoggerConfiguration loggerConfiguration, string environmentName) { @@ -86,14 +86,14 @@ private static void MapOptions( Configure(loggerConfiguration, loggerOptions); } - private static void Configure(LoggerConfiguration loggerConfiguration, LoggerSettings options) + private static void Configure(LoggerConfiguration loggerConfiguration, LoggerOptions options) { - var consoleOptions = options.Console ?? new ConsoleSettings(); - var fileOptions = options.File ?? new LocalFileSettings(); - var elkOptions = options.Elk ?? new ElkSettings(); - var seqOptions = options.Seq ?? new SeqSettings(); - var lokiOptions = options.Loki ?? new LokiSettings(); - var azureOptions = options.Azure ?? new AzureSettings(); + var consoleOptions = options.Console ?? new ConsoleOptions(); + var fileOptions = options.File ?? new LocalFileOptions(); + var elkOptions = options.Elk ?? new ElkOptions(); + var seqOptions = options.Seq ?? new SeqOptions(); + var lokiOptions = options.Loki ?? new LokiOptions(); + var azureOptions = options.Azure ?? new AzureOptions(); // console if (consoleOptions.Enabled) diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs index 779c376b..f6a04267 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoMessageOutbox.cs @@ -11,6 +11,8 @@ namespace Genocs.MessageBrokers.Outbox.MongoDB.Internals; internal sealed class MongoMessageOutbox : IMessageOutbox, IMessageOutboxAccessor { + private const string EmptyJsonObject = "{}"; + private static readonly JsonSerializerOptions SerializerOptions = new() { PropertyNameCaseInsensitive = true, @@ -19,7 +21,6 @@ internal sealed class MongoMessageOutbox : IMessageOutbox, IMessageOutboxAccesso Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } }; - private const string EmptyJsonObject = "{}"; private readonly IMongoSessionFactory _sessionFactory; private readonly IMongoRepository _inboxRepository; private readonly IMongoRepository _outboxRepository; @@ -31,7 +32,7 @@ internal sealed class MongoMessageOutbox : IMessageOutbox, IMessageOutboxAccesso public MongoMessageOutbox(IMongoSessionFactory sessionFactory, IMongoRepository inboxRepository, IMongoRepository outboxRepository, - OutboxSettings options, ILogger logger) + OutboxOptions options, ILogger logger) { _sessionFactory = sessionFactory; _inboxRepository = inboxRepository; diff --git a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs index ff0560f9..2fd0ea9d 100644 --- a/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs +++ b/src/Genocs.MessageBrokers.Outbox.MongoDB/Internals/MongoOutboxInitializer.cs @@ -8,9 +8,9 @@ namespace Genocs.MessageBrokers.Outbox.MongoDB.Internals; internal sealed class MongoOutboxInitializer : IInitializer { private readonly IMongoDatabase _database; - private readonly OutboxSettings _options; + private readonly OutboxOptions _options; - public MongoOutboxInitializer(IMongoDatabase database, OutboxSettings options) + public MongoOutboxInitializer(IMongoDatabase database, OutboxOptions options) { _database = database; _options = options; diff --git a/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxSettings.cs b/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxOptions.cs similarity index 93% rename from src/Genocs.MessageBrokers.Outbox/Configurations/OutboxSettings.cs rename to src/Genocs.MessageBrokers.Outbox/Configurations/OutboxOptions.cs index 52af1f3e..da6aaec7 100644 --- a/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxSettings.cs +++ b/src/Genocs.MessageBrokers.Outbox/Configurations/OutboxOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.MessageBrokers.Outbox.Configurations; -public class OutboxSettings +public class OutboxOptions { public bool Enabled { get; set; } public int Expiry { get; set; } diff --git a/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs b/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs index b03c9cfa..c5db113f 100644 --- a/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs +++ b/src/Genocs.MessageBrokers.Outbox/Configurators/MessageOutboxConfigurator.cs @@ -6,9 +6,9 @@ namespace Genocs.MessageBrokers.Outbox.Configurators; internal sealed class MessageOutboxConfigurator : IMessageOutboxConfigurator { public IGenocsBuilder Builder { get; } - public OutboxSettings Options { get; } + public OutboxOptions Options { get; } - public MessageOutboxConfigurator(IGenocsBuilder builder, OutboxSettings options) + public MessageOutboxConfigurator(IGenocsBuilder builder, OutboxOptions options) { Builder = builder; Options = options; diff --git a/src/Genocs.MessageBrokers.Outbox/Extensions.cs b/src/Genocs.MessageBrokers.Outbox/Extensions.cs index 330fe6e9..2a966f11 100644 --- a/src/Genocs.MessageBrokers.Outbox/Extensions.cs +++ b/src/Genocs.MessageBrokers.Outbox/Extensions.cs @@ -27,7 +27,7 @@ public static IGenocsBuilder AddMessageOutbox( return builder; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); builder.Services.AddSingleton(options); var configurator = new MessageOutboxConfigurator(builder, options); diff --git a/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs b/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs index 7ddbb1e9..ddf94a6f 100644 --- a/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs +++ b/src/Genocs.MessageBrokers.Outbox/IMessageOutboxConfigurator.cs @@ -6,5 +6,5 @@ namespace Genocs.MessageBrokers.Outbox; public interface IMessageOutboxConfigurator { IGenocsBuilder Builder { get; } - OutboxSettings Options { get; } + OutboxOptions Options { get; } } \ No newline at end of file diff --git a/src/Genocs.MessageBrokers.Outbox/Messages/OutboxMessage.cs b/src/Genocs.MessageBrokers.Outbox/Messages/OutboxMessage.cs index 5d0f2e16..6c4ce817 100644 --- a/src/Genocs.MessageBrokers.Outbox/Messages/OutboxMessage.cs +++ b/src/Genocs.MessageBrokers.Outbox/Messages/OutboxMessage.cs @@ -11,8 +11,8 @@ public sealed class OutboxMessage : IIdentifiable public Dictionary Headers { get; set; } = new(); public string MessageType { get; set; } public string MessageContextType { get; set; } - public object Message { get; set; } - public object MessageContext { get; set; } + public object? Message { get; set; } + public object? MessageContext { get; set; } public string SerializedMessage { get; set; } public string SerializedMessageContext { get; set; } public DateTime SentAt { get; set; } diff --git a/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs b/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs index eee56670..82624406 100644 --- a/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs +++ b/src/Genocs.MessageBrokers.Outbox/Outbox/InMemoryMessageOutbox.cs @@ -14,7 +14,7 @@ internal sealed class InMemoryMessageOutbox : IMessageOutbox, IMessageOutboxAcce private readonly ILogger _logger; private readonly int _expiry; - public InMemoryMessageOutbox(OutboxSettings options, ILogger logger) + public InMemoryMessageOutbox(OutboxOptions options, ILogger logger) { _logger = logger; _expiry = options.Expiry; diff --git a/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs b/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs index 9e789cc8..a9799d06 100644 --- a/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs +++ b/src/Genocs.MessageBrokers.Outbox/Processors/OutboxProcessor.cs @@ -10,13 +10,13 @@ internal sealed class OutboxProcessor : IHostedService { private readonly IServiceProvider _serviceProvider; private readonly IBusPublisher _publisher; - private readonly OutboxSettings _options; + private readonly OutboxOptions _options; private readonly ILogger _logger; private readonly TimeSpan _interval; private readonly OutboxType _type; private Timer _timer; - public OutboxProcessor(IServiceProvider serviceProvider, IBusPublisher publisher, OutboxSettings options, + public OutboxProcessor(IServiceProvider serviceProvider, IBusPublisher publisher, OutboxOptions options, ILogger logger) { if (options.Enabled && options.IntervalMilliseconds <= 0) diff --git a/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs index 1114bfc1..44dca3e8 100644 --- a/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs +++ b/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs @@ -4,56 +4,56 @@ namespace Genocs.Metrics.AppMetrics.Builders; internal sealed class MetricsSettingsBuilder : IMetricsSettingsBuilder { - private readonly MetricsSettings _options = new(); + private readonly MetricsSettings _settings = new(); public IMetricsSettingsBuilder Enable(bool enabled) { - _options.Enabled = enabled; + _settings.Enabled = enabled; return this; } public IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled) { - _options.InfluxEnabled = influxEnabled; + _settings.InfluxEnabled = influxEnabled; return this; } public IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled) { - _options.PrometheusEnabled = prometheusEnabled; + _settings.PrometheusEnabled = prometheusEnabled; return this; } public IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter) { - _options.PrometheusFormatter = prometheusFormatter; + _settings.PrometheusFormatter = prometheusFormatter; return this; } public IMetricsSettingsBuilder WithInfluxUrl(string influxUrl) { - _options.InfluxUrl = influxUrl; + _settings.InfluxUrl = influxUrl; return this; } public IMetricsSettingsBuilder WithDatabase(string database) { - _options.Database = database; + _settings.Database = database; return this; } public IMetricsSettingsBuilder WithInterval(int interval) { - _options.Interval = interval; + _settings.Interval = interval; return this; } public IMetricsSettingsBuilder WithTags(IDictionary tags) { - _options.Tags = tags; + _settings.Tags = tags; return this; } public MetricsSettings Build() - => _options; + => _settings; } \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Extensions.cs b/src/Genocs.Metrics/AppMetrics/Extensions.cs index 06801cd2..292e0c13 100644 --- a/src/Genocs.Metrics/AppMetrics/Extensions.cs +++ b/src/Genocs.Metrics/AppMetrics/Extensions.cs @@ -40,7 +40,7 @@ public static IGenocsBuilder AddMetrics( appSectionName = AppOptions.Position; } - var metricsOptions = builder.GetOptions(metricsSectionName); + var metricsOptions = builder.GetOptions(metricsSectionName); var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); @@ -58,7 +58,7 @@ public static IGenocsBuilder AddMetrics( } var metricsOptions = buildOptions(new MetricsSettingsBuilder()).Build(); - var appOptions = builder.GetOptions(appSectionName); + var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); } @@ -66,7 +66,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's and IIS ServerOptions AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - Configurations.MetricsOptions metricsSettings, + Configurations.MetricsSettings metricsSettings, AppOptions appSettings) { builder.Services.AddSingleton(metricsSettings); @@ -161,7 +161,7 @@ public static IApplicationBuilder UseMetrics(this IApplicationBuilder app) .UseMetricsAllMiddleware(); } - private static MetricsWebHostOptions GetMetricsWebHostOptions(Configurations.MetricsOptions metricsOptions) + private static MetricsWebHostOptions GetMetricsWebHostOptions(MetricsSettings metricsOptions) { var options = new MetricsWebHostOptions(); diff --git a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs new file mode 100644 index 00000000..70db85df --- /dev/null +++ b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs @@ -0,0 +1,69 @@ +namespace Genocs.Persistence.MongoDb.Configurations; + +/// +/// MongoDb encryption database Settings. +/// +public class MongoDbEncryptionOptions +{ + + /// + /// Default Section name. + /// + public const string Position = "MongoDbEncryption"; + + /// + /// The Database connection string. + /// + public string ConnectionString { get; set; } = default!; + + /// + /// The shared library used to encrypt. + /// + public string LibPath { get; set; } = default!; + + /// + /// Azure Tenant Id. + /// + public string TenantId { get; set; } = default!; + + /// + /// Azure Client Id. + /// + public string ClientId { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string ClientSecret { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string KeyName { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string KeyVersion { get; set; } = default!; + + /// + /// Azure Client Secret. + /// + public string KeyVaultEndpoint { get; set; } = default!; + + /// + /// Check if the MongoDbSettings object contains valid data. + /// + /// MongoDbSettings object. + /// return true if valid otherwise false. + public static bool IsValid(MongoDbEncryptionOptions settings) + { + if (settings is null) return false; + + if (string.IsNullOrWhiteSpace(settings.ConnectionString)) return false; + if (string.IsNullOrWhiteSpace(settings.LibPath)) return false; + + return true; + + } +} diff --git a/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs b/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs index ff2f2be8..eb5222e5 100644 --- a/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs +++ b/src/Genocs.Persistence.MongoDb/Encryptions/AzureInitializer.cs @@ -15,11 +15,11 @@ public class AzureInitializer /// Setup the client /// /// - public AutoEncryptionOptions EncryptionOptions(IOptions options) + public AutoEncryptionOptions EncryptionOptions(IOptions options) { // Ge settings - MongoDbEncryptionSettings settings = options.Value; - MongoDbEncryptionSettings.IsValid(settings); + MongoDbEncryptionOptions settings = options.Value; + MongoDbEncryptionOptions.IsValid(settings); // start-kmsproviders var kmsProviders = new Dictionary>(); diff --git a/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs b/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs index 693a8339..06d4b5a4 100644 --- a/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs +++ b/src/Genocs.Persistence.MongoDb/Extensions/MongoDbExtensions.cs @@ -34,16 +34,16 @@ public static class MongoDbExtensions /// The Genocs builder. public static IGenocsBuilder AddMongo( this IGenocsBuilder builder, - string sectionName = MongoDbSettings.Position, + string sectionName = MongoDbOptions.Position, Type? seederType = null, bool registerConventions = true) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = MongoDbSettings.Position; + sectionName = MongoDbOptions.Position; } - var mongoOptions = builder.GetOptions(sectionName); + var mongoOptions = builder.GetOptions(sectionName); return builder.AddMongo(mongoOptions, seederType, registerConventions); } @@ -70,32 +70,32 @@ public static IGenocsBuilder AddMongo( /// Setup MongoDb support. /// /// The Genocs builder. - /// The settings. + /// The settings. /// /// /// The Genocs builder. public static IGenocsBuilder AddMongo( this IGenocsBuilder builder, - MongoDbSettings mongoOptions, + MongoDbOptions options, Type? seederType = null, bool registerConventions = true) { - if (!builder.TryRegister(MongoDbSettings.Position)) + if (!builder.TryRegister(MongoDbOptions.Position)) { return builder; } - if (mongoOptions.SetRandomDatabaseSuffix) + if (options.SetRandomDatabaseSuffix) { string suffix = $"{Guid.NewGuid():N}"; Console.WriteLine($"Setting a random MongoDB database suffix: '{suffix}'."); - mongoOptions.Database = $"{mongoOptions.Database}_{suffix}"; + options.Database = $"{options.Database}_{suffix}"; } - builder.Services.AddSingleton(mongoOptions); + builder.Services.AddSingleton(options); builder.Services.AddSingleton(sp => { - var options = sp.GetRequiredService(); + var options = sp.GetRequiredService(); MongoClientSettings clientSettings = MongoClientSettings.FromConnectionString(options.ConnectionString); @@ -109,7 +109,7 @@ public static IGenocsBuilder AddMongo( builder.Services.AddTransient(sp => { - var options = sp.GetRequiredService(); + var options = sp.GetRequiredService(); var client = sp.GetRequiredService(); return client.GetDatabase(options.Database); }); @@ -168,13 +168,13 @@ public static IGenocsBuilder AddMongoRepository( /// The Genocs builder. public static IGenocsBuilder AddMongoFast( this IGenocsBuilder builder, - string sectionName = MongoDbSettings.Position, + string sectionName = MongoDbOptions.Position, bool registerConventions = true) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = MongoDbSettings.Position; + sectionName = MongoDbOptions.Position; } var section = builder.Configuration.GetSection(sectionName); @@ -184,7 +184,7 @@ public static IGenocsBuilder AddMongoFast( return builder; } - builder.Services.Configure(section); + builder.Services.Configure(section); builder.Services.AddSingleton(); builder.Services.AddScoped(typeof(IMongoDbRepository<>), typeof(MongoDbRepository<>)); diff --git a/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs b/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs index f917c935..dd60928e 100644 --- a/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs +++ b/src/Genocs.Persistence.MongoDb/Initializers/MongoDbInitializer.cs @@ -11,7 +11,7 @@ internal sealed class MongoDbInitializer : IMongoDbInitializer private readonly IMongoDatabase _database; private readonly IMongoDbSeeder _seeder; - public MongoDbInitializer(IMongoDatabase database, IMongoDbSeeder seeder, MongoDbSettings options) + public MongoDbInitializer(IMongoDatabase database, IMongoDbSeeder seeder, MongoDbOptions options) { _database = database; _seeder = seeder; diff --git a/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs b/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs deleted file mode 100644 index bcd5ce69..00000000 --- a/src/Genocs.Persistence.MongoDb/Repositories/IMongoDbOptionsBuilder.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Genocs.Persistence.MongoDb.Configurations; - -namespace Genocs.Persistence.MongoDb.Repositories; - -/// -/// The MongoDB Options Builder. -/// -public interface IMongoDbOptionsBuilder -{ - /// - /// Setup the Connection string. - /// - /// - /// - IMongoDbOptionsBuilder WithConnectionString(string connectionString); - - /// - /// Setup the Database name. - /// - /// - /// - IMongoDbOptionsBuilder WithDatabase(string database); - - /// - /// Setup the database Seed. - /// - /// - /// - IMongoDbOptionsBuilder WithSeed(bool seed); - - /// - /// Get the settings. - /// - /// MongoDbSettings instance. - MongoDbSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs index fccbe0b5..907cf7de 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs +++ b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs @@ -15,7 +15,8 @@ namespace Genocs.Secrets.AzureKeyVault; public static class Extensions { /// - /// UseVault. + /// This method is used to add the Azure Key Vault to the Host builder. + /// You can use the Azure Key Vault to store and manage application secrets. /// /// The builder. /// The section name. @@ -56,8 +57,7 @@ public static IWebHostBuilder UseAzureKeyVault( string sectionName = AzureKeyVaultSettings.Position) => builder.ConfigureAppConfiguration((ctx, cfg) => { - var settings = new AzureKeyVaultSettings(); - ctx.Configuration.GetSection(sectionName).Bind(settings); + AzureKeyVaultSettings settings = ctx.Configuration.GetOptions(sectionName); if (!settings.Enabled) { return; @@ -74,8 +74,7 @@ public static IWebHostBuilder UseAzureKeyVault( public static WebApplicationBuilder UseAzureKeyVault(this WebApplicationBuilder builder) { - var settings = new AzureKeyVaultSettings(); - builder.Configuration.GetSection(AzureKeyVaultSettings.Position).Bind(settings); + AzureKeyVaultSettings settings = builder.Configuration.GetOptions(AzureKeyVaultSettings.Position); if (!settings.Enabled) { return builder; diff --git a/src/Genocs.Secrets.Vault/Extensions.cs b/src/Genocs.Secrets.Vault/Extensions.cs index b3bcb999..166aa19e 100644 --- a/src/Genocs.Secrets.Vault/Extensions.cs +++ b/src/Genocs.Secrets.Vault/Extensions.cs @@ -39,7 +39,7 @@ public static IHostBuilder UseVault( .ConfigureAppConfiguration((ctx, cfg) => { // TODO Test - VaultSettings options = ctx.Configuration.GetOptions(sectionName); + VaultOptions options = ctx.Configuration.GetOptions(sectionName); if (!options.Enabled) { return; @@ -49,7 +49,7 @@ public static IHostBuilder UseVault( }); /// - /// UseVault + /// UseVault. /// /// /// @@ -63,8 +63,7 @@ public static IWebHostBuilder UseVault( .ConfigureAppConfiguration((ctx, cfg) => { // TODO Test - var options = new VaultSettings(); - ctx.Configuration.GetSection(sectionName).Bind(options); + VaultOptions options = ctx.Configuration.GetOptions(sectionName); if (!options.Enabled) { return; @@ -86,8 +85,7 @@ private static IServiceCollection AddVault(this IServiceCollection services, str configuration = serviceProvider.GetRequiredService(); } - var options = new VaultSettings(); - configuration.GetSection(sectionName).Bind(options); + VaultOptions options = configuration.GetOptions(sectionName); if (!options.Enabled) { return services; @@ -114,13 +112,13 @@ private static IServiceCollection AddVault(this IServiceCollection services, str return services; } - private static void VerifyOptions(VaultSettings options) + private static void VerifyOptions(VaultOptions options) { if (options.Kv is null) { if (!string.IsNullOrWhiteSpace(options.Key)) { - options.Kv = new VaultSettings.KeyValueSettings + options.Kv = new VaultOptions.KeyValueOptions { Enabled = options.Enabled, Path = options.Key @@ -143,7 +141,7 @@ private static void VerifyOptions(VaultSettings options) private static async Task AddVaultAsync( this IConfigurationBuilder builder, - VaultSettings options, + VaultOptions options, string? keyValuePath) { VerifyOptions(options); @@ -194,7 +192,7 @@ private static async Task AddVaultAsync( private static Task InitLeaseAsync( string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) => options.Type.ToLowerInvariant() switch { @@ -209,7 +207,7 @@ private static Task InitLeaseAsync( private static async Task SetActiveDirectorySecretsAsync( string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.ActiveDirectory; @@ -225,7 +223,7 @@ private static async Task SetActiveDirectorySecretsAsync( } private static async Task SetAzureSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.Azure; @@ -240,7 +238,7 @@ private static async Task SetAzureSecretsAsync(string key, IVaultClient client, } private static async Task SetConsulSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.Consul; @@ -254,7 +252,7 @@ private static async Task SetConsulSecretsAsync(string key, IVaultClient client, } private static async Task SetDatabaseSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.Database; @@ -268,7 +266,7 @@ private static async Task SetDatabaseSecretsAsync(string key, IVaultClient clien }, credentials.LeaseId, credentials.LeaseDurationSeconds, credentials.Renewable)); } - private static async Task SetPkiSecretsAsync(IVaultClient client, VaultSettings options) + private static async Task SetPkiSecretsAsync(IVaultClient client, VaultOptions options) { var issuer = new CertificatesIssuer(client, options); var certificate = await issuer.IssueAsync(); @@ -276,7 +274,7 @@ private static async Task SetPkiSecretsAsync(IVaultClient client, VaultSettings } private static async Task SetRabbitMqSecretsAsync(string key, IVaultClient client, - VaultSettings.LeaseSettings options, + VaultOptions.LeaseOptions options, IDictionary configuration) { const string name = SecretsEngineMountPoints.Defaults.RabbitMQ; @@ -290,7 +288,7 @@ private static async Task SetRabbitMqSecretsAsync(string key, IVaultClient clien }, credentials.LeaseId, credentials.LeaseDurationSeconds, credentials.Renewable)); } - private static void SetSecrets(string key, VaultSettings.LeaseSettings options, + private static void SetSecrets(string key, VaultOptions.LeaseOptions options, IDictionary configuration, string name, Func<(object, Dictionary, string, int, bool)> lease) { @@ -301,7 +299,7 @@ private static void SetSecrets(string key, VaultSettings.LeaseSettings options, LeaseService.Set(key, leaseData); } - private static (IVaultClient client, VaultClientSettings settings) GetClientAndSettings(VaultSettings options) + private static (IVaultClient client, VaultClientSettings settings) GetClientAndSettings(VaultOptions options) { var settings = new VaultClientSettings(options.Url, GetAuthMethod(options)); var client = new VaultClient(settings); @@ -309,7 +307,7 @@ private static (IVaultClient client, VaultClientSettings settings) GetClientAndS return (client, settings); } - private static void SetTemplates(string key, VaultSettings.LeaseSettings lease, + private static void SetTemplates(string key, VaultOptions.LeaseOptions lease, IDictionary configuration, IDictionary values) { if (lease.Templates is null || !lease.Templates.Any()) @@ -331,7 +329,7 @@ private static void SetTemplates(string key, VaultSettings.LeaseSettings lease, } } - private static IAuthMethodInfo GetAuthMethod(VaultSettings options) + private static IAuthMethodInfo GetAuthMethod(VaultOptions options) => options.AuthType?.ToLowerInvariant() switch { "token" => new TokenAuthMethodInfo(options.Token), diff --git a/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs b/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs index 4ba695fd..3ccf06e6 100644 --- a/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs +++ b/src/Genocs.Secrets.Vault/Internals/VaultHostedService.cs @@ -11,7 +11,7 @@ internal sealed class VaultHostedService : BackgroundService private readonly ILeaseService _leaseService; private readonly ICertificatesIssuer _certificatesIssuer; private readonly ICertificatesService _certificatesService; - private readonly VaultSettings _settings; + private readonly VaultOptions _settings; private readonly ILogger _logger; private readonly int _interval; @@ -20,7 +20,7 @@ public VaultHostedService( ILeaseService leaseService, ICertificatesIssuer certificatesIssuer, ICertificatesService certificatesService, - VaultSettings settings, + VaultOptions settings, ILogger logger) { _client = client; diff --git a/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs b/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs index 52a4864a..24036299 100644 --- a/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs +++ b/src/Genocs.WebApi.CQRS/Builders/DispatcherEndpointsBuilder.cs @@ -15,20 +15,28 @@ public DispatcherEndpointsBuilder(IEndpointsBuilder builder) _builder = builder; } - public IDispatcherEndpointsBuilder Get(string path, Func? context = null, - Action? endpoint = null, bool auth = false, string? roles = null, - params string[] policies) + public IDispatcherEndpointsBuilder Get( + string path, + Func? context = null, + Action? endpoint = null, + bool auth = false, + string? roles = null, + params string[] policies) { _builder.Get(path, context, endpoint, auth, roles, policies); return this; } - public IDispatcherEndpointsBuilder Get(string path, - Func? beforeDispatch = null, - Func? afterDispatch = null, - Action? endpoint = null, bool auth = false, string? roles = null, - params string[] policies) where TQuery : class, IQuery + public IDispatcherEndpointsBuilder Get( + string path, + Func? beforeDispatch = null, + Func? afterDispatch = null, + Action? endpoint = null, + bool auth = false, + string? roles = null, + params string[] policies) + where TQuery : class, IQuery { _builder.Get(path, async (query, ctx) => { diff --git a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj index f3664774..4c964e2c 100644 --- a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj +++ b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj @@ -61,4 +61,8 @@ + + + + diff --git a/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs deleted file mode 100644 index 7c34637a..00000000 --- a/src/Genocs.WebApi.Swagger/Docs/Builders/SwaggerOptionsBuilder.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Genocs.WebApi.Swagger.Docs.Configurations; - -namespace Genocs.WebApi.Swagger.Docs.Builders; - -internal sealed class SwaggerOptionsBuilder : ISwaggerOptionsBuilder -{ - private readonly SwaggerSettings _options = new(); - - public ISwaggerOptionsBuilder Enable(bool enabled) - { - _options.Enabled = enabled; - return this; - } - - public ISwaggerOptionsBuilder ReDocEnable(bool reDocEnabled) - { - _options.ReDocEnabled = reDocEnabled; - return this; - } - - public ISwaggerOptionsBuilder WithName(string name) - { - _options.Name = name; - return this; - } - - public ISwaggerOptionsBuilder WithTitle(string title) - { - _options.Title = title; - return this; - } - - public ISwaggerOptionsBuilder WithVersion(string version) - { - _options.Version = version; - return this; - } - - public ISwaggerOptionsBuilder WithRoutePrefix(string routePrefix) - { - _options.RoutePrefix = routePrefix; - return this; - } - - public ISwaggerOptionsBuilder IncludeSecurity(bool includeSecurity) - { - _options.IncludeSecurity = includeSecurity; - return this; - } - - public ISwaggerOptionsBuilder SerializeAsOpenApiV2(bool serializeAsOpenApiV2) - { - _options.SerializeAsOpenApiV2 = serializeAsOpenApiV2; - return this; - } - - public SwaggerSettings Build() => _options; -} \ No newline at end of file diff --git a/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs index e500e9e7..64c1b28b 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs @@ -1,5 +1,4 @@ namespace Genocs.WebApi.Swagger.Docs.Configurations; - public interface ISwaggerOptionsBuilder { ISwaggerOptionsBuilder Enable(bool enabled); diff --git a/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs b/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs similarity index 51% rename from src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs rename to src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs index 113498cc..af2f8db1 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Options/MessagingSettings.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs @@ -1,11 +1,13 @@ -namespace Genocs.APIGateway.Options; +namespace Genocs.APIGateway.Configurations; -internal class MessagingSettings +internal class MessagingOptions { + public const string Position = "messaging"; + public bool Enabled { get; set; } - public IEnumerable? Endpoints { get; set; } + public IEnumerable? Endpoints { get; set; } - internal class EndpointSettings + internal class EndpointOptions { public string? Method { get; set; } public string? Path { get; set; } diff --git a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs index 5575cb06..d9665a2b 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Framework/MessagingMiddleware.cs @@ -1,4 +1,4 @@ -using Genocs.APIGateway.Options; +using Genocs.APIGateway.Configurations; using Genocs.MessageBrokers.RabbitMQ; using Genocs.MessageBrokers.RabbitMQ.Conventions; using Microsoft.Extensions.Options; @@ -16,7 +16,7 @@ internal class MessagingMiddleware : IMiddleware private readonly ITracer _tracer; private readonly ICorrelationContextBuilder _correlationContextBuilder; private readonly CorrelationIdFactory _correlationIdFactory; - private readonly IDictionary> _endpoints; + private readonly IDictionary> _endpoints; public MessagingMiddleware( IRabbitMQClient rabbitMQClient, @@ -24,7 +24,7 @@ public MessagingMiddleware( ITracer tracer, ICorrelationContextBuilder correlationContextBuilder, CorrelationIdFactory correlationIdFactory, - IOptions messagingOptions) + IOptions messagingOptions) { if (messagingOptions is null) { @@ -39,7 +39,7 @@ public MessagingMiddleware( _endpoints = messagingOptions.Value.Endpoints?.Any() is true ? messagingOptions.Value.Endpoints.GroupBy(e => e.Method.ToUpperInvariant()) .ToDictionary(e => e.Key, e => e.ToList()) - : new Dictionary>(); + : new Dictionary>(); } public async Task InvokeAsync(HttpContext context, RequestDelegate next) diff --git a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs index 3c29680f..8810e46a 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Startup.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Startup.cs @@ -1,5 +1,5 @@ +using Genocs.APIGateway.Configurations; using Genocs.APIGateway.Framework; -using Genocs.APIGateway.Options; using Genocs.Auth; using Genocs.Common.Configurations; using Genocs.Core.Builders; @@ -32,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.Configure(Configuration.GetSection("messaging")); + services.Configure(Configuration.GetSection(MessagingOptions.Position)); services.AddReverseProxy() .LoadFromConfig(Configuration.GetSection("ReverseProxy")); services.AddSingleton(); @@ -90,7 +90,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { endpoints.MapGet("/", async context => { - await context.Response.WriteAsync(context.RequestServices.GetService()?.Name ?? "Service"); + await context.Response.WriteAsync(context.RequestServices.GetService()?.Name ?? "Service"); }); endpoints.MapReverseProxy(); diff --git a/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs b/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs index a279c762..c535997a 100644 --- a/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs +++ b/src/apps/identity/Genocs.Identities.Application/CorrelationIdFactory.cs @@ -16,7 +16,7 @@ internal class CorrelationIdFactory : ICorrelationIdFactory public CorrelationIdFactory( IMessagePropertiesAccessor messagePropertiesAccessor, IHttpContextAccessor httpContextAccessor, - HttpClientSettings httpClientOptions) + HttpClientOptions httpClientOptions) { if (httpClientOptions is null) { diff --git a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs index a7eb7f09..5401d00c 100644 --- a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs +++ b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxCommandHandlerDecorator.cs @@ -16,7 +16,7 @@ internal sealed class OutboxCommandHandlerDecorator : ICommandHandler< private readonly bool _enabled; public OutboxCommandHandlerDecorator(ICommandHandler handler, IMessageOutbox outbox, - OutboxSettings outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) + OutboxOptions outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) { _handler = handler; _outbox = outbox; diff --git a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs index 06e73609..0bad3e59 100644 --- a/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs +++ b/src/apps/identity/Genocs.Identities.Application/Decorators/OutboxEventHandlerDecorator.cs @@ -16,7 +16,7 @@ internal sealed class OutboxEventHandlerDecorator : IEventHandler handler, IMessageOutbox outbox, - OutboxSettings outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) + OutboxOptions outboxOptions, IMessagePropertiesAccessor messagePropertiesAccessor) { _handler = handler; _outbox = outbox; diff --git a/src/apps/identity/Genocs.Identities.Application/Extensions.cs b/src/apps/identity/Genocs.Identities.Application/Extensions.cs index ae8f138d..0d19358d 100644 --- a/src/apps/identity/Genocs.Identities.Application/Extensions.cs +++ b/src/apps/identity/Genocs.Identities.Application/Extensions.cs @@ -106,7 +106,7 @@ public static IApplicationBuilder UseCore(this IApplicationBuilder app) } public static async Task GetAppName(this HttpContext httpContext) - => await httpContext.Response.WriteAsync(httpContext.RequestServices?.GetService()?.Name ?? string.Empty); + => await httpContext.Response.WriteAsync(httpContext.RequestServices?.GetService()?.Name ?? string.Empty); internal static CorrelationContext GetCorrelationContext(this IHttpContextAccessor accessor) => accessor.HttpContext?.Request.Headers.TryGetValue("Correlation-Context", out var json) is true diff --git a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs index 77f0cda4..7deb8fb5 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs +++ b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs @@ -26,8 +26,8 @@ public class ProductServiceClient : IProductServiceClient public ProductServiceClient( IHttpClient client, ICertificatesService certificatesService, - HttpClientSettings httpClientOptions, - VaultSettings vaultOptions, + HttpClientOptions httpClientOptions, + VaultOptions vaultOptions, SecuritySettings securitySettings) { _client = client ?? throw new ArgumentNullException(nameof(client)); diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Options/SignalRSettings.cs b/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs similarity index 66% rename from src/apps/signalr/Genocs.SignalR.WebApi/Options/SignalRSettings.cs rename to src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs index 1b1572fa..6dc84226 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Options/SignalRSettings.cs +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs @@ -1,9 +1,9 @@ -namespace Genocs.SignalR.WebApi.Options; +namespace Genocs.SignalR.WebApi.Configurations; /// /// The signalR Settings definition. /// -public class SignalRSettings +public class SignalROptions { public string? Backplane { get; set; } public string? Hub { get; set; } diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs b/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs index 4339e3f3..4a8d6756 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Framework/Extensions.cs @@ -1,5 +1,5 @@ using Genocs.Core.Builders; -using Genocs.SignalR.WebApi.Options; +using Genocs.SignalR.WebApi.Configurations; namespace Genocs.SignalR.WebApi.Framework; @@ -10,7 +10,7 @@ public static string ToUserGroup(this Guid userId) public static IGenocsBuilder AddSignalR(this IGenocsBuilder builder) { - var options = builder.Configuration.GetOptions("signalr"); + var options = builder.Configuration.GetOptions("signalr"); if (options is not null) { @@ -22,7 +22,7 @@ public static IGenocsBuilder AddSignalR(this IGenocsBuilder builder) public static IGenocsBuilder UseSignalR(this IGenocsBuilder builder) { - var options = builder.GetOptions("signalr"); + var options = builder.GetOptions("signalr"); if (options is not null) { diff --git a/testEnvironments.json b/testEnvironments.json new file mode 100644 index 00000000..a110b57d --- /dev/null +++ b/testEnvironments.json @@ -0,0 +1,17 @@ +{ + "version": "1", + "environments": [ + // See https://aka.ms/remotetesting for more details + // about how to configure remote environments. + //{ + // "name": "WSL Ubuntu", + // "type": "wsl", + // "wslDistribution": "Ubuntu" + //}, + //{ + // "name": "Docker dotnet/sdk", + // "type": "docker", + // "dockerImage": "mcr.microsoft.com/dotnet/sdk" + //} + ] +} \ No newline at end of file From 5977b8c49236a78a209519de00deb6e9865d7b57 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 15:29:01 +0200 Subject: [PATCH 10/17] Refactor config naming and add new options This commit encompasses a broad range of changes aimed at improving the clarity, consistency, and flexibility of configuration management within the application. Key changes include: - Renaming the `Genocs.Core.Demo.WebApi.Options` namespace to `Genocs.Core.Demo.WebApi.Configurations` to standardize the naming convention for configuration-related classes. - Updating property descriptions in options classes (e.g., `JwtOptions`, `AppOptions`) to more accurately reflect their purposes and adding a new property `AllowAnonymousEndpoints` to `JwtOptions`. - Modifying the `Position` constants in various options classes to use camelCase, aligning with common JSON and configuration naming conventions. - Updating references in `BuilderExtensions.cs`, `ServiceCollectionExtensions.cs`, and various client classes to use the new `Configurations` namespace. - Renaming settings classes to options (e.g., `AzureServiceBusQueueSettings` to `AzureServiceBusQueueOptions`, `SecuritySettings` to `SecurityOptions`) across the application to follow a consistent naming convention. - Introducing new configuration classes (`JaegerOptions`, `SecurityOptions`, `SwaggerOptions`, `WebApiConfigureOptions`) to better structure and manage configurations for Jaeger tracing, security, Swagger documentation, and Web API settings. - Removing or renaming various settings and builder classes related to metrics, Redis, and Azure Key Vault to reflect a shift in configuration management strategy. These changes aim to enhance the application's configuration management by adopting best practices for naming conventions and configuration patterns, thereby making the codebase easier to understand and maintain. --- src/Genocs.Auth/Configurations/JwtOptions.cs | 3 +- .../Configurations/AppOptions.cs | 6 ++ .../Configurations/ExternalServiceOptions.cs | 12 +++- .../Configurations/RabbitMQOptions.cs | 12 +++- .../Configurations/SecretOptions.cs | 6 +- .../VerificationServiceOptions.cs | 12 +++- .../Extensions/BuilderExtensions.cs | 4 +- .../Extensions/ServiceCollectionExtensions.cs | 21 +++--- .../Services/ExternalServiceClient.cs | 2 +- .../Services/VerificationServiceClient.cs | 2 +- src/Genocs.Core.Demo.Worker/Program.cs | 4 +- .../Configurations/ConsulOptions.cs | 4 ++ .../Configurations/HttpClientOptions.cs | 5 ++ .../Configurations/FabioOptions.cs | 4 +- .../Configurations/LoggerOptions.cs | 5 ++ ...ngsBuilder.cs => MetricsOptionsBuilder.cs} | 22 +++--- .../Configurations/IMetricsOptionsBuilder.cs | 14 ++++ .../Configurations/IMetricsSettingsBuilder.cs | 14 ---- .../{MetricsSettings.cs => MetricsOptions.cs} | 4 +- src/Genocs.Metrics/AppMetrics/Extensions.cs | 10 +-- src/Genocs.Metrics/Prometheus/Extensions.cs | 4 +- .../Prometheus/Internals/PrometheusJob.cs | 2 +- .../Internals/PrometheusMiddleware.cs | 2 +- ...etheusSettings.cs => PrometheusOptions.cs} | 7 +- .../MongoDbEncryptionOptions.cs | 8 ++- .../MongoDbEncryptionSettings.cs | 69 ------------------- .../{MongoDbSettings.cs => MongoDbOptions.cs} | 0 .../Builders/RedisSettingsBuilder.cs | 10 +-- .../Configurations/IRedisOptionsBuilder.cs | 8 +++ .../Configurations/IRedisSettingsBuilder.cs | 8 --- .../{RedisSettings.cs => RedisOptions.cs} | 17 +++-- src/Genocs.Persistence.Redis/Extensions.cs | 10 +-- ...ultSettings.cs => AzureKeyVaultOptions.cs} | 9 ++- .../Extensions.cs | 13 ++-- ...ings.cs => AzureServiceBusQueueOptions.cs} | 13 +++- ...ings.cs => AzureServiceBusTopicOptions.cs} | 12 +++- .../Queues/AzureServiceBusQueue.cs | 6 +- .../Topics/AzureServiceBusTopic.cs | 6 +- src/Genocs.Tracing/Extensions.cs | 6 +- .../Jaeger/Builders/JaegerOptionsBuilder.cs | 4 +- .../Configurations/IJaegerOptionsBuilder.cs | 2 +- .../{JaegerSettings.cs => JaegerOptions.cs} | 5 +- src/Genocs.Tracing/Jaeger/Extensions.cs | 10 +-- .../CertificateMiddleware.cs | 10 +-- ...SecuritySettings.cs => SecurityOptions.cs} | 10 +-- src/Genocs.WebApi.Security/Extensions.cs | 4 +- .../Genocs.WebApi.Security.csproj | 4 -- .../Builders/SwaggerOptionsBuilder.cs | 4 +- .../Configurations/ISwaggerOptionsBuilder.cs | 2 +- .../{SwaggerSettings.cs => SwaggerOptions.cs} | 2 +- src/Genocs.WebApi.Swagger/Docs/Extensions.cs | 6 +- src/Genocs.WebApi.Swagger/Extensions.cs | 2 +- .../Configurations/WebApiConfigureOptions.cs | 26 +++++++ .../Configurations/WebApiOptions.cs | 24 +------ .../Configurations/WebApiSettings.cs | 9 --- src/Genocs.WebApi/Extensions.cs | 2 +- .../Configurations/MessagingOptions.cs | 7 ++ .../Services/ProductServiceClient.cs | 12 ++-- .../Configurations/SignalROptions.cs | 12 +++- 59 files changed, 281 insertions(+), 252 deletions(-) rename src/Genocs.Metrics/AppMetrics/Builders/{MetricsSettingsBuilder.cs => MetricsOptionsBuilder.cs} (50%) create mode 100644 src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs delete mode 100644 src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs rename src/Genocs.Metrics/AppMetrics/Configurations/{MetricsSettings.cs => MetricsOptions.cs} (95%) rename src/Genocs.Metrics/Prometheus/Options/{PrometheusSettings.cs => PrometheusOptions.cs} (80%) delete mode 100644 src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs rename src/Genocs.Persistence.MongoDb/Configurations/{MongoDbSettings.cs => MongoDbOptions.cs} (100%) create mode 100644 src/Genocs.Persistence.Redis/Configurations/IRedisOptionsBuilder.cs delete mode 100644 src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs rename src/Genocs.Persistence.Redis/Configurations/{RedisSettings.cs => RedisOptions.cs} (59%) rename src/Genocs.Secrets.AzureKeyVault/Configurations/{AzureKeyVaultSettings.cs => AzureKeyVaultOptions.cs} (67%) rename src/Genocs.ServiceBusAzure/Configurations/{AzureServiceBusQueueSettings.cs => AzureServiceBusQueueOptions.cs} (61%) rename src/Genocs.ServiceBusAzure/Configurations/{AzureServiceBusTopicSettings.cs => AzureServiceBusTopicOptions.cs} (64%) rename src/Genocs.Tracing/Jaeger/Configurations/{JaegerSettings.cs => JaegerOptions.cs} (92%) rename src/Genocs.WebApi.Security/Configurations/{SecuritySettings.cs => SecurityOptions.cs} (76%) rename src/Genocs.WebApi.Swagger/Docs/Configurations/{SwaggerSettings.cs => SwaggerOptions.cs} (93%) create mode 100644 src/Genocs.WebApi/Configurations/WebApiConfigureOptions.cs delete mode 100644 src/Genocs.WebApi/Configurations/WebApiSettings.cs diff --git a/src/Genocs.Auth/Configurations/JwtOptions.cs b/src/Genocs.Auth/Configurations/JwtOptions.cs index cc181c18..44a21d08 100644 --- a/src/Genocs.Auth/Configurations/JwtOptions.cs +++ b/src/Genocs.Auth/Configurations/JwtOptions.cs @@ -8,9 +8,10 @@ public class JwtOptions public const string Position = "jwt"; /// - /// It is used to enable or disable the authentication. + /// It defines whether the section is enabled or not. /// public bool Enabled { get; set; } + public IEnumerable? AllowAnonymousEndpoints { get; set; } public CertificateOptions? Certificate { get; set; } public string? Algorithm { get; set; } diff --git a/src/Genocs.Common/Configurations/AppOptions.cs b/src/Genocs.Common/Configurations/AppOptions.cs index a5596f68..da9f08c3 100644 --- a/src/Genocs.Common/Configurations/AppOptions.cs +++ b/src/Genocs.Common/Configurations/AppOptions.cs @@ -10,6 +10,12 @@ public class AppOptions /// public const string Position = "app"; + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } + + /// /// Application name. /// diff --git a/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs b/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs index c52cacaa..ef8b1db6 100644 --- a/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/ExternalServiceOptions.cs @@ -1,13 +1,21 @@ using System.ComponentModel.DataAnnotations; -namespace Genocs.Core.Demo.WebApi.Options; +namespace Genocs.Core.Demo.WebApi.Configurations; /// /// This class implements Options pattern with Validation. /// public class ExternalServiceOptions : IValidatableObject { - public const string Position = "ExternalService"; + /// + /// Default section name. + /// + public const string Position = "externalService"; + + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } public string Caller { get; set; } = default!; public string Private { get; set; } = default!; diff --git a/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs b/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs index 92bc8656..029daa12 100644 --- a/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/RabbitMQOptions.cs @@ -1,8 +1,16 @@ -namespace Genocs.Core.Demo.WebApi.Options; +namespace Genocs.Core.Demo.WebApi.Configurations; public class RabbitMQOptions { - public const string Position = "RabbitMQ"; + /// + /// Default section name. + /// + public const string Position = "rabbitMQ"; + + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } public string HostName { get; set; } = default!; public string VirtualHost { get; set; } = default!; diff --git a/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs b/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs index 51ef9d67..367033fc 100644 --- a/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/SecretOptions.cs @@ -1,4 +1,4 @@ -namespace Genocs.Core.Demo.WebApi.Options; +namespace Genocs.Core.Demo.WebApi.Configurations; public class SecretOptions { @@ -7,6 +7,10 @@ public class SecretOptions /// public const string Position = "secrets"; + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } /// /// This is an example of a secret. That should be stored in a secure way. diff --git a/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs b/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs index 2f847694..d33ab6a4 100644 --- a/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs +++ b/src/Genocs.Core.Demo.WebApi/Configurations/VerificationServiceOptions.cs @@ -1,8 +1,16 @@ -namespace Genocs.Core.Demo.WebApi.Options; +namespace Genocs.Core.Demo.WebApi.Configurations; public class VerificationServiceOptions { - public const string Position = "VerificationService"; + /// + /// Default section name. + /// + public const string Position = "verificationService"; + + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } public string ApiKey { get; set; } = default!; } diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs index f4fe8d8d..3d955bc0 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/BuilderExtensions.cs @@ -1,6 +1,6 @@ using Genocs.Core.Builders; +using Genocs.Core.Demo.WebApi.Configurations; using Genocs.Core.Demo.WebApi.Infrastructure.Services; -using Genocs.Core.Demo.WebApi.Options; using Genocs.HTTP; using Genocs.Security; using Genocs.WebApi.Security; @@ -37,7 +37,7 @@ public static IGenocsBuilder AddApplicationServices(this IGenocsBuilder builder) .ValidateDataAnnotations() .ValidateOnStart(); - // builder.Services.AddSingleton, ConfigureWebApiSettings>(); + // builder.Services.AddSingleton, ConfigureWebApiSettings>(); ExternalServiceOptions settings = builder.Configuration.GetOptions(ExternalServiceOptions.Position); builder.Services.AddSingleton(settings); diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs index 4d0f1984..a5d833bf 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -1,5 +1,4 @@ -using Genocs.Core.Builders; -using Genocs.Core.Demo.WebApi.Options; +using Genocs.Core.Demo.WebApi.Configurations; using Genocs.ServiceBusAzure.Configurations; using Genocs.ServiceBusAzure.Queues; using Genocs.ServiceBusAzure.Queues.Interfaces; @@ -22,7 +21,7 @@ public static IServiceCollection AddAzureServiceBus(this IServiceCollection serv public static IServiceCollection AddAzureServiceBusTopic(this IServiceCollection services, IConfiguration configuration) { // Register IOptions - services.Configure(configuration.GetSection(AzureServiceBusTopicSettings.Position)); + services.Configure(configuration.GetSection(AzureServiceBusTopicOptions.Position)); // HOW to Register TopicSettings instead of IOptions ////var topicSetting = new TopicOptions(); @@ -37,7 +36,7 @@ public static IServiceCollection AddAzureServiceBusTopic(this IServiceCollection public static IServiceCollection AddAzureServiceBusQueue(this IServiceCollection services, IConfiguration configuration) { // Register IOptions - services.Configure(configuration.GetSection(AzureServiceBusQueueSettings.Position)); + services.Configure(configuration.GetSection(AzureServiceBusQueueOptions.Position)); // HOW to Register QueueSettings instead of IOptions ////var queueSetting = new QueueSettings(); @@ -51,9 +50,13 @@ public static IServiceCollection AddAzureServiceBusQueue(this IServiceCollection public static IServiceCollection AddCustomMassTransit(this IServiceCollection services, IConfiguration configuration) { - RabbitMQOptions options = configuration.GetOptions(RabbitMQOptions.Position); + RabbitMQOptions rabbitMQSettings = new RabbitMQOptions(); + configuration.GetSection(RabbitMQOptions.Position).Bind(rabbitMQSettings); - services.AddSingleton(options); + // This is another way to get the RabbitMQOptions + // RabbitMQOptions? rabbitMQSettingsV2 = configuration.GetSection(RabbitMQOptions.Position).Get(); + + services.AddSingleton(rabbitMQSettings); services.AddMassTransit(x => { @@ -63,11 +66,11 @@ public static IServiceCollection AddCustomMassTransit(this IServiceCollection se { cfg.ConfigureEndpoints(context); //cfg.UseHealthCheck(context); - cfg.Host(options.HostName, options.VirtualHost, + cfg.Host(rabbitMQSettings.HostName, rabbitMQSettings.VirtualHost, h => { - h.Username(options.UserName); - h.Password(options.Password); + h.Username(rabbitMQSettings.UserName); + h.Password(rabbitMQSettings.Password); } ); }); diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs index f7716aff..6ca25116 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/ExternalServiceClient.cs @@ -1,4 +1,4 @@ -using Genocs.Core.Demo.WebApi.Options; +using Genocs.Core.Demo.WebApi.Configurations; using Genocs.HTTP; using Genocs.HTTP.Configurations; using Genocs.Security; diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs index e9840a86..4820e3ae 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Services/VerificationServiceClient.cs @@ -1,4 +1,4 @@ -using Genocs.Core.Demo.WebApi.Options; +using Genocs.Core.Demo.WebApi.Configurations; using Genocs.HTTP; using Genocs.HTTP.Configurations; using Newtonsoft.Json; diff --git a/src/Genocs.Core.Demo.Worker/Program.cs b/src/Genocs.Core.Demo.Worker/Program.cs index 49527388..6f6931c9 100644 --- a/src/Genocs.Core.Demo.Worker/Program.cs +++ b/src/Genocs.Core.Demo.Worker/Program.cs @@ -98,7 +98,7 @@ static void ConfigureBus(IBusRegistrationContext context, IRabbitMqBusFactoryCon static void ConfigureAzureServiceBusTopic(IServiceCollection services, IConfiguration configuration) { - services.Configure(configuration.GetSection(AzureServiceBusTopicSettings.Position)); + services.Configure(configuration.GetSection(AzureServiceBusTopicOptions.Position)); services.AddSingleton(); @@ -110,7 +110,7 @@ static void ConfigureAzureServiceBusTopic(IServiceCollection services, IConfigur static void ConfigureAzureServiceBusQueue(IServiceCollection services, IConfiguration configuration) { - services.Configure(configuration.GetSection(AzureServiceBusQueueSettings.Position)); + services.Configure(configuration.GetSection(AzureServiceBusQueueOptions.Position)); services.AddSingleton(); diff --git a/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs index 3f1f6cc9..f370ef4a 100644 --- a/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs +++ b/src/Genocs.Discovery.Consul/Configurations/ConsulOptions.cs @@ -7,7 +7,11 @@ public class ConsulOptions /// public const string Position = "consul"; + /// + /// It defines whether the section is enabled or not. + /// public bool Enabled { get; set; } + public string? Url { get; set; } public string? Service { get; set; } public string? Address { get; set; } diff --git a/src/Genocs.HTTP/Configurations/HttpClientOptions.cs b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs index 1310bfaf..91bd72e7 100644 --- a/src/Genocs.HTTP/Configurations/HttpClientOptions.cs +++ b/src/Genocs.HTTP/Configurations/HttpClientOptions.cs @@ -10,6 +10,11 @@ public class HttpClientOptions /// public const string Position = "httpClient"; + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } + /// /// It defines if set consul as service discovery or Fabio as load balancer. /// Allowed values are: consul, Fabio. diff --git a/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs index 28803892..69b78ceb 100644 --- a/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs +++ b/src/Genocs.LoadBalancing.Fabio/Configurations/FabioOptions.cs @@ -6,12 +6,12 @@ namespace Genocs.LoadBalancing.Fabio.Configurations; public class FabioOptions { /// - /// The default Fabio section name. + /// Default section name. /// public const string Position = "fabio"; /// - /// Gets or sets a value indicating whether this is enabled. + /// It defines whether the section is enabled or not. /// public bool Enabled { get; set; } diff --git a/src/Genocs.Logging/Configurations/LoggerOptions.cs b/src/Genocs.Logging/Configurations/LoggerOptions.cs index 087f9da8..59afbad2 100644 --- a/src/Genocs.Logging/Configurations/LoggerOptions.cs +++ b/src/Genocs.Logging/Configurations/LoggerOptions.cs @@ -10,6 +10,11 @@ public class LoggerOptions /// public const string Position = "logger"; + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } + public string? Level { get; set; } /// diff --git a/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs similarity index 50% rename from src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs rename to src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs index 44dca3e8..a28c97f2 100644 --- a/src/Genocs.Metrics/AppMetrics/Builders/MetricsSettingsBuilder.cs +++ b/src/Genocs.Metrics/AppMetrics/Builders/MetricsOptionsBuilder.cs @@ -2,58 +2,58 @@ namespace Genocs.Metrics.AppMetrics.Builders; -internal sealed class MetricsSettingsBuilder : IMetricsSettingsBuilder +internal sealed class MetricsOptionsBuilder : IMetricsOptionsBuilder { - private readonly MetricsSettings _settings = new(); + private readonly MetricsOptions _settings = new(); - public IMetricsSettingsBuilder Enable(bool enabled) + public IMetricsOptionsBuilder Enable(bool enabled) { _settings.Enabled = enabled; return this; } - public IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled) + public IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled) { _settings.InfluxEnabled = influxEnabled; return this; } - public IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled) + public IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled) { _settings.PrometheusEnabled = prometheusEnabled; return this; } - public IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter) + public IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter) { _settings.PrometheusFormatter = prometheusFormatter; return this; } - public IMetricsSettingsBuilder WithInfluxUrl(string influxUrl) + public IMetricsOptionsBuilder WithInfluxUrl(string influxUrl) { _settings.InfluxUrl = influxUrl; return this; } - public IMetricsSettingsBuilder WithDatabase(string database) + public IMetricsOptionsBuilder WithDatabase(string database) { _settings.Database = database; return this; } - public IMetricsSettingsBuilder WithInterval(int interval) + public IMetricsOptionsBuilder WithInterval(int interval) { _settings.Interval = interval; return this; } - public IMetricsSettingsBuilder WithTags(IDictionary tags) + public IMetricsOptionsBuilder WithTags(IDictionary tags) { _settings.Tags = tags; return this; } - public MetricsSettings Build() + public MetricsOptions Build() => _settings; } \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs new file mode 100644 index 00000000..750b1d4b --- /dev/null +++ b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsOptionsBuilder.cs @@ -0,0 +1,14 @@ +namespace Genocs.Metrics.AppMetrics.Configurations; + +public interface IMetricsOptionsBuilder +{ + IMetricsOptionsBuilder Enable(bool enabled); + IMetricsOptionsBuilder WithInfluxEnabled(bool influxEnabled); + IMetricsOptionsBuilder WithPrometheusEnabled(bool prometheusEnabled); + IMetricsOptionsBuilder WithPrometheusFormatter(string prometheusFormatter); + IMetricsOptionsBuilder WithInfluxUrl(string influxUrl); + IMetricsOptionsBuilder WithDatabase(string database); + IMetricsOptionsBuilder WithInterval(int interval); + IMetricsOptionsBuilder WithTags(IDictionary tags); + MetricsOptions Build(); +} \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs b/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs deleted file mode 100644 index e9964080..00000000 --- a/src/Genocs.Metrics/AppMetrics/Configurations/IMetricsSettingsBuilder.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Genocs.Metrics.AppMetrics.Configurations; - -public interface IMetricsSettingsBuilder -{ - IMetricsSettingsBuilder Enable(bool enabled); - IMetricsSettingsBuilder WithInfluxEnabled(bool influxEnabled); - IMetricsSettingsBuilder WithPrometheusEnabled(bool prometheusEnabled); - IMetricsSettingsBuilder WithPrometheusFormatter(string prometheusFormatter); - IMetricsSettingsBuilder WithInfluxUrl(string influxUrl); - IMetricsSettingsBuilder WithDatabase(string database); - IMetricsSettingsBuilder WithInterval(int interval); - IMetricsSettingsBuilder WithTags(IDictionary tags); - MetricsSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsOptions.cs similarity index 95% rename from src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs rename to src/Genocs.Metrics/AppMetrics/Configurations/MetricsOptions.cs index b633b797..17de484d 100644 --- a/src/Genocs.Metrics/AppMetrics/Configurations/MetricsSettings.cs +++ b/src/Genocs.Metrics/AppMetrics/Configurations/MetricsOptions.cs @@ -1,9 +1,9 @@ namespace Genocs.Metrics.AppMetrics.Configurations; /// -/// The MetricsSettings class. +/// The Metrics settings class. /// -public class MetricsSettings +public class MetricsOptions { /// /// Default section name. diff --git a/src/Genocs.Metrics/AppMetrics/Extensions.cs b/src/Genocs.Metrics/AppMetrics/Extensions.cs index 292e0c13..94e769c3 100644 --- a/src/Genocs.Metrics/AppMetrics/Extensions.cs +++ b/src/Genocs.Metrics/AppMetrics/Extensions.cs @@ -40,7 +40,7 @@ public static IGenocsBuilder AddMetrics( appSectionName = AppOptions.Position; } - var metricsOptions = builder.GetOptions(metricsSectionName); + var metricsOptions = builder.GetOptions(metricsSectionName); var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); @@ -49,7 +49,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - Func buildOptions, + Func buildOptions, string appSectionName = AppSectionName) { if (string.IsNullOrWhiteSpace(appSectionName)) @@ -57,7 +57,7 @@ public static IGenocsBuilder AddMetrics( appSectionName = AppSectionName; } - var metricsOptions = buildOptions(new MetricsSettingsBuilder()).Build(); + var metricsOptions = buildOptions(new MetricsOptionsBuilder()).Build(); var appOptions = builder.GetOptions(appSectionName); return builder.AddMetrics(metricsOptions, appOptions); @@ -66,7 +66,7 @@ public static IGenocsBuilder AddMetrics( [Description("For the time being it sets Kestrel's and IIS ServerOptions AllowSynchronousIO = true, see https://github.com/AppMetrics/AppMetrics/issues/396")] public static IGenocsBuilder AddMetrics( this IGenocsBuilder builder, - Configurations.MetricsSettings metricsSettings, + Configurations.MetricsOptions metricsSettings, AppOptions appSettings) { builder.Services.AddSingleton(metricsSettings); @@ -161,7 +161,7 @@ public static IApplicationBuilder UseMetrics(this IApplicationBuilder app) .UseMetricsAllMiddleware(); } - private static MetricsWebHostOptions GetMetricsWebHostOptions(MetricsSettings metricsOptions) + private static MetricsWebHostOptions GetMetricsWebHostOptions(Configurations.MetricsOptions metricsOptions) { var options = new MetricsWebHostOptions(); diff --git a/src/Genocs.Metrics/Prometheus/Extensions.cs b/src/Genocs.Metrics/Prometheus/Extensions.cs index 0e7e4bec..59904afe 100644 --- a/src/Genocs.Metrics/Prometheus/Extensions.cs +++ b/src/Genocs.Metrics/Prometheus/Extensions.cs @@ -12,7 +12,7 @@ public static class Extensions { public static IGenocsBuilder AddPrometheus(this IGenocsBuilder builder) { - var prometheusOptions = builder.GetOptions("prometheus"); + var prometheusOptions = builder.GetOptions(PrometheusOptions.Position); builder.Services.AddSingleton(prometheusOptions); if (!prometheusOptions.Enabled) { @@ -28,7 +28,7 @@ public static IGenocsBuilder AddPrometheus(this IGenocsBuilder builder) public static IApplicationBuilder UsePrometheus(this IApplicationBuilder app) { - var options = app.ApplicationServices.GetRequiredService(); + var options = app.ApplicationServices.GetRequiredService(); if (!options.Enabled) { return app; diff --git a/src/Genocs.Metrics/Prometheus/Internals/PrometheusJob.cs b/src/Genocs.Metrics/Prometheus/Internals/PrometheusJob.cs index ac4f209e..08232aaf 100644 --- a/src/Genocs.Metrics/Prometheus/Internals/PrometheusJob.cs +++ b/src/Genocs.Metrics/Prometheus/Internals/PrometheusJob.cs @@ -19,7 +19,7 @@ internal sealed class PrometheusJob : IHostedService /// /// /// - public PrometheusJob(PrometheusSettings options, ILogger logger) + public PrometheusJob(PrometheusOptions options, ILogger logger) { _enabled = options.Enabled; _logger = logger ?? throw new ArgumentNullException(nameof(logger)); diff --git a/src/Genocs.Metrics/Prometheus/Internals/PrometheusMiddleware.cs b/src/Genocs.Metrics/Prometheus/Internals/PrometheusMiddleware.cs index e4b90a57..1c5464e8 100644 --- a/src/Genocs.Metrics/Prometheus/Internals/PrometheusMiddleware.cs +++ b/src/Genocs.Metrics/Prometheus/Internals/PrometheusMiddleware.cs @@ -9,7 +9,7 @@ internal sealed class PrometheusMiddleware : IMiddleware private readonly string _endpoint; private readonly string? _apiKey; - public PrometheusMiddleware(PrometheusSettings options) + public PrometheusMiddleware(PrometheusOptions options) { _allowedHosts = new HashSet(options.AllowedHosts ?? Array.Empty()); _endpoint = string.IsNullOrWhiteSpace(options.Endpoint) ? "/metrics" : diff --git a/src/Genocs.Metrics/Prometheus/Options/PrometheusSettings.cs b/src/Genocs.Metrics/Prometheus/Options/PrometheusOptions.cs similarity index 80% rename from src/Genocs.Metrics/Prometheus/Options/PrometheusSettings.cs rename to src/Genocs.Metrics/Prometheus/Options/PrometheusOptions.cs index c8c68104..2b54fc5c 100644 --- a/src/Genocs.Metrics/Prometheus/Options/PrometheusSettings.cs +++ b/src/Genocs.Metrics/Prometheus/Options/PrometheusOptions.cs @@ -3,8 +3,13 @@ /// /// The Prometheus Setting definition. /// -public class PrometheusSettings +public class PrometheusOptions { + /// + /// Default section name. + /// + public const string Position = "prometheus"; + /// /// It defines whether the section is enabled or not. /// diff --git a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs index 70db85df..dca2d18b 100644 --- a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs +++ b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionOptions.cs @@ -5,11 +5,15 @@ /// public class MongoDbEncryptionOptions { + /// + /// Default section name. + /// + public const string Position = "mongoDbEncryption"; /// - /// Default Section name. + /// It defines whether the section is enabled or not. /// - public const string Position = "MongoDbEncryption"; + public bool Enabled { get; set; } /// /// The Database connection string. diff --git a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs deleted file mode 100644 index 3124e3a3..00000000 --- a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbEncryptionSettings.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace Genocs.Persistence.MongoDb.Configurations; - -/// -/// MongoDb encryption database Settings. -/// -public class MongoDbEncryptionSettings -{ - - /// - /// Default Section name - /// - public const string Position = "MongoDbEncryption"; - - /// - /// The Database connection string - /// - public string ConnectionString { get; set; } = default!; - - /// - /// The shared library used to encrypt - /// - public string LibPath { get; set; } = default!; - - /// - /// Azure Tenant Id - /// - public string TenantId { get; set; } = default!; - - /// - /// Azure Client Id - /// - public string ClientId { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string ClientSecret { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyName { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyVersion { get; set; } = default!; - - /// - /// Azure Client Secret - /// - public string KeyVaultEndpoint { get; set; } = default!; - - /// - /// Check if the MongoDbSettings object contains valid data - /// - /// MongoDbSettings object - /// return true if valid otherwise false - public static bool IsValid(MongoDbEncryptionSettings settings) - { - if (settings is null) return false; - - if (string.IsNullOrWhiteSpace(settings.ConnectionString)) return false; - if (string.IsNullOrWhiteSpace(settings.LibPath)) return false; - - return true; - - } -} diff --git a/src/Genocs.Persistence.MongoDb/Configurations/MongoDbSettings.cs b/src/Genocs.Persistence.MongoDb/Configurations/MongoDbOptions.cs similarity index 100% rename from src/Genocs.Persistence.MongoDb/Configurations/MongoDbSettings.cs rename to src/Genocs.Persistence.MongoDb/Configurations/MongoDbOptions.cs diff --git a/src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs b/src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs index e2d0cbb1..38bbb955 100644 --- a/src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs +++ b/src/Genocs.Persistence.Redis/Builders/RedisSettingsBuilder.cs @@ -2,22 +2,22 @@ namespace Genocs.Persistence.Redis.Builders; -internal sealed class RedisSettingsBuilder : IRedisSettingsBuilder +internal sealed class RedisSettingsBuilder : IRedisOptionsBuilder { - private readonly RedisSettings _options = new(); + private readonly RedisOptions _options = new(); - public IRedisSettingsBuilder WithConnectionString(string connectionString) + public IRedisOptionsBuilder WithConnectionString(string connectionString) { _options.ConnectionString = connectionString; return this; } - public IRedisSettingsBuilder WithInstance(string instance) + public IRedisOptionsBuilder WithInstance(string instance) { _options.Instance = instance; return this; } - public RedisSettings Build() + public RedisOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Persistence.Redis/Configurations/IRedisOptionsBuilder.cs b/src/Genocs.Persistence.Redis/Configurations/IRedisOptionsBuilder.cs new file mode 100644 index 00000000..8d2000ea --- /dev/null +++ b/src/Genocs.Persistence.Redis/Configurations/IRedisOptionsBuilder.cs @@ -0,0 +1,8 @@ +namespace Genocs.Persistence.Redis.Configurations; + +public interface IRedisOptionsBuilder +{ + IRedisOptionsBuilder WithConnectionString(string connectionString); + IRedisOptionsBuilder WithInstance(string instance); + RedisOptions Build(); +} \ No newline at end of file diff --git a/src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs b/src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs deleted file mode 100644 index 145fac47..00000000 --- a/src/Genocs.Persistence.Redis/Configurations/IRedisSettingsBuilder.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Genocs.Persistence.Redis.Configurations; - -public interface IRedisSettingsBuilder -{ - IRedisSettingsBuilder WithConnectionString(string connectionString); - IRedisSettingsBuilder WithInstance(string instance); - RedisSettings Build(); -} \ No newline at end of file diff --git a/src/Genocs.Persistence.Redis/Configurations/RedisSettings.cs b/src/Genocs.Persistence.Redis/Configurations/RedisOptions.cs similarity index 59% rename from src/Genocs.Persistence.Redis/Configurations/RedisSettings.cs rename to src/Genocs.Persistence.Redis/Configurations/RedisOptions.cs index bd1176c0..5f256db9 100644 --- a/src/Genocs.Persistence.Redis/Configurations/RedisSettings.cs +++ b/src/Genocs.Persistence.Redis/Configurations/RedisOptions.cs @@ -1,27 +1,32 @@ namespace Genocs.Persistence.Redis.Configurations; /// -/// The Redis Options +/// The Redis Options. /// -public class RedisSettings +public class RedisOptions { /// - /// The section name + /// Default section name. /// public const string Position = "redis"; /// - /// The connection string + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } + + /// + /// The connection string. /// public string ConnectionString { get; set; } = "localhost"; /// - /// Redis instance + /// Redis instance. /// public string? Instance { get; set; } /// - /// The database Id + /// The database Id. /// public int Database { get; set; } } \ No newline at end of file diff --git a/src/Genocs.Persistence.Redis/Extensions.cs b/src/Genocs.Persistence.Redis/Extensions.cs index 87ffed86..248df998 100644 --- a/src/Genocs.Persistence.Redis/Extensions.cs +++ b/src/Genocs.Persistence.Redis/Extensions.cs @@ -19,14 +19,14 @@ public static class Extensions /// The Genocs builder /// /// - public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, string sectionName = RedisSettings.Position) + public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, string sectionName = RedisOptions.Position) { if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = RedisSettings.Position; + sectionName = RedisOptions.Position; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); return builder.AddRedis(options); } @@ -38,7 +38,7 @@ public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, string sectio /// public static IGenocsBuilder AddRedis( this IGenocsBuilder builder, - Func buildOptions) + Func buildOptions) { var options = buildOptions(new RedisSettingsBuilder()).Build(); return builder.AddRedis(options); @@ -50,7 +50,7 @@ public static IGenocsBuilder AddRedis( /// The Genocs builder /// /// - public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, RedisSettings options) + public static IGenocsBuilder AddRedis(this IGenocsBuilder builder, RedisOptions options) { if (!builder.TryRegister(RegistryName)) { diff --git a/src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultSettings.cs b/src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultOptions.cs similarity index 67% rename from src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultSettings.cs rename to src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultOptions.cs index b6ae8649..62ca3c4f 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultSettings.cs +++ b/src/Genocs.Secrets.AzureKeyVault/Configurations/AzureKeyVaultOptions.cs @@ -3,12 +3,15 @@ namespace Genocs.Secrets.AzureKeyVault.Configurations; /// /// The vault Setting definition. /// -public class AzureKeyVaultSettings +public class AzureKeyVaultOptions { - public const string Position = "AzureKeyVault"; + /// + /// Default section name. + /// + public const string Position = "azureKeyVault"; /// - /// The flag to enable or disable the Azure Key Vault. + /// It defines whether the section is enabled or not. /// public bool Enabled { get; set; } diff --git a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs index 907cf7de..7daa3896 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Extensions.cs +++ b/src/Genocs.Secrets.AzureKeyVault/Extensions.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace Genocs.Secrets.AzureKeyVault; @@ -23,16 +22,16 @@ public static class Extensions /// The Host builder. public static IHostBuilder UseAzureKeyVault( this IHostBuilder builder, - string sectionName = AzureKeyVaultSettings.Position) + string sectionName = AzureKeyVaultOptions.Position) => builder.ConfigureAppConfiguration((ctx, cfg) => { // TODO Test if (string.IsNullOrWhiteSpace(sectionName)) { - sectionName = AzureKeyVaultSettings.Position; + sectionName = AzureKeyVaultOptions.Position; } - var settings = ctx.Configuration.GetOptions(sectionName); + var settings = ctx.Configuration.GetOptions(sectionName); if (!settings.Enabled) { return; @@ -54,10 +53,10 @@ public static IHostBuilder UseAzureKeyVault( /// The Web Host builder. public static IWebHostBuilder UseAzureKeyVault( this IWebHostBuilder builder, - string sectionName = AzureKeyVaultSettings.Position) + string sectionName = AzureKeyVaultOptions.Position) => builder.ConfigureAppConfiguration((ctx, cfg) => { - AzureKeyVaultSettings settings = ctx.Configuration.GetOptions(sectionName); + AzureKeyVaultOptions settings = ctx.Configuration.GetOptions(sectionName); if (!settings.Enabled) { return; @@ -74,7 +73,7 @@ public static IWebHostBuilder UseAzureKeyVault( public static WebApplicationBuilder UseAzureKeyVault(this WebApplicationBuilder builder) { - AzureKeyVaultSettings settings = builder.Configuration.GetOptions(AzureKeyVaultSettings.Position); + AzureKeyVaultOptions settings = builder.Configuration.GetOptions(AzureKeyVaultOptions.Position); if (!settings.Enabled) { return builder; diff --git a/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueOptions.cs similarity index 61% rename from src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs rename to src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueOptions.cs index c7cd6781..1ff80237 100644 --- a/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueSettings.cs +++ b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusQueueOptions.cs @@ -2,9 +2,18 @@ namespace Genocs.ServiceBusAzure.Configurations; -public class AzureServiceBusQueueSettings +public class AzureServiceBusQueueOptions { - public const string Position = "AzureServiceBusQueue"; + /// + /// Default section name. + /// + public const string Position = "azureServiceBusQueue"; + + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } + public string? ConnectionString { get; set; } public string? QueueName { get; set; } public int MaxConcurrentCalls { get; set; } = 20; diff --git a/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicOptions.cs similarity index 64% rename from src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs rename to src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicOptions.cs index 26a16a4b..f830f97f 100644 --- a/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicSettings.cs +++ b/src/Genocs.ServiceBusAzure/Configurations/AzureServiceBusTopicOptions.cs @@ -2,9 +2,17 @@ namespace Genocs.ServiceBusAzure.Configurations; -public class AzureServiceBusTopicSettings +public class AzureServiceBusTopicOptions { - public const string Position = "AzureServiceBusTopic"; + /// + /// Default section name. + /// + public const string Position = "azureServiceBusTopic"; + + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } public string? ConnectionString { get; set; } public string? TopicName { get; set; } public string? SubscriptionName { get; set; } diff --git a/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs b/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs index 04a2c8d5..b0522451 100644 --- a/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs +++ b/src/Genocs.ServiceBusAzure/Queues/AzureServiceBusQueue.cs @@ -16,7 +16,7 @@ namespace Genocs.ServiceBusAzure.Queues; public class AzureServiceBusQueue : IAzureServiceBusQueue { private readonly IQueueClient _queueClient; - private readonly AzureServiceBusQueueSettings _options; + private readonly AzureServiceBusQueueOptions _options; private readonly ILogger _logger; private Dictionary> _handlers = new Dictionary>(); private const string COMMAND_SUFFIX = "Command"; @@ -29,7 +29,7 @@ public class AzureServiceBusQueue : IAzureServiceBusQueue /// /// /// - public AzureServiceBusQueue(IOptions options, + public AzureServiceBusQueue(IOptions options, IServiceProvider serviceProvider, ILogger logger) { @@ -59,7 +59,7 @@ public AzureServiceBusQueue(IOptions options, /// /// /// - public AzureServiceBusQueue(AzureServiceBusQueueSettings options, + public AzureServiceBusQueue(AzureServiceBusQueueOptions options, IServiceProvider serviceProvider, ILogger logger) { diff --git a/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs b/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs index 1684af7e..9686274b 100644 --- a/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs +++ b/src/Genocs.ServiceBusAzure/Topics/AzureServiceBusTopic.cs @@ -13,7 +13,7 @@ namespace Genocs.ServiceBusAzure.Topics; public class AzureServiceBusTopic : IAzureServiceBusTopic { private readonly TopicClient _topicClient; - private readonly AzureServiceBusTopicSettings _options; + private readonly AzureServiceBusTopicOptions _options; private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; private const string EVENT_SUFFIX = "Event"; @@ -22,7 +22,7 @@ public class AzureServiceBusTopic : IAzureServiceBusTopic private readonly List _eventTypes; public AzureServiceBusTopic( - IOptions options, + IOptions options, IServiceProvider serviceProvider, ILogger logger) { @@ -47,7 +47,7 @@ public AzureServiceBusTopic( } } public AzureServiceBusTopic( - AzureServiceBusTopicSettings options, + AzureServiceBusTopicOptions options, IServiceProvider serviceProvider, ILogger logger) { diff --git a/src/Genocs.Tracing/Extensions.cs b/src/Genocs.Tracing/Extensions.cs index 130635e8..44a9bc0f 100644 --- a/src/Genocs.Tracing/Extensions.cs +++ b/src/Genocs.Tracing/Extensions.cs @@ -75,7 +75,7 @@ public static IGenocsBuilder AddOpenTelemetry(this IGenocsBuilder builder) } } - var jaegerOptions = builder.GetOptions(JaegerSettings.Position); + var jaegerOptions = builder.GetOptions(JaegerOptions.Position); if (jaegerOptions != null && jaegerOptions.Enabled) { @@ -121,7 +121,7 @@ public static IGenocsBuilder AddOpenTelemetry(this IGenocsBuilder builder) return builder; } - private static ISampler GetSampler(JaegerSettings options) + private static ISampler GetSampler(JaegerOptions options) { switch (options.Sampler) { @@ -132,7 +132,7 @@ private static ISampler GetSampler(JaegerSettings options) } } - private static HttpSender BuildHttpSender(JaegerSettings.HttpSenderSettings? options) + private static HttpSender BuildHttpSender(JaegerOptions.HttpSenderSettings? options) { if (options is null) { diff --git a/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs b/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs index 1bb7c940..7bb3b3de 100644 --- a/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs +++ b/src/Genocs.Tracing/Jaeger/Builders/JaegerOptionsBuilder.cs @@ -4,7 +4,7 @@ namespace Genocs.Tracing.Jaeger.Builders; internal sealed class JaegerOptionsBuilder : IJaegerOptionsBuilder { - private readonly JaegerSettings _options = new(); + private readonly JaegerOptions _options = new(); public IJaegerOptionsBuilder Enable(bool enabled) { @@ -54,6 +54,6 @@ public IJaegerOptionsBuilder WithSamplingRate(double samplingRate) return this; } - public JaegerSettings Build() + public JaegerOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs b/src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs index 5e9ab003..e19ae13a 100644 --- a/src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs +++ b/src/Genocs.Tracing/Jaeger/Configurations/IJaegerOptionsBuilder.cs @@ -10,5 +10,5 @@ public interface IJaegerOptionsBuilder IJaegerOptionsBuilder WithSampler(string sampler); IJaegerOptionsBuilder WithMaxTracesPerSecond(double maxTracesPerSecond); IJaegerOptionsBuilder WithSamplingRate(double samplingRate); - JaegerSettings Build(); + JaegerOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.Tracing/Jaeger/Configurations/JaegerSettings.cs b/src/Genocs.Tracing/Jaeger/Configurations/JaegerOptions.cs similarity index 92% rename from src/Genocs.Tracing/Jaeger/Configurations/JaegerSettings.cs rename to src/Genocs.Tracing/Jaeger/Configurations/JaegerOptions.cs index 59528f09..b1d9c379 100644 --- a/src/Genocs.Tracing/Jaeger/Configurations/JaegerSettings.cs +++ b/src/Genocs.Tracing/Jaeger/Configurations/JaegerOptions.cs @@ -3,7 +3,7 @@ namespace Genocs.Tracing.Jaeger.Configurations; /// /// Jaeger Settings. /// -public class JaegerSettings +public class JaegerOptions { /// /// Default section name. @@ -11,9 +11,10 @@ public class JaegerSettings public const string Position = "jaeger"; /// - /// + /// It defines whether the section is enabled or not. /// public bool Enabled { get; set; } + public string? ServiceName { get; set; } public string? UdpHost { get; set; } public int UdpPort { get; set; } diff --git a/src/Genocs.Tracing/Jaeger/Extensions.cs b/src/Genocs.Tracing/Jaeger/Extensions.cs index 59d3af36..a5aa4065 100644 --- a/src/Genocs.Tracing/Jaeger/Extensions.cs +++ b/src/Genocs.Tracing/Jaeger/Extensions.cs @@ -29,14 +29,14 @@ public static class Extensions /// /// /// - public static IGenocsBuilder AddJaeger(this IGenocsBuilder builder, string sectionName = JaegerSettings.Position) + public static IGenocsBuilder AddJaeger(this IGenocsBuilder builder, string sectionName = JaegerOptions.Position) { if (Interlocked.Exchange(ref _initialized, 1) == 1) { return builder; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); builder.Services.AddSingleton(options); @@ -85,7 +85,7 @@ public static IGenocsBuilder AddJaeger(this IGenocsBuilder builder, string secti return builder; } - private static HttpSender BuildHttpSender(JaegerSettings.HttpSenderSettings? options) + private static HttpSender BuildHttpSender(JaegerOptions.HttpSenderSettings? options) { if (options is null) { @@ -125,12 +125,12 @@ public static IApplicationBuilder UseJaeger(this IApplicationBuilder app) { // Could be extended with some additional middleware using var scope = app.ApplicationServices.CreateScope(); - var options = scope.ServiceProvider.GetRequiredService(); + var options = scope.ServiceProvider.GetRequiredService(); return app; } - private static ISampler GetSampler(JaegerSettings options) + private static ISampler GetSampler(JaegerOptions options) { return options.Sampler switch { diff --git a/src/Genocs.WebApi.Security/CertificateMiddleware.cs b/src/Genocs.WebApi.Security/CertificateMiddleware.cs index 3111aed3..e976c994 100644 --- a/src/Genocs.WebApi.Security/CertificateMiddleware.cs +++ b/src/Genocs.WebApi.Security/CertificateMiddleware.cs @@ -9,16 +9,16 @@ internal sealed class CertificateMiddleware : IMiddleware { private readonly ICertificatePermissionValidator _certificatePermissionValidator; private readonly ILogger _logger; - private readonly SecuritySettings.CertificateSettings _options; + private readonly SecurityOptions.CertificateOptions _options; private readonly HashSet _allowedHosts; - private readonly IDictionary _acl; + private readonly IDictionary _acl; private readonly IDictionary _subjects = new Dictionary(); private readonly bool _validateAcl; private readonly bool _skipRevocationCheck; public CertificateMiddleware( ICertificatePermissionValidator certificatePermissionValidator, - SecuritySettings options, + SecurityOptions options, ILogger logger) { _certificatePermissionValidator = certificatePermissionValidator; @@ -33,7 +33,7 @@ public CertificateMiddleware( return; } - _acl = new Dictionary(); + _acl = new Dictionary(); foreach (var (key, acl) in _options.Acl) { if (!string.IsNullOrWhiteSpace(acl.ValidIssuer) && !acl.ValidIssuer.StartsWith("CN=")) @@ -78,7 +78,7 @@ public Task InvokeAsync(HttpContext context, RequestDelegate next) return next(context); } - SecuritySettings.CertificateSettings.AclSettings acl; + SecurityOptions.CertificateOptions.AclOptions acl; if (_subjects.TryGetValue(certificate.Subject, out string? subject)) { if (!_acl.TryGetValue(subject, out var existingAcl)) diff --git a/src/Genocs.WebApi.Security/Configurations/SecuritySettings.cs b/src/Genocs.WebApi.Security/Configurations/SecurityOptions.cs similarity index 76% rename from src/Genocs.WebApi.Security/Configurations/SecuritySettings.cs rename to src/Genocs.WebApi.Security/Configurations/SecurityOptions.cs index bab3c180..dc4c04ee 100644 --- a/src/Genocs.WebApi.Security/Configurations/SecuritySettings.cs +++ b/src/Genocs.WebApi.Security/Configurations/SecurityOptions.cs @@ -1,22 +1,22 @@ namespace Genocs.WebApi.Security.Configurations; -public class SecuritySettings +public class SecurityOptions { - public CertificateSettings? Certificate { get; set; } + public CertificateOptions? Certificate { get; set; } - public class CertificateSettings + public class CertificateOptions { public bool Enabled { get; set; } public string? Header { get; set; } public bool AllowSubdomains { get; set; } public IEnumerable? AllowedDomains { get; set; } public IEnumerable? AllowedHosts { get; set; } - public IDictionary? Acl { get; set; } + public IDictionary? Acl { get; set; } public bool SkipRevocationCheck { get; set; } public string GetHeaderName() => string.IsNullOrWhiteSpace(Header) ? "Certificate" : Header; - public class AclSettings + public class AclOptions { public string? ValidIssuer { get; set; } public string? ValidThumbprint { get; set; } diff --git a/src/Genocs.WebApi.Security/Extensions.cs b/src/Genocs.WebApi.Security/Extensions.cs index 957802e4..d81de65b 100644 --- a/src/Genocs.WebApi.Security/Extensions.cs +++ b/src/Genocs.WebApi.Security/Extensions.cs @@ -17,7 +17,7 @@ public static IGenocsBuilder AddCertificateAuthentication( string sectionName = SectionName, Type? permissionValidatorType = null) { - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); builder.Services.AddSingleton(options); if (!builder.TryRegister(RegistryName)) { @@ -57,7 +57,7 @@ public static IGenocsBuilder AddCertificateAuthentication( public static IApplicationBuilder UseCertificateAuthentication(this IApplicationBuilder app) { - var options = app.ApplicationServices.GetRequiredService(); + var options = app.ApplicationServices.GetRequiredService(); if (options.Certificate is null || !options.Certificate.Enabled) { return app; diff --git a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj index 4c964e2c..f3664774 100644 --- a/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj +++ b/src/Genocs.WebApi.Security/Genocs.WebApi.Security.csproj @@ -61,8 +61,4 @@ - - - - diff --git a/src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs index 7c34637a..36173a5b 100644 --- a/src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Builders/SwaggerOptionsBuilder.cs @@ -4,7 +4,7 @@ namespace Genocs.WebApi.Swagger.Docs.Builders; internal sealed class SwaggerOptionsBuilder : ISwaggerOptionsBuilder { - private readonly SwaggerSettings _options = new(); + private readonly SwaggerOptions _options = new(); public ISwaggerOptionsBuilder Enable(bool enabled) { @@ -54,5 +54,5 @@ public ISwaggerOptionsBuilder SerializeAsOpenApiV2(bool serializeAsOpenApiV2) return this; } - public SwaggerSettings Build() => _options; + public SwaggerOptions Build() => _options; } \ No newline at end of file diff --git a/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs b/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs index 64c1b28b..420554f2 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Configurations/ISwaggerOptionsBuilder.cs @@ -9,5 +9,5 @@ public interface ISwaggerOptionsBuilder ISwaggerOptionsBuilder WithRoutePrefix(string routePrefix); ISwaggerOptionsBuilder IncludeSecurity(bool includeSecurity); ISwaggerOptionsBuilder SerializeAsOpenApiV2(bool serializeAsOpenApiV2); - SwaggerSettings Build(); + SwaggerOptions Build(); } \ No newline at end of file diff --git a/src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerSettings.cs b/src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerOptions.cs similarity index 93% rename from src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerSettings.cs rename to src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerOptions.cs index 4045b00b..22af3c8b 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerSettings.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Configurations/SwaggerOptions.cs @@ -1,6 +1,6 @@ namespace Genocs.WebApi.Swagger.Docs.Configurations; -public class SwaggerSettings +public class SwaggerOptions { public bool Enabled { get; set; } public bool ReDocEnabled { get; set; } diff --git a/src/Genocs.WebApi.Swagger/Docs/Extensions.cs b/src/Genocs.WebApi.Swagger/Docs/Extensions.cs index 1f6d8ce7..b8a177c0 100644 --- a/src/Genocs.WebApi.Swagger/Docs/Extensions.cs +++ b/src/Genocs.WebApi.Swagger/Docs/Extensions.cs @@ -19,7 +19,7 @@ public static IGenocsBuilder AddSwaggerDocs(this IGenocsBuilder builder, string sectionName = SectionName; } - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); return builder.AddSwaggerDocs(options); } @@ -29,7 +29,7 @@ public static IGenocsBuilder AddSwaggerDocs(this IGenocsBuilder builder, Func(); + var options = builder.ApplicationServices.GetRequiredService(); if (!options.Enabled) { return builder; diff --git a/src/Genocs.WebApi.Swagger/Extensions.cs b/src/Genocs.WebApi.Swagger/Extensions.cs index 1282e417..43e09e75 100644 --- a/src/Genocs.WebApi.Swagger/Extensions.cs +++ b/src/Genocs.WebApi.Swagger/Extensions.cs @@ -23,7 +23,7 @@ public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, s public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, Func buildOptions) => builder.AddWebApiSwaggerDocs(b => b.AddSwaggerDocs(buildOptions)); - public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, SwaggerSettings options) + public static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, SwaggerOptions options) => builder.AddWebApiSwaggerDocs(b => b.AddSwaggerDocs(options)); private static IGenocsBuilder AddWebApiSwaggerDocs(this IGenocsBuilder builder, Action registerSwagger) diff --git a/src/Genocs.WebApi/Configurations/WebApiConfigureOptions.cs b/src/Genocs.WebApi/Configurations/WebApiConfigureOptions.cs new file mode 100644 index 00000000..6b43b8e4 --- /dev/null +++ b/src/Genocs.WebApi/Configurations/WebApiConfigureOptions.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.Options; + +namespace Genocs.WebApi.Configurations; + +/// +/// The WebApiOptions definition. +/// +public class WebApiConfigureOptions : IConfigureNamedOptions +{ + private readonly WebApiOptions _options; + + public WebApiConfigureOptions(IOptions options) + { + _options = options.Value; + } + + public void Configure(string? name, WebApiOptions options) + { + Configure(options); + } + + public void Configure(WebApiOptions options) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/Genocs.WebApi/Configurations/WebApiOptions.cs b/src/Genocs.WebApi/Configurations/WebApiOptions.cs index ce60fd06..677c055e 100644 --- a/src/Genocs.WebApi/Configurations/WebApiOptions.cs +++ b/src/Genocs.WebApi/Configurations/WebApiOptions.cs @@ -1,27 +1,9 @@ -using Microsoft.Extensions.Options; - namespace Genocs.WebApi.Configurations; /// -/// The WebApiSettings definition. -/// Move to WebApiSettings.cs. +/// The WebApiOptions definition. /// -public class WebApiOptions : IConfigureNamedOptions +public class WebApiOptions { - private readonly WebApiSettings _jwtSettings; - - public WebApiOptions(IOptions jwtSettings) - { - _jwtSettings = jwtSettings.Value; - } - - public void Configure(string? name, WebApiSettings options) - { - Configure(options); - } - - public void Configure(WebApiSettings options) - { - throw new NotImplementedException(); - } + public bool BindRequestFromRoute { get; set; } } \ No newline at end of file diff --git a/src/Genocs.WebApi/Configurations/WebApiSettings.cs b/src/Genocs.WebApi/Configurations/WebApiSettings.cs deleted file mode 100644 index 805f7fe3..00000000 --- a/src/Genocs.WebApi/Configurations/WebApiSettings.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Genocs.WebApi.Configurations; - -/// -/// The WebApiSettings definition. -/// -public class WebApiSettings -{ - public bool BindRequestFromRoute { get; set; } -} \ No newline at end of file diff --git a/src/Genocs.WebApi/Extensions.cs b/src/Genocs.WebApi/Extensions.cs index cc7f9c40..ff9a67d5 100644 --- a/src/Genocs.WebApi/Extensions.cs +++ b/src/Genocs.WebApi/Extensions.cs @@ -95,7 +95,7 @@ public static IGenocsBuilder AddWebApi( builder.Services.AddSingleton(jsonSerializer); builder.Services.AddSingleton(); builder.Services.AddSingleton(new WebApiEndpointDefinitions()); - var options = builder.GetOptions(sectionName); + var options = builder.GetOptions(sectionName); builder.Services.AddSingleton(options); _bindRequestFromRoute = options.BindRequestFromRoute; diff --git a/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs b/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs index af2f8db1..1db1d293 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs +++ b/src/apps/api-gateway/Genocs.APIGateway/Configurations/MessagingOptions.cs @@ -2,9 +2,16 @@ namespace Genocs.APIGateway.Configurations; internal class MessagingOptions { + /// + /// Default section name. + /// public const string Position = "messaging"; + /// + /// It defines whether the section is enabled or not. + /// public bool Enabled { get; set; } + public IEnumerable? Endpoints { get; set; } internal class EndpointOptions diff --git a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs index 7deb8fb5..4530716a 100644 --- a/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs +++ b/src/apps/orders/Genocs.Orders.WebApi/Services/ProductServiceClient.cs @@ -22,13 +22,13 @@ public class ProductServiceClient : IProductServiceClient /// The certification service. /// /// - /// + /// public ProductServiceClient( IHttpClient client, ICertificatesService certificatesService, HttpClientOptions httpClientOptions, VaultOptions vaultOptions, - SecuritySettings securitySettings) + SecurityOptions securityOptions) { _client = client ?? throw new ArgumentNullException(nameof(client)); @@ -43,9 +43,9 @@ public ProductServiceClient( throw new ArgumentNullException(nameof(vaultOptions)); } - if (securitySettings is null) + if (securityOptions is null) { - throw new ArgumentNullException(nameof(securitySettings)); + throw new ArgumentNullException(nameof(securityOptions)); } string? url = httpClientOptions?.Services?["products"]; @@ -58,7 +58,7 @@ public ProductServiceClient( _url = url; if (!vaultOptions.Enabled || vaultOptions.Pki?.Enabled != true || - securitySettings.Certificate?.Enabled != true) + securityOptions.Certificate?.Enabled != true) { return; } @@ -69,7 +69,7 @@ public ProductServiceClient( return; } - string header = securitySettings.Certificate.GetHeaderName(); + string header = securityOptions.Certificate.GetHeaderName(); string certificateData = certificate.GetRawCertDataString(); _client.SetHeaders(h => h.Add(header, certificateData)); } diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs b/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs index 6dc84226..b0dfd4f1 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs +++ b/src/apps/signalr/Genocs.SignalR.WebApi/Configurations/SignalROptions.cs @@ -1,10 +1,20 @@ namespace Genocs.SignalR.WebApi.Configurations; /// -/// The signalR Settings definition. +/// The signalR settings definition. /// public class SignalROptions { + /// + /// Default section name. + /// + public const string Position = "signalR"; + + /// + /// It defines whether the section is enabled or not. + /// + public bool Enabled { get; set; } + public string? Backplane { get; set; } public string? Hub { get; set; } } \ No newline at end of file From 0cde64fba30a987d5be4062d6ab167945629b8bc Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 17:33:09 +0200 Subject: [PATCH 11/17] Update dependencies and refactor namespaces - Updated various package versions across multiple projects to ensure the latest features and security patches are utilized. This includes major updates for `Serilog.Sinks.*` packages and minor updates for others like `System.IdentityModel.Tokens.Jwt`, `MassTransit.RabbitMQ`, and `MongoDB.Driver`. - Introduced wildcard versioning for `Microsoft.AspNetCore.Authentication.JwtBearer` and `Microsoft.Extensions.Hosting.Abstractions` to adopt more flexible dependency management. - Refactored namespaces and using directives in `HomeController.cs` and `Program.cs`, moving from `.Options` to `.Configurations` to improve project structure clarity. - General maintenance to keep dependencies up-to-date and refactor project organization for better readability and functionality. --- src/Genocs.Auth/Genocs.Auth.csproj | 2 +- src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs | 2 +- src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj | 2 +- src/Genocs.Core.Demo.WebApi/Program.cs | 4 +--- src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj | 2 +- src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj | 2 +- src/Genocs.HTTP/Genocs.HTTP.csproj | 2 +- src/Genocs.Logging/Genocs.Logging.csproj | 6 +++--- .../Genocs.MessageBrokers.RabbitMQ.csproj | 2 +- .../Genocs.Persistence.MongoDb.csproj | 2 +- .../Genocs.QueryBuilder.UnitTests.csproj | 2 +- .../Genocs.Secrets.AzureKeyVault.csproj | 2 +- src/Genocs.Security/Genocs.Security.csproj | 6 +++--- src/Genocs.Tracing/Genocs.Tracing.csproj | 6 +++--- 14 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/Genocs.Auth/Genocs.Auth.csproj b/src/Genocs.Auth/Genocs.Auth.csproj index d90636d6..18988efe 100644 --- a/src/Genocs.Auth/Genocs.Auth.csproj +++ b/src/Genocs.Auth/Genocs.Auth.csproj @@ -68,7 +68,7 @@ - + diff --git a/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs b/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs index 9aaea49b..d9a29280 100644 --- a/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs +++ b/src/Genocs.Core.Demo.WebApi/Controllers/HomeController.cs @@ -1,4 +1,4 @@ -using Genocs.Core.Demo.WebApi.Options; +using Genocs.Core.Demo.WebApi.Configurations; using Microsoft.AspNetCore.Mvc; namespace Genocs.Core.Demo.WebApi.Controllers; diff --git a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj index dd2e6a27..149a6af0 100644 --- a/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj +++ b/src/Genocs.Core.Demo.WebApi/Genocs.Core.Demo.WebApi.csproj @@ -32,7 +32,7 @@ - + diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index 6fbac463..9a80f8a1 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -1,12 +1,10 @@ -using Genocs.Auth; using Genocs.Core.Builders; +using Genocs.Core.Demo.WebApi.Configurations; using Genocs.Core.Demo.WebApi.Infrastructure.Extensions; -using Genocs.Core.Demo.WebApi.Options; using Genocs.Logging; using Genocs.Persistence.MongoDb.Extensions; using Genocs.Secrets.AzureKeyVault; using Genocs.Tracing; -using Genocs.WebApi.Security; using Microsoft.Extensions.Diagnostics.HealthChecks; using Serilog; using System.Reflection; diff --git a/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj b/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj index 71210be0..c765a4f7 100644 --- a/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj +++ b/src/Genocs.Core.Demo.Worker/Genocs.Core.Demo.Worker.csproj @@ -23,7 +23,7 @@ - + diff --git a/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj b/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj index a6861387..22cd38c5 100644 --- a/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj +++ b/src/Genocs.Discovery.Consul/Genocs.Discovery.Consul.csproj @@ -53,6 +53,6 @@ - + diff --git a/src/Genocs.HTTP/Genocs.HTTP.csproj b/src/Genocs.HTTP/Genocs.HTTP.csproj index 7260ea03..b6da6319 100644 --- a/src/Genocs.HTTP/Genocs.HTTP.csproj +++ b/src/Genocs.HTTP/Genocs.HTTP.csproj @@ -51,7 +51,7 @@ - + diff --git a/src/Genocs.Logging/Genocs.Logging.csproj b/src/Genocs.Logging/Genocs.Logging.csproj index 0cb22d85..b85b5d30 100644 --- a/src/Genocs.Logging/Genocs.Logging.csproj +++ b/src/Genocs.Logging/Genocs.Logging.csproj @@ -53,10 +53,10 @@ - - + + - + diff --git a/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj b/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj index e911d229..b04f3130 100644 --- a/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj +++ b/src/Genocs.MessageBrokers.RabbitMQ/Genocs.MessageBrokers.RabbitMQ.csproj @@ -51,7 +51,7 @@ - + diff --git a/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj b/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj index 08140949..58d5d725 100644 --- a/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj +++ b/src/Genocs.Persistence.MongoDb/Genocs.Persistence.MongoDb.csproj @@ -50,7 +50,7 @@ - + diff --git a/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj b/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj index 59c8adcc..8c493814 100644 --- a/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj +++ b/src/Genocs.QueryBuilder.UnitTests/Genocs.QueryBuilder.UnitTests.csproj @@ -13,7 +13,7 @@ - + all diff --git a/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj b/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj index 64d97c8d..83ca3e64 100644 --- a/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj +++ b/src/Genocs.Secrets.AzureKeyVault/Genocs.Secrets.AzureKeyVault.csproj @@ -51,7 +51,7 @@ - + diff --git a/src/Genocs.Security/Genocs.Security.csproj b/src/Genocs.Security/Genocs.Security.csproj index 9885aab3..2f37fd4a 100644 --- a/src/Genocs.Security/Genocs.Security.csproj +++ b/src/Genocs.Security/Genocs.Security.csproj @@ -51,15 +51,15 @@ - + - + - + diff --git a/src/Genocs.Tracing/Genocs.Tracing.csproj b/src/Genocs.Tracing/Genocs.Tracing.csproj index 66524a87..ae5c2a94 100644 --- a/src/Genocs.Tracing/Genocs.Tracing.csproj +++ b/src/Genocs.Tracing/Genocs.Tracing.csproj @@ -60,10 +60,10 @@ - + - - + + From 1058ea157068e99bb9e08dbe71350d574d9b8d7f Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 18:59:12 +0200 Subject: [PATCH 12/17] Update app config for logging, security, and more - Added new logger configuration with detailed settings for console and file logging, including log rotation and exclusions for specific paths. Placeholder for Azure logging added but disabled. - Introduced monitoring configuration with Jaeger for distributed tracing. - Updated JWT configuration for improved token validation. - Standardized configuration keys to camelCase for RabbitMQ, Azure Service Bus Topic, and Queue without altering their values. - Enhanced MongoDB configuration with tracing capabilities. - Enabled Azure Key Vault integration for secure management of secrets. - Removed and replaced outdated configurations to streamline and adopt new naming conventions. --- src/Genocs.Core.Demo.WebApi/appsettings.json | 65 +++++++++----------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/src/Genocs.Core.Demo.WebApi/appsettings.json b/src/Genocs.Core.Demo.WebApi/appsettings.json index 750cbaac..1e0d3a92 100644 --- a/src/Genocs.Core.Demo.WebApi/appsettings.json +++ b/src/Genocs.Core.Demo.WebApi/appsettings.json @@ -7,59 +7,54 @@ "displayBanner": true, "displayVersion": true }, - "RabbitMQ": { + "logger": { + "level": "information", + "applicationName": "demo-service", + "excludePaths": [ "/ping", "/metrics" ], + "console": { + "enabled": true + }, + "file": { + "enabled": true, + "path": "logs/logs.txt", + "interval": "day" + }, + "azure": { + "enabled": false, + "connectionString": "<>" + } + }, + "monitoring": { + "jaeger": "localhost" + }, + "jwt": { + "ValidIssuer": "http://localhost/Auth", + "ValidAudience": "https://localhost:5000", + "Secret": "" + }, + "rabbitMQ": { "HostName": "localhost", "VirtualHost": "/", "UserName": "guest", "Password": "guest" }, - "AzureServiceBusTopic": { + "azureServiceBusTopic": { "ConnectionString": "Endpoint=sb://xxx.servicebus.windows.net/;SharedAccessKeyName=RMQ-xxxx;SharedAccessKey=xxxx", "TopicName": "topic-name", "SubscriptionName": "subscription-name" }, - "AzureServiceBusQueue": { + "azureServiceBusQueue": { "ConnectionString": "Endpoint=sb://xxx.servicebus.windows.net/;SharedAccessKeyName=RMQ-xxxx;SharedAccessKey=xxxx", "QueueName": "queue-name" }, - "Mongo": { - "ConnectionString": "mongodb://localhost", - "Database": "demo" - }, "mongodb": { "ConnectionString": "mongodb://localhost", "Database": "demo", "enableTracing": true }, - "jwt": { - "ValidIssuer": "http://localhost/Auth", - "ValidAudience": "https://localhost:5000", - "Secret": "<<>>" - }, - "Monitoring": { - "Jaeger": "localhost" - }, - "logger": { - "applicationName": "demo-service", - "excludePaths": [ "/ping", "/metrics" ], - "level": "debug", - "console": { - "enabled": true - }, - "file": { - "enabled": true, - "path": "logs/logs.txt", - "interval": "day" - }, - "azure": { - "enabled": false, - "connectionString": "<>" - } - }, "azureKeyVault": { - "enabled": false, - "name": "<<>>", - "managedIdentityId": "<<>>" + "enabled": true, + "name": "kv-genocs" }, "secrets": { "Secret": "This is a secret coming from the appsettings.json file" From bf42a88da74ce68b2aaef9c3463ac698cc01a145 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 21:00:31 +0200 Subject: [PATCH 13/17] Enhanced app config and documentation - Updated the README.md to clearly list basic infrastructure components including RabbitMQ, Redis, MongoDB, and Postgres. - Standardized MongoDB configuration keys to lowercase in appsettings.json for consistency. - Added Azure Key Vault configuration settings for secure management of secrets. - Modified JWT options in JwtOptions.cs for enhanced flexibility in configuration. - Refactored Prometheus metrics configuration for clarity and set default enabled state to false in development settings. - Enhanced appsettings.json with application instance/version info, improved logging levels, and disabled Prometheus metrics endpoint across configurations for a clearer, more secure, and better-monitored application setup. --- README.md | 13 +++++++++++-- src/Genocs.Auth/Configurations/JwtOptions.cs | 2 +- src/Genocs.Core.Demo.WebApi/appsettings.json | 4 ++-- src/Genocs.Core.Demo.Worker/appsettings.json | 4 ++-- src/Genocs.Metrics/Prometheus/Extensions.cs | 8 ++++---- .../Genocs.APIGateway/appsettings.development.json | 2 +- .../api-gateway/Genocs.APIGateway/appsettings.json | 12 ++++++++---- .../Genocs.Products.WebApi/appsettings.json | 4 ++-- .../signalr/Genocs.SignalR.WebApi/appsettings.json | 4 ++-- 9 files changed, 33 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index e8486356..17ecb458 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,11 @@ docker compose -f ./infrastructure-elk.yml --env-file ./.env --project-name geno docker compose -f ./infrastructure-ml.yml --env-file ./.env --project-name genocs up -d ``` -`infrastructure-bare.yml` allows to install the basic infrastructure components. Basic components are the [RabbitMQ](https://rabbitmq.com), [Redis](https://redis.io), [Mongo](https://mongodb.com), [Postgres](https://www.postgresql.org/). +`infrastructure-bare.yml` allows to install the basic infrastructure components. They are: +- [RabbitMQ](https://rabbitmq.com) +- [Redis](https://redis.io) +- [MongoDB](https://mongodb.com) +- [Postgres](https://www.postgresql.org/). - [rabbitmq](http://localhost:15672/) @@ -260,7 +264,7 @@ Use [**api-workbench**](./api-workbench.rest) inside Visual Studio code with [RE "enabled": false, "endpoint": "/metrics" }, - "mongo": { + "mongodb": { "connectionString": "mongodb://localhost:27017", "database": "genocs-users-service", "seed": false @@ -335,6 +339,11 @@ Use [**api-workbench**](./api-workbench.rest) inside Visual Studio code with [RE "header": "Certificate" } }, + "azureKeyVault": { + "enabled": false, + "name": "gnx-keyvault", + "managedIdentityId": "secret", + }, "vault": { "enabled": false, "url": "http://localhost:8200", diff --git a/src/Genocs.Auth/Configurations/JwtOptions.cs b/src/Genocs.Auth/Configurations/JwtOptions.cs index 44a21d08..615f0c5f 100644 --- a/src/Genocs.Auth/Configurations/JwtOptions.cs +++ b/src/Genocs.Auth/Configurations/JwtOptions.cs @@ -28,7 +28,7 @@ public class JwtOptions public bool SaveToken { get; set; } = true; public bool SaveSigninToken { get; set; } public bool RequireAudience { get; set; } = true; - public bool RequireHttpsMetadata { get; set; } = true; + public bool RequireHttpsMetadata { get; set; } public bool RequireExpirationTime { get; set; } = true; public bool RequireSignedTokens { get; set; } = true; public int ExpiryMinutes { get; set; } diff --git a/src/Genocs.Core.Demo.WebApi/appsettings.json b/src/Genocs.Core.Demo.WebApi/appsettings.json index 1e0d3a92..9b1118fd 100644 --- a/src/Genocs.Core.Demo.WebApi/appsettings.json +++ b/src/Genocs.Core.Demo.WebApi/appsettings.json @@ -48,8 +48,8 @@ "QueueName": "queue-name" }, "mongodb": { - "ConnectionString": "mongodb://localhost", - "Database": "demo", + "connectionString": "mongodb://localhost:27017", + "database": "demo", "enableTracing": true }, "azureKeyVault": { diff --git a/src/Genocs.Core.Demo.Worker/appsettings.json b/src/Genocs.Core.Demo.Worker/appsettings.json index 1993b991..9ebf71e1 100644 --- a/src/Genocs.Core.Demo.Worker/appsettings.json +++ b/src/Genocs.Core.Demo.Worker/appsettings.json @@ -24,8 +24,8 @@ "QueueName": "queue-name" }, "mongodb": { - "ConnectionString": "mongodb://localhost", - "Database": "demo", + "connectionString": "mongodb://localhost:27017", + "database": "demo", "enableTracing": true }, "Monitoring": { diff --git a/src/Genocs.Metrics/Prometheus/Extensions.cs b/src/Genocs.Metrics/Prometheus/Extensions.cs index 59904afe..022afe56 100644 --- a/src/Genocs.Metrics/Prometheus/Extensions.cs +++ b/src/Genocs.Metrics/Prometheus/Extensions.cs @@ -12,9 +12,9 @@ public static class Extensions { public static IGenocsBuilder AddPrometheus(this IGenocsBuilder builder) { - var prometheusOptions = builder.GetOptions(PrometheusOptions.Position); - builder.Services.AddSingleton(prometheusOptions); - if (!prometheusOptions.Enabled) + PrometheusOptions options = builder.GetOptions(PrometheusOptions.Position); + builder.Services.AddSingleton(options); + if (!options.Enabled) { return builder; } @@ -28,7 +28,7 @@ public static IGenocsBuilder AddPrometheus(this IGenocsBuilder builder) public static IApplicationBuilder UsePrometheus(this IApplicationBuilder app) { - var options = app.ApplicationServices.GetRequiredService(); + PrometheusOptions options = app.ApplicationServices.GetRequiredService(); if (!options.Enabled) { return app; diff --git a/src/apps/api-gateway/Genocs.APIGateway/appsettings.development.json b/src/apps/api-gateway/Genocs.APIGateway/appsettings.development.json index c428f22c..12ee80a7 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/appsettings.development.json +++ b/src/apps/api-gateway/Genocs.APIGateway/appsettings.development.json @@ -12,7 +12,7 @@ "enabled": true }, "prometheus": { - "enabled": true + "enabled": false }, "vault": { "enabled": false, diff --git a/src/apps/api-gateway/Genocs.APIGateway/appsettings.json b/src/apps/api-gateway/Genocs.APIGateway/appsettings.json index 3d4010c7..58a302ed 100644 --- a/src/apps/api-gateway/Genocs.APIGateway/appsettings.json +++ b/src/apps/api-gateway/Genocs.APIGateway/appsettings.json @@ -1,7 +1,11 @@ { "app": { "name": "API Gateway", - "service": "api-gateway" + "service": "api-gateway", + "instance": "000001", + "version": "v1.0", + "displayBanner": true, + "displayVersion": true }, "jaeger": { "enabled": true, @@ -28,7 +32,7 @@ "expiry": "01:00:00" }, "logger": { - "level": "information", + "level": "debug", "excludePaths": [ "/", "/ping", @@ -49,7 +53,7 @@ "Token" ], "console": { - "enabled": false + "enabled": true }, "elk": { "enabled": false, @@ -85,7 +89,7 @@ ] }, "prometheus": { - "enabled": true, + "enabled": false, "endpoint": "/metrics" }, "rabbitMq": { diff --git a/src/apps/products/Genocs.Products.WebApi/appsettings.json b/src/apps/products/Genocs.Products.WebApi/appsettings.json index f91c5997..b8b59a9f 100644 --- a/src/apps/products/Genocs.Products.WebApi/appsettings.json +++ b/src/apps/products/Genocs.Products.WebApi/appsettings.json @@ -31,11 +31,11 @@ } }, "logger": { + "level": "information", "applicationName": "products-service", "excludePaths": [ "/ping", "/metrics" ], - "level": "information", "console": { - "enabled": false + "enabled": true }, "file": { "enabled": true, diff --git a/src/apps/signalr/Genocs.SignalR.WebApi/appsettings.json b/src/apps/signalr/Genocs.SignalR.WebApi/appsettings.json index 85b6c681..dead120e 100644 --- a/src/apps/signalr/Genocs.SignalR.WebApi/appsettings.json +++ b/src/apps/signalr/Genocs.SignalR.WebApi/appsettings.json @@ -66,14 +66,14 @@ "expiry": "01:00:00" }, "logger": { + "level": "information", "applicationName": "signalr-service", "excludePaths": [ "/ping", "/metrics" ], - "level": "information", "console": { - "enabled": false + "enabled": true }, "file": { "enabled": true, From ede9ad3256c1ad948b89dddc789d6734ae2eed1a Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Sun, 7 Jul 2024 21:01:46 +0200 Subject: [PATCH 14/17] Refactor configuration naming conventions and add new options --- README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 17ecb458..4aa02b70 100644 --- a/README.md +++ b/README.md @@ -89,11 +89,12 @@ docker compose -f ./infrastructure-ml.yml --env-file ./.env --project-name genoc - [MongoDB](https://mongodb.com) - [Postgres](https://www.postgresql.org/). +You can run them locally: -- [rabbitmq](http://localhost:15672/) -- Redis -- MongoDb -- PostgreSQL +- RrabbitMQ]: `localhost:15672` +- Redis: `localhost:6379` +- MongoDb: `localhost:27017` +- PostgreSQL: `localhost:5432` `infrastructure-monitoring.yml` allows to install the monitoring infrastructure components. @@ -106,6 +107,14 @@ Inside the file you can find: - jaeger - seq + +- Prometheus: `localhost:9090` +- Grafana: `localhost:3000` +- influxdb: `localhost:8086` +- jaeger: `localhost:16686` +- seq: `localhost:5341` + + `infrastructure-scaling.yml` allows to install the scaling infrastructure components. Inside the file you can find: From 06bb32ff452e1e32e94dc5554aa38c7bf7ce5ec8 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Thu, 11 Jul 2024 10:13:36 +0200 Subject: [PATCH 15/17] Refactor auth and update docs - Updated README.md to improve documentation formatting, clarity, and added proper markdown links for MongoDB, Postgres, Prometheus, Grafana, InfluxDB, Jaeger, and Seq. Enhanced descriptions for `infrastructure-monitoring.yml`, `infrastructure-scaling.yml`, and `infrastructure-security.yml`. - Removed unused `using` directives in Extensions.cs and commented out in Program.cs for cleanup. - Removed `System.IdentityModel.Tokens.Jwt` package from Genocs.Auth.csproj, indicating a shift in JWT handling. - Added `UseFirebaseAuthentication` extension method in ServiceCollectionExtensions.cs and updated Program.cs to guide its conditional use, marking a significant update in the application's authentication strategy towards Firebase. - Introduced FirebaseAuthenticationMiddleware.cs to implement Firebase JWT token authentication, integrating Firebase into the application's security mechanisms. - Replaced direct Serilog configuration with `StaticLogger.EnsureInitialized()` in Program.cs for centralized logging setup. --- README.md | 38 ++++++------- src/Genocs.Auth/Extensions.cs | 1 - src/Genocs.Auth/Genocs.Auth.csproj | 5 -- .../Extensions/ServiceCollectionExtensions.cs | 5 ++ .../FirebaseAuthenticationMiddleware.cs | 55 +++++++++++++++++++ src/Genocs.Core.Demo.WebApi/Program.cs | 5 ++ src/Genocs.Core.Demo.Worker/Program.cs | 12 +--- 7 files changed, 85 insertions(+), 36 deletions(-) create mode 100644 src/Genocs.Core.Demo.WebApi/Infrastructure/FirebaseAuthenticationMiddleware.cs diff --git a/README.md b/README.md index 4aa02b70..f5956b24 100644 --- a/README.md +++ b/README.md @@ -91,36 +91,32 @@ docker compose -f ./infrastructure-ml.yml --env-file ./.env --project-name genoc You can run them locally: -- RrabbitMQ]: `localhost:15672` +- [RabbitMQ](http://localhost:15672): `localhost:15672` - Redis: `localhost:6379` -- MongoDb: `localhost:27017` -- PostgreSQL: `localhost:5432` +- MongoDB: `localhost:27017` +- Postgres: `localhost:5432` -`infrastructure-monitoring.yml` allows to install the monitoring infrastructure components. - -Inside the file you can find: - -- Prometheus -- Grafana -- influxdb -- jaeger -- seq +`infrastructure-monitoring.yml` allows to install the monitoring infrastructure components. They are: +- [Prometheus](https://prometheus.io/) +- [Grafana](https://grafana.com/) +- [InfluxDB](https://www.influxdata.com/) +- [Jaeger](https://www.jaegertracing.io/) +- [Seq](https://datalust.co/seq) -- Prometheus: `localhost:9090` -- Grafana: `localhost:3000` -- influxdb: `localhost:8086` -- jaeger: `localhost:16686` -- seq: `localhost:5341` - +You can run them locally: -`infrastructure-scaling.yml` allows to install the scaling infrastructure components. +- [Prometheus](localhost:9090): `localhost:9090` +- [Grafana](localhost:3000): `localhost:3000` +- [InfluxDB](localhost:8086): `localhost:8086` +- [Jaeger](localhost:16686): `localhost:16686` +- [Seq](localhost:5341): `localhost:5341` -Inside the file you can find: +`infrastructure-scaling.yml` allows to install the scaling infrastructure components. They are: - Fabio -- consul +- Consul `infrastructure-security.yml` allows to install the security infrastructure components. diff --git a/src/Genocs.Auth/Extensions.cs b/src/Genocs.Auth/Extensions.cs index 27b6a1d6..b7baabe3 100644 --- a/src/Genocs.Auth/Extensions.cs +++ b/src/Genocs.Auth/Extensions.cs @@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Authorization.Policy; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Protocols; using Microsoft.IdentityModel.Protocols.OpenIdConnect; diff --git a/src/Genocs.Auth/Genocs.Auth.csproj b/src/Genocs.Auth/Genocs.Auth.csproj index 18988efe..4a7fdde9 100644 --- a/src/Genocs.Auth/Genocs.Auth.csproj +++ b/src/Genocs.Auth/Genocs.Auth.csproj @@ -66,9 +66,4 @@ - - - - - diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs index a5d833bf..c1ccbee7 100644 --- a/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -78,4 +78,9 @@ public static IServiceCollection AddCustomMassTransit(this IServiceCollection se return services; } + + public static IApplicationBuilder UseFirebaseAuthentication(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } } diff --git a/src/Genocs.Core.Demo.WebApi/Infrastructure/FirebaseAuthenticationMiddleware.cs b/src/Genocs.Core.Demo.WebApi/Infrastructure/FirebaseAuthenticationMiddleware.cs new file mode 100644 index 00000000..5d0e953a --- /dev/null +++ b/src/Genocs.Core.Demo.WebApi/Infrastructure/FirebaseAuthenticationMiddleware.cs @@ -0,0 +1,55 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; + +namespace Genocs.Core.Demo.WebApi.Infrastructure; + +/// +/// Middleware authentication. Used to implement OpenId JWT implementation. +/// +public class FirebaseAuthenticationMiddleware +{ + private readonly RequestDelegate _next; + + public FirebaseAuthenticationMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext context) + { + string authHeader = context.Request.Headers["Authorization"].ToString(); + + if (authHeader != null && authHeader.StartsWith("Bearer ")) + { + string token = authHeader.Substring("Bearer ".Length).Trim(); + + try + { + var handler = new JwtSecurityTokenHandler(); + var jsonToken = handler.ReadToken(token) as JwtSecurityToken; + + var jwtToken = new JwtSecurityToken(token); + var payload = jwtToken.Payload; + var claims = new[] + { + new Claim(ClaimTypes.NameIdentifier, payload["user_id"].ToString()), + new Claim(ClaimTypes.Name, payload["name"].ToString()), + + // Add more claims as needed + }; + + var identity = new ClaimsIdentity(claims, "Firebase"); + context.User = new ClaimsPrincipal(identity); + } + catch (Exception ex) + { + // Token validation failed + context.Response.StatusCode = 401; + await context.Response.WriteAsync("Unauthorized"); + return; + } + } + + await _next(context); + } +} \ No newline at end of file diff --git a/src/Genocs.Core.Demo.WebApi/Program.cs b/src/Genocs.Core.Demo.WebApi/Program.cs index 9a80f8a1..e49b96f9 100644 --- a/src/Genocs.Core.Demo.WebApi/Program.cs +++ b/src/Genocs.Core.Demo.WebApi/Program.cs @@ -1,3 +1,4 @@ +// using Genocs.Auth; using Genocs.Core.Builders; using Genocs.Core.Demo.WebApi.Configurations; using Genocs.Core.Demo.WebApi.Infrastructure.Extensions; @@ -22,6 +23,7 @@ services .AddGenocs(builder.Configuration) +// .AddOpenIdJwt() .AddOpenTelemetry() .AddMongoFast() .RegisterMongoRepositories(Assembly.GetExecutingAssembly()) @@ -79,6 +81,9 @@ app.UseAuthorization(); +// Use it only if you need to authenticate with Firebase +// app.UseFirebaseAuthentication(); + app.MapControllers(); app.MapHealthChecks("/hc"); diff --git a/src/Genocs.Core.Demo.Worker/Program.cs b/src/Genocs.Core.Demo.Worker/Program.cs index 6f6931c9..5e752d01 100644 --- a/src/Genocs.Core.Demo.Worker/Program.cs +++ b/src/Genocs.Core.Demo.Worker/Program.cs @@ -7,27 +7,21 @@ using Genocs.Core.Demo.Worker.Consumers; using Genocs.Core.Demo.Worker.Handlers; using Genocs.Logging; -using Genocs.Tracing; using Genocs.Persistence.MongoDb.Extensions; using Genocs.Persistence.MongoDb.Repositories; using Genocs.Persistence.MongoDb.Repositories.Clean; +using Genocs.ServiceBusAzure.Configurations; using Genocs.ServiceBusAzure.Queues; using Genocs.ServiceBusAzure.Queues.Interfaces; using Genocs.ServiceBusAzure.Topics; using Genocs.ServiceBusAzure.Topics.Interfaces; +using Genocs.Tracing; using MassTransit; using Microsoft.Extensions.DependencyInjection.Extensions; using Serilog; -using Serilog.Events; using System.Reflection; -using Genocs.ServiceBusAzure.Configurations; -Log.Logger = new LoggerConfiguration() - .MinimumLevel.Information() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .CreateLogger(); +StaticLogger.EnsureInitialized(); IHost host = Host.CreateDefaultBuilder(args) .UseLogging() From 85198fbd504da2e98499783f0d85eb6fcccab91d Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Fri, 19 Jul 2024 21:14:00 +0200 Subject: [PATCH 16/17] Refactor auth and update docs --- README.md | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index f5956b24..cfa62317 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ # Genocs .NET library -This repo contains a set of libraries designed by Genocs. The library is built on top of .NET8. +This repo contains a set of libraries to build LOB (Line Of Business) applications. The library is open source and built to be PRODUCTION READY. The library is built on top of .NET8, it is designed and maintained by Genocs. Packages are available on [NuGet Genocs](https://www.nuget.org/profiles/gioema_nocco). @@ -59,10 +59,16 @@ Building a software library to be cloud agnostic has several advantages. First, The advantages of using containers are numerous. Containers provide a lightweight, portable, and isolated environment for applications to run in, allowing them to be easily moved between different systems. This makes it easier to deploy applications quickly and reliably across different environments. Additionally, containers can help reduce resource consumption by running multiple applications on the same host, as each container is isolated from the others. This helps to improve efficiency and scalability. Finally, containers provide an additional layer of security, as they are isolated from the underlying operating system and other applications. +## Documentation + +You can find a useful documentation about how to use the library. The documentation contains the complete set of libraries, template, CLI that altogether make the *genocs ecosystem* a comprensive set of tools to build enterprise solutions. + +Documentation available at [Genocs Blog](https://genocs-blog.netlify.app/library/) + ## Infrastructure -In this section you can find the infrastructure components to setup the environment. -You will use ***Docker compose*** to setup the infrastructure components. +In this section you can find the infrastructure components you need to execute the solution. Infrastucture components are the database, the enterprice servise bus, the distributed logging, monitoring, tracing systems along with database and many more. +You can use **Docker compose** to setup the infrastructure components just by running few commands. ``` bash @@ -145,16 +151,8 @@ You can setup the application inside a Kubernetes cluster. Check the repo [enterprise-containers](https://github.com/Genocs/enterprise-containers) to setup a Kubernetes cluster. There you can find scripts, configuration files and documentation to setup a cluster from scratch. -## **Libraries** -You can find a full documentation on: -[**Documentation**](https://genocs-blog.netlify.app/library/) - - - ## Support - - Use [**api-workbench**](./api-workbench.rest) inside Visual Studio code with [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) plugin ## Configuration @@ -385,7 +383,8 @@ Use [**api-workbench**](./api-workbench.rest) inside Visual Studio code with [RE ## Demo Application Inside the library there is a simple demo application you can use to test the library. -Some commands +Following are the commands to build and run the demo application. + ``` bash # Build the solution dotnet build @@ -425,13 +424,11 @@ docker build -t genocs/demo-worker:2.0.0 -t genocs/demo-worker:latest -f ./demo- docker push genocs/demo-worker:2.0.0 docker push genocs/demo-worker:latest ``` - - --- +--- ## Enterprise Application - -Take a look inside **./src/apps** folder. There you can find a full-fledged application composed by: +Inside **./src/apps** folder you can find a full-fledged application composed by: - ApiGateway - Identity Service - Order Service @@ -440,6 +437,7 @@ Take a look inside **./src/apps** folder. There you can find a full-fledged appl In that way you can test the entire flow. +**TODO**: Add a architecture diagram to show the components and how they interact with each other. ### How to BUILD & RUN the application @@ -509,9 +507,9 @@ You can deploy Demo Application with one click in Heroku, Microsoft Azure, or Go This project is licensed with the [MIT license](LICENSE). -## Changelogs +## Changelog -View Complete [Changelogs](https://github.com/Genocs/microservice-template/blob/main/CHANGELOGS.md). +View Complete [Changelog](https://github.com/Genocs/microservice-template/blob/main/CHANGELOG.md). ## Community From a63d816a4b617246ec99b3400d019a1b46ff40b0 Mon Sep 17 00:00:00 2001 From: Nocco Giovanni Emanuele Date: Fri, 19 Jul 2024 21:23:52 +0200 Subject: [PATCH 17/17] Refactor auth and update docs --- CHANGELOG.md | 60 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45949c32..d248da67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,27 +1,59 @@ -### Changelog +# Changelog -All notable changes to this project will be documented in this file. Dates are displayed in UTC. +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [6.0.0-preview.2.0](https://github.com/Genocs/genocs-library/compare/v5.0.0-preview.4.0...6.0.0-preview.2.0) - 2024-07-19 + +### Merged + +- Bump prometheus-net from 5.0.2 to 8.2.1 [`#54`](https://github.com/Genocs/genocs-library/pull/54) +- Bump System.IdentityModel.Tokens.Jwt from 7.0.3 to 7.1.2 in /src/Genocs.Auth [`#56`](https://github.com/Genocs/genocs-library/pull/56) +- Bump Polly from 8.2.0 to 8.2.1 [`#55`](https://github.com/Genocs/genocs-library/pull/55) +- Bump Microsoft.VisualStudio.Azure.Containers.Tools.Targets from 1.19.5 to 1.19.6 [`#53`](https://github.com/Genocs/genocs-library/pull/53) +- Bump Moq from 4.20.69 to 4.20.70 [`#52`](https://github.com/Genocs/genocs-library/pull/52) +- Net8 [`#35`](https://github.com/Genocs/genocs-library/pull/35) +- Bump Serilog.Sinks.Seq from 5.1.0 to 5.2.3 [`#21`](https://github.com/Genocs/genocs-library/pull/21) +- Bump Serilog.Sinks.ElasticSearch from 8.4.1 to 9.0.3 [`#18`](https://github.com/Genocs/genocs-library/pull/18) + +### Commits + +- Added documentation and more control over types [`3d4c17e`](https://github.com/Genocs/genocs-library/commit/3d4c17e0e501d9174160f01569d2523472085a04) +- Refactor configs and update docs across projects [`504fc40`](https://github.com/Genocs/genocs-library/commit/504fc40ee05a1ed6bc838a5b08195cb285feb8c1) +- Merge issues [`cc6c097`](https://github.com/Genocs/genocs-library/commit/cc6c097d28854b584d3df34f9dc3ea6c4be78db9) + +## [v5.0.0-preview.4.0](https://github.com/Genocs/genocs-library/compare/v5.0.0-preview.3.0...v5.0.0-preview.4.0) - 2023-07-15 -## [0.0.1](https://github.com/Genocs/telegram-integration/compare/v0.1.0...v0.1.1) (2023-06-02) +### Merged -### Features +- April 2023 [`#17`](https://github.com/Genocs/genocs-library/pull/17) +- Create ml.yml [`#14`](https://github.com/Genocs/genocs-library/pull/14) +- April 2023 [`#12`](https://github.com/Genocs/genocs-library/pull/12) +- April 2023 [`#11`](https://github.com/Genocs/genocs-library/pull/11) -- Added [editorconfig](https://editorconfig.org/) -- Added StyleCop -- Updated logo -- Updated readme +### Commits -### Bug Fixes +- Preview 4.x [`d619840`](https://github.com/Genocs/genocs-library/commit/d619840033c146a60bdb5fe6f37ea7e6e7ae5de7) +- Start removing legacy MongoDB legacy database [`f4ca960`](https://github.com/Genocs/genocs-library/commit/f4ca9609ef11ad550c789e05dbfd6c0984fa312b) +- Refactory to remove legacy Mongodb [`7accdcb`](https://github.com/Genocs/genocs-library/commit/7accdcba26edb9e38ebf0583966348f80a2d31b1) -* +## v5.0.0-preview.3.0 - 2023-05-13 -### Documentation +### Merged -* +- March 2023 [`#9`](https://github.com/Genocs/genocs-library/pull/9) +- Create docker-image.yml [`#6`](https://github.com/Genocs/genocs-library/pull/6) +- Create nuget-deploy.yml [`#5`](https://github.com/Genocs/genocs-library/pull/5) +- Added explicitly build [`#3`](https://github.com/Genocs/genocs-library/pull/3) +- Develop [`#2`](https://github.com/Genocs/genocs-library/pull/2) +- Bump Microsoft.AspNetCore.Authentication.JwtBearer from 5.0.6 to 5.0.9 in /src/Genocs.Core.Demo.WebApi [`#1`](https://github.com/Genocs/genocs-library/pull/1) -### Dependencies +### Commits -* +- Added SignalR service [`8a6faee`](https://github.com/Genocs/genocs-library/commit/8a6faeef4c6c2dec473abb1e86fe55a9e24f87c5) +- Added template [`98884b0`](https://github.com/Genocs/genocs-library/commit/98884b034910bc8d4c912344fe2ce0f54b4e7aaa) +- Upated to net7 [`2cbc3f8`](https://github.com/Genocs/genocs-library/commit/2cbc3f8b6cefb5cfe153b3aba8a28d5f425804dc)