< Summary

Information
Class: Elsa.Persistence.EFCore.EntityHandlers.SetTenantIdFilter
Assembly: Elsa.Persistence.EFCore.Common
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Persistence.EFCore.Common/EntityHandlers/SetTenantIdFilter.cs
Line coverage
100%
Covered lines: 20
Uncovered lines: 0
Coverable lines: 20
Total lines: 47
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Handle(...)100%22100%
CreateTenantFilterExpression(...)100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Persistence.EFCore.Common/EntityHandlers/SetTenantIdFilter.cs

#LineLine coverage
 1using System.Linq.Expressions;
 2using Elsa.Common.Entities;
 3using Elsa.Common.Multitenancy;
 4using Microsoft.EntityFrameworkCore;
 5using Microsoft.EntityFrameworkCore.Metadata;
 6
 7namespace Elsa.Persistence.EFCore.EntityHandlers;
 8
 9/// <summary>
 10/// Represents a class that applies a filter to set the TenantId for entities.
 11/// </summary>
 12public class SetTenantIdFilter : IEntityModelCreatingHandler
 13{
 14    /// <inheritdoc />
 15    public void Handle(ElsaDbContextBase dbContext, ModelBuilder modelBuilder, IMutableEntityType entityType)
 16    {
 17417        if (!typeof(Entity).IsAssignableFrom(entityType.ClrType))
 9018            return;
 19
 8420        modelBuilder
 8421            .Entity(entityType.ClrType)
 8422            .HasQueryFilter(CreateTenantFilterExpression(dbContext, entityType.ClrType));
 8423    }
 24
 25    private LambdaExpression CreateTenantFilterExpression(ElsaDbContextBase dbContext, Type clrType)
 26    {
 8427        var parameter = Expression.Parameter(clrType, "e");
 28
 29        // e => EF.Property<string>(e, "TenantId") == this.TenantId || EF.Property<string>(e, "TenantId") == "*"
 8430        var tenantIdProperty = Expression.Call(
 8431            typeof(EF),
 8432            nameof(EF.Property),
 8433            [typeof(string)],
 8434            parameter,
 8435            Expression.Constant("TenantId"));
 36
 8437        var tenantIdOnContext = Expression.Property(
 8438            Expression.Constant(dbContext),
 8439            nameof(ElsaDbContextBase.TenantId));
 40
 8441        var equalityCheck = Expression.Equal(tenantIdProperty, tenantIdOnContext);
 8442        var agnosticCheck = Expression.Equal(tenantIdProperty, Expression.Constant(Tenant.AgnosticTenantId, typeof(strin
 8443        var body = Expression.OrElse(equalityCheck, agnosticCheck);
 44
 8445        return Expression.Lambda(body, parameter);
 46    }
 47}