< Summary

Information
Class: Elsa.ExternalAuthentication.Stores.InMemory.InMemoryAuthorizationGrantStore
Assembly: Elsa.ExternalAuthentication
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.ExternalAuthentication/Stores/InMemory/InMemoryAuthorizationGrantStore.cs
Line coverage
94%
Covered lines: 34
Uncovered lines: 2
Coverable lines: 36
Total lines: 65
Line coverage: 94.4%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
SaveAsync(...)50%2285.71%
TryTakeAsync(...)83.33%6690.9%
Clone(...)100%11100%
.ctor(...)100%11100%
get_Grant()100%11100%
get_IsConsumed()100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.ExternalAuthentication/Stores/InMemory/InMemoryAuthorizationGrantStore.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.ExternalAuthentication.Contracts;
 3using Elsa.ExternalAuthentication.Models;
 4
 5namespace Elsa.ExternalAuthentication.Stores.InMemory;
 6
 407public sealed class InMemoryAuthorizationGrantStore(ISystemClock clock) : IAuthorizationGrantStore
 8{
 409    private readonly object _syncRoot = new();
 4010    private readonly Dictionary<string, GrantEntry> _entries = new(StringComparer.Ordinal);
 11
 12    public ValueTask SaveAsync(AuthorizationGrant grant, CancellationToken cancellationToken = default)
 13    {
 1414        cancellationToken.ThrowIfCancellationRequested();
 15
 1416        lock (_syncRoot)
 17        {
 1418            if (_entries.ContainsKey(grant.CodeHash))
 019                throw new InvalidOperationException("An authorization grant already exists for the supplied code hash.")
 20
 1421            _entries[grant.CodeHash] = new(Clone(grant));
 1422        }
 23
 1424        return ValueTask.CompletedTask;
 25    }
 26
 27    public ValueTask<TakeResult<AuthorizationGrant>> TryTakeAsync(string codeHash, CancellationToken cancellationToken =
 28    {
 2729        cancellationToken.ThrowIfCancellationRequested();
 30
 2731        lock (_syncRoot)
 32        {
 2733            if (!_entries.TryGetValue(codeHash, out var entry))
 034                return ValueTask.FromResult<TakeResult<AuthorizationGrant>>(new TakeResult<AuthorizationGrant>.NotFound(
 35
 2736            if (entry.Grant.ExpiresAt <= clock.UtcNow)
 237                return ValueTask.FromResult<TakeResult<AuthorizationGrant>>(new TakeResult<AuthorizationGrant>.Expired()
 38
 2539            if (entry.IsConsumed)
 1940                return ValueTask.FromResult<TakeResult<AuthorizationGrant>>(new TakeResult<AuthorizationGrant>.AlreadyCo
 41
 642            entry.IsConsumed = true;
 643            return ValueTask.FromResult<TakeResult<AuthorizationGrant>>(new TakeResult<AuthorizationGrant>.Taken(Clone(e
 44        }
 2745    }
 46
 2047    private static AuthorizationGrant Clone(AuthorizationGrant grant) => new()
 2048    {
 2049        CodeHash = grant.CodeHash,
 2050        ClientId = grant.ClientId,
 2051        CallbackUri = grant.CallbackUri,
 2052        TenantId = grant.TenantId,
 2053        UserId = grant.UserId,
 2054        ExternalSessionId = grant.ExternalSessionId,
 2055        PkceChallenge = grant.PkceChallenge,
 2056        ExpiresAt = grant.ExpiresAt,
 2057        ConsumedAt = grant.ConsumedAt
 2058    };
 59
 1460    private sealed class GrantEntry(AuthorizationGrant grant)
 61    {
 4762        public AuthorizationGrant Grant { get; } = grant;
 3163        public bool IsConsumed { get; set; }
 64    }
 65}