diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ee4bb88..5d5d857 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,13 +2,15 @@ name: Main on: push: - branches: [ main, feature/*, hotfix/* ] + branches: + - main pull_request: - branches: [ main, feature/*, hotfix/* ] + branches: + - main jobs: - - build: + + code-validation: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -16,37 +18,11 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: 9.0.x - - name: Restore dependencies + - name: Restore run: dotnet restore --property NuGetAudit=true --property NuGetAuditMode=All --property NuGetAuditLevel=Moderate - name: Build run: dotnet build --no-restore - - test: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 9.0.x - - name: Restore dependencies - run: dotnet restore - - name: Build - run: dotnet build --no-restore - name: Test - run: dotnet test --no-build --verbosity normal - - analisys: - needs: test - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 9.0.x - - name: Generate coverage report run: dotnet test /p:CollectCoverage=true /p:ExcludeByAttribute="GeneratedCodeAttribute" /p:ExcludeByAttribute="CompilerGeneratedAttribute" /p:CoverletOutputFormat=\"json,cobertura\" /p:CoverletOutput=../../coverage/ /p:MergeWith=../../coverage/coverage.json - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 diff --git a/src/AuthorizationInterceptor.Extensions.Abstractions/Json/AuthorizationHeadersJsonSerializer.cs b/src/AuthorizationInterceptor.Extensions.Abstractions/Json/AuthorizationHeadersJsonSerializer.cs index 4a592a1..fd7b5d7 100644 --- a/src/AuthorizationInterceptor.Extensions.Abstractions/Json/AuthorizationHeadersJsonSerializer.cs +++ b/src/AuthorizationInterceptor.Extensions.Abstractions/Json/AuthorizationHeadersJsonSerializer.cs @@ -6,7 +6,7 @@ namespace AuthorizationInterceptor.Extensions.Abstractions.Json; /// /// A Json Serializer for the class. Used to print or save in a format where data loss does not occur. /// -public class AuthorizationHeadersJsonSerializer +public static class AuthorizationHeadersJsonSerializer { /// /// Custom converter used to print or save in a format where data loss does not occur. diff --git a/src/AuthorizationInterceptor.Extensions.HybridCache/AuthorizationInterceptor.Extensions.HybridCache.csproj b/src/AuthorizationInterceptor.Extensions.HybridCache/AuthorizationInterceptor.Extensions.HybridCache.csproj index 58fe057..7204589 100644 --- a/src/AuthorizationInterceptor.Extensions.HybridCache/AuthorizationInterceptor.Extensions.HybridCache.csproj +++ b/src/AuthorizationInterceptor.Extensions.HybridCache/AuthorizationInterceptor.Extensions.HybridCache.csproj @@ -1,4 +1,7 @@  + + net8.0;net9.0 + diff --git a/src/AuthorizationInterceptor.Extensions.HybridCache/Interceptors/HybridCacheAuthorizationInterceptor.cs b/src/AuthorizationInterceptor.Extensions.HybridCache/Interceptors/HybridCacheAuthorizationInterceptor.cs index 0764e56..4ea5009 100644 --- a/src/AuthorizationInterceptor.Extensions.HybridCache/Interceptors/HybridCacheAuthorizationInterceptor.cs +++ b/src/AuthorizationInterceptor.Extensions.HybridCache/Interceptors/HybridCacheAuthorizationInterceptor.cs @@ -12,7 +12,7 @@ internal sealed class HybridCacheAuthorizationInterceptor(Microsoft.Extensions.C public async ValueTask GetHeadersAsync(string name, CancellationToken cancellationToken) { var data = await hybridCache.GetOrCreateAsync(string.Format(CacheKey, name), - _ => ValueTask.FromResult((string?)null), + _ => ValueTask.FromResult(null), new HybridCacheEntryOptions { Flags = HybridCacheEntryFlags.DisableLocalCacheWrite | HybridCacheEntryFlags.DisableDistributedCacheWrite }, cancellationToken: cancellationToken); return string.IsNullOrEmpty(data) ? null : AuthorizationHeadersJsonSerializer.Deserialize(data); diff --git a/src/AuthorizationInterceptor.Extensions.MemoryCache/Interceptors/MemoryCacheInterceptor.cs b/src/AuthorizationInterceptor.Extensions.MemoryCache/Interceptors/MemoryCacheInterceptor.cs index 96e3aba..dbaffbe 100644 --- a/src/AuthorizationInterceptor.Extensions.MemoryCache/Interceptors/MemoryCacheInterceptor.cs +++ b/src/AuthorizationInterceptor.Extensions.MemoryCache/Interceptors/MemoryCacheInterceptor.cs @@ -13,7 +13,7 @@ internal class MemoryCacheInterceptor(IMemoryCache memoryCache) : IAuthorization cancellationToken.ThrowIfCancellationRequested(); var headers = memoryCache.Get(string.Format(CacheKey, name)); - return new(headers); + return new ValueTask(headers); } public ValueTask UpdateHeadersAsync(string name, AuthorizationHeaders? expiredHeaders, AuthorizationHeaders? newHeaders, CancellationToken cancellationToken) diff --git a/src/AuthorizationInterceptor/Handlers/AuthorizationInterceptorHandler.cs b/src/AuthorizationInterceptor/Handlers/AuthorizationInterceptorHandler.cs index 6c14319..2537785 100644 --- a/src/AuthorizationInterceptor/Handlers/AuthorizationInterceptorHandler.cs +++ b/src/AuthorizationInterceptor/Handlers/AuthorizationInterceptorHandler.cs @@ -1,7 +1,7 @@ using AuthorizationInterceptor.Extensions.Abstractions.Handlers; using AuthorizationInterceptor.Extensions.Abstractions.Headers; -using AuthorizationInterceptor.Log; using AuthorizationInterceptor.Strategies; +using AuthorizationInterceptor.Utils; using Microsoft.Extensions.Logging; namespace AuthorizationInterceptor.Handlers; diff --git a/src/AuthorizationInterceptor/Options/AuthorizationInterceptorOptions.cs b/src/AuthorizationInterceptor/Options/AuthorizationInterceptorOptions.cs index ce75bbe..3f90ce0 100644 --- a/src/AuthorizationInterceptor/Options/AuthorizationInterceptorOptions.cs +++ b/src/AuthorizationInterceptor/Options/AuthorizationInterceptorOptions.cs @@ -21,8 +21,8 @@ public class AuthorizationInterceptorOptions : IAuthorizationInterceptorOptions /// Adds a custom interceptor to the interceptor sequence. Note that the interceptor addition sequence interferes with the headers query sequence. /// /// Implementation class of type - /// Access to if necessary inject some dependencies - public void UseCustomInterceptor(Func? func = null) where T : IAuthorizationInterceptor - => Interceptors.Add((typeof(T), func)); + /// Access to if necessary to inject some dependencies + public void UseCustomInterceptor(Func? services = null) where T : IAuthorizationInterceptor + => Interceptors.Add((typeof(T), services)); } diff --git a/src/AuthorizationInterceptor/Strategies/AuthorizationInterceptorStrategy.cs b/src/AuthorizationInterceptor/Strategies/AuthorizationInterceptorStrategy.cs index 7fb41e2..b72cf1f 100644 --- a/src/AuthorizationInterceptor/Strategies/AuthorizationInterceptorStrategy.cs +++ b/src/AuthorizationInterceptor/Strategies/AuthorizationInterceptorStrategy.cs @@ -1,21 +1,15 @@ using AuthorizationInterceptor.Extensions.Abstractions.Handlers; using AuthorizationInterceptor.Extensions.Abstractions.Headers; using AuthorizationInterceptor.Extensions.Abstractions.Interceptors; -using AuthorizationInterceptor.Log; +using AuthorizationInterceptor.Utils; using Microsoft.Extensions.Logging; namespace AuthorizationInterceptor.Strategies; -internal class AuthorizationInterceptorStrategy : IAuthorizationInterceptorStrategy +internal class AuthorizationInterceptorStrategy(ILoggerFactory loggerFactory, IAuthorizationInterceptor[] interceptors) + : IAuthorizationInterceptorStrategy { - private readonly IAuthorizationInterceptor[] _interceptors; - private readonly ILogger _logger; - - public AuthorizationInterceptorStrategy(ILoggerFactory loggerFactory, IAuthorizationInterceptor[] interceptors) - { - _logger = loggerFactory.CreateLogger("AuthorizationInterceptorStrategy"); - _interceptors = interceptors; - } + private readonly ILogger _logger = loggerFactory.CreateLogger("AuthorizationInterceptorStrategy"); public async ValueTask GetHeadersAsync(string name, IAuthenticationHandler authenticationHandler, CancellationToken cancellationToken) { @@ -24,37 +18,37 @@ public AuthorizationInterceptorStrategy(ILoggerFactory loggerFactory, IAuthoriza AuthorizationHeaders? headers = null; int index; - for (index = 0; index < _interceptors.Length; index++) + for (index = 0; index < interceptors.Length; index++) { try { - LogDebug("Getting headers from interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + LogDebug("Getting headers from interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); cancellationToken.ThrowIfCancellationRequested(); - headers = await _interceptors[index].GetHeadersAsync(name, cancellationToken); + headers = await interceptors[index].GetHeadersAsync(name, cancellationToken); if (headers == null) continue; - LogDebug("Headers found in interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + LogDebug("Headers found in interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); if (headers.IsHeadersValid()) { - LogDebug("Headers still valid in interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + LogDebug("Headers still valid in interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); return await UpdateHeadersInInterceptorsAsync(name, index, headers, cancellationToken); } - LogDebug("Headers is expired in interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + LogDebug("Headers is expired in interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); break; } catch (OperationCanceledException) { - _logger.LogOperationCanceledInInterceptor(_interceptors[index].GetType().Name, name); + _logger.LogOperationCanceledInInterceptor(interceptors[index].GetType().Name, name); throw; } catch (Exception ex) { - _logger.LogError(ex, "Error getting headers from interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + _logger.LogError(ex, "Error getting headers from interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); } } @@ -74,7 +68,7 @@ public AuthorizationInterceptorStrategy(ILoggerFactory loggerFactory, IAuthoriza return null; } - return await UpdateHeadersInInterceptorsAsync(name, _interceptors.Length, newHeaders, cancellationToken); + return await UpdateHeadersInInterceptorsAsync(name, interceptors.Length, newHeaders, cancellationToken); } private async ValueTask UpdateHeadersInInterceptorsAsync(string name, int startIndex, AuthorizationHeaders? headers, CancellationToken cancellationToken) @@ -88,20 +82,20 @@ public AuthorizationInterceptorStrategy(ILoggerFactory loggerFactory, IAuthoriza { try { - LogDebug("Updating headers in interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + LogDebug("Updating headers in interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); cancellationToken.ThrowIfCancellationRequested(); - await _interceptors[index].UpdateHeadersAsync(name, null, headers, cancellationToken); + await interceptors[index].UpdateHeadersAsync(name, null, headers, cancellationToken); } catch (OperationCanceledException) { - _logger.LogOperationCanceledInInterceptor(_interceptors[index].GetType().Name, name); + _logger.LogOperationCanceledInInterceptor(interceptors[index].GetType().Name, name); throw; } catch (Exception ex) { - _logger.LogError(ex, "Error updating headers in interceptor '{interceptor}' with integration '{name}'", _interceptors[index].GetType().Name, name); + _logger.LogError(ex, "Error updating headers in interceptor '{interceptor}' with integration '{name}'", interceptors[index].GetType().Name, name); } } diff --git a/src/AuthorizationInterceptor/Log/AuthorizationInterceptorLogDifinitions.cs b/src/AuthorizationInterceptor/Utils/AuthorizationInterceptorLogDefinitions.cs similarity index 84% rename from src/AuthorizationInterceptor/Log/AuthorizationInterceptorLogDifinitions.cs rename to src/AuthorizationInterceptor/Utils/AuthorizationInterceptorLogDefinitions.cs index 5480d57..34c58b3 100644 --- a/src/AuthorizationInterceptor/Log/AuthorizationInterceptorLogDifinitions.cs +++ b/src/AuthorizationInterceptor/Utils/AuthorizationInterceptorLogDefinitions.cs @@ -1,8 +1,10 @@ using Microsoft.Extensions.Logging; +using System.Diagnostics.CodeAnalysis; -namespace AuthorizationInterceptor.Log; +namespace AuthorizationInterceptor.Utils; -public static partial class AuthorizationInterceptorLogDifinitions +[ExcludeFromCodeCoverage] +public static partial class AuthorizationInterceptorLogDefinitions { [LoggerMessage(EventId = 1, Level = LogLevel.Warning, Message = "No interceptor was configured for HttpClient `{httpClientName}`. A Runtime interceptor was used instead. It is recommended to use at least the MemoryCache interceptor.")] public static partial void LogNoInterceptorUsed(this ILogger logger, string httpClientName); diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 4db61a9..5a36fce 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -3,7 +3,7 @@ 13 enable enable - 5.0.0-preview-1 + 5.0.0 net6.0;net7.0;net8.0;net9.0 Authorization Interceptor Adolfok3 diff --git a/tests/AuthorizationInterceptor.Tests/Extensions/HttpClientBuilderExtensionsTests.cs b/tests/AuthorizationInterceptor.Tests/Extensions/HttpClientBuilderExtensionsTests.cs index 9345c98..79b5deb 100644 --- a/tests/AuthorizationInterceptor.Tests/Extensions/HttpClientBuilderExtensionsTests.cs +++ b/tests/AuthorizationInterceptor.Tests/Extensions/HttpClientBuilderExtensionsTests.cs @@ -51,7 +51,7 @@ public void AddAuthorizationInterceptorHandler_WithOptions_ShouldBuildServicePro services.AddHttpClient("Test") .AddAuthorizationInterceptorHandler(options => { - options.UseCustomInterceptor(); + options.UseCustomInterceptor(func => func.AddSingleton()); }); // Act diff --git a/tests/AuthorizationInterceptor.Tests/Handlers/AuthorizationInterceptorHandlerTests.cs b/tests/AuthorizationInterceptor.Tests/Handlers/AuthorizationInterceptorHandlerTests.cs index 60d9126..beb9f77 100644 --- a/tests/AuthorizationInterceptor.Tests/Handlers/AuthorizationInterceptorHandlerTests.cs +++ b/tests/AuthorizationInterceptor.Tests/Handlers/AuthorizationInterceptorHandlerTests.cs @@ -1,9 +1,9 @@ using AuthorizationInterceptor.Extensions.Abstractions.Handlers; using AuthorizationInterceptor.Extensions.Abstractions.Headers; using AuthorizationInterceptor.Handlers; -using AuthorizationInterceptor.Log; using AuthorizationInterceptor.Strategies; using AuthorizationInterceptor.Tests.Utils; +using AuthorizationInterceptor.Utils; using Microsoft.Extensions.Logging; namespace AuthorizationInterceptor.Tests.Handlers;