< Summary

Information
Class: Elsa.Identity.Services.MemoryUserStore
Assembly: Elsa.Identity
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/MemoryUserStore.cs
Line coverage
68%
Covered lines: 11
Uncovered lines: 5
Coverable lines: 16
Total lines: 67
Line coverage: 68.7%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
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(...)100%11100%
DeleteAsync(...)100%210%
FindManyAsync(...)100%210%
FindAsync(...)100%11100%
Filter(...)100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/MemoryUserStore.cs

#LineLine coverage
 1using Elsa.Common.Multitenancy;
 2using Elsa.Common.Services;
 3using Elsa.Identity.Contracts;
 4using Elsa.Identity.Entities;
 5using Elsa.Identity.Models;
 6
 7namespace Elsa.Identity.Services;
 8
 9/// <summary>
 10/// Represents an in-memory user store.
 11/// </summary>
 12public class MemoryUserStore : IUserStore
 13{
 14    private readonly MemoryStore<User> _store;
 15    private readonly ITenantAccessor _tenantAccessor;
 16
 17    /// <summary>
 18    /// Initializes a new instance of the <see cref="MemoryUserStore"/> class.
 19    /// </summary>
 320    public MemoryUserStore(MemoryStore<User> store, ITenantAccessor tenantAccessor)
 21    {
 322        _store = store;
 323        _tenantAccessor = tenantAccessor;
 324    }
 25
 26    /// <inheritdoc />
 27    public Task SaveAsync(User user, CancellationToken cancellationToken = default)
 28    {
 429        _store.Save(user, x => x.Id);
 230        return Task.CompletedTask;
 31    }
 32
 33    /// <inheritdoc />
 34    public Task DeleteAsync(UserFilter filter, CancellationToken cancellationToken = default)
 35    {
 036        var ids = _store.Query(query => Filter(query, filter)).Select(x => x.Id).Distinct().ToList();
 037        _store.DeleteWhere(x => ids.Contains(x.Id));
 038        return Task.CompletedTask;
 39    }
 40
 41    /// <inheritdoc />
 42    public Task<IEnumerable<User>> FindManyAsync(UserFilter filter, CancellationToken cancellationToken = default)
 43    {
 044        var result = _store.Query(query => Filter(query, filter)).ToList();
 045        return Task.FromResult<IEnumerable<User>>(result);
 46    }
 47
 48    /// <inheritdoc />
 49    public Task<User?> FindAsync(UserFilter filter, CancellationToken cancellationToken = default)
 50    {
 451        var result = _store.Query(query => Filter(query, filter)).FirstOrDefault();
 252        return Task.FromResult(result);
 53    }
 54
 55    /// <remarks>
 56    /// The ambient tenant is applied here rather than left to callers. Isolation previously existed only
 57    /// on the Entity Framework path, and only when multitenancy was enabled, so a deployment running the
 58    /// default in-memory stores had none at all.
 59    /// </remarks>
 60    private IQueryable<User> Filter(IQueryable<User> queryable, UserFilter filter)
 61    {
 262        var tenantId = _tenantAccessor.TenantId;
 263        queryable = queryable.Where(x => x.TenantId == tenantId || x.TenantId == Tenant.AgnosticTenantId || x.TenantId =
 64
 265        return filter.Apply(queryable);
 66    }
 67}