Browse Source

Merge pull request #22632 from abpframework/EditionId

Add `EditionId` to `TenantConfiguration` and use it in `EditionFeatureValueProvider`.
pull/22996/head
Halil İbrahim Kalkan 1 year ago
committed by GitHub
parent
commit
18d1feabbf
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      .github/workflows/build-and-test.yml
  2. 37
      framework/src/Volo.Abp.Features/Volo/Abp/Features/EditionFeatureValueProvider.cs
  3. 5
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs
  4. 50
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs
  5. 3
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs

2
.github/workflows/build-and-test.yml

@ -48,7 +48,7 @@ permissions:
jobs:
build-test:
runs-on: ubuntu-22.04
timeout-minutes: 40
timeout-minutes: 50
if: ${{ !github.event.pull_request.draft }}
steps:
- uses: actions/checkout@v2

37
framework/src/Volo.Abp.Features/Volo/Abp/Features/EditionFeatureValueProvider.cs

@ -1,5 +1,7 @@
using System.Security.Principal;
using System;
using System.Security.Principal;
using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security.Claims;
namespace Volo.Abp.Features;
@ -12,15 +14,25 @@ public class EditionFeatureValueProvider : FeatureValueProvider
protected ICurrentPrincipalAccessor PrincipalAccessor;
public EditionFeatureValueProvider(IFeatureStore featureStore, ICurrentPrincipalAccessor principalAccessor)
protected ITenantStore TenantStore { get; }
protected ICurrentTenant CurrentTenant { get; }
public EditionFeatureValueProvider(
IFeatureStore featureStore,
ICurrentPrincipalAccessor principalAccessor,
ITenantStore tenantStore,
ICurrentTenant currentTenant)
: base(featureStore)
{
PrincipalAccessor = principalAccessor;
TenantStore = tenantStore;
CurrentTenant = currentTenant;
}
public override async Task<string?> GetOrNullAsync(FeatureDefinition feature)
public async override Task<string?> GetOrNullAsync(FeatureDefinition feature)
{
var editionId = PrincipalAccessor.Principal?.FindEditionId();
var editionId = await FindEditionIdAsync();
if (editionId == null)
{
return null;
@ -28,4 +40,21 @@ public class EditionFeatureValueProvider : FeatureValueProvider
return await FeatureStore.GetOrNullAsync(feature.Name, Name, editionId.Value.ToString());
}
protected virtual async Task<Guid?> FindEditionIdAsync()
{
var editionId = PrincipalAccessor.Principal?.FindEditionId();
if (editionId != null)
{
return editionId;
}
if (CurrentTenant.Id == null)
{
return null;
}
var tenant = await TenantStore.FindAsync(CurrentTenant.Id.Value);
return tenant?.EditionId;
}
}

5
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs

@ -17,6 +17,8 @@ public class TenantConfiguration
public bool IsActive { get; set; }
public Guid? EditionId { get; set; }
public TenantConfiguration()
{
IsActive = true;
@ -33,11 +35,12 @@ public class TenantConfiguration
ConnectionStrings = new ConnectionStrings();
}
public TenantConfiguration(Guid id, [NotNull] string name, [NotNull] string normalizedName)
public TenantConfiguration(Guid id, [NotNull] string name, [NotNull] string normalizedName, Guid? editionId = null)
: this(id, name)
{
Check.NotNull(normalizedName, nameof(normalizedName));
NormalizedName = normalizedName;
EditionId = editionId;
}
}

50
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs

@ -1,7 +1,9 @@
using System.Security.Principal;
using System;
using System.Security.Principal;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security.Claims;
namespace Volo.Abp.FeatureManagement;
@ -11,22 +13,58 @@ public class EditionFeatureManagementProvider : FeatureManagementProvider, ITran
public override string Name => EditionFeatureValueProvider.ProviderName;
protected ICurrentPrincipalAccessor PrincipalAccessor { get; }
protected ITenantStore TenantStore { get; }
protected ICurrentTenant CurrentTenant { get; }
protected string CurrentCompatibleProviderName { get; set; }
public EditionFeatureManagementProvider(
IFeatureManagementStore store,
ICurrentPrincipalAccessor principalAccessor)
ICurrentPrincipalAccessor principalAccessor,
ITenantStore tenantStore,
ICurrentTenant currentTenant)
: base(store)
{
PrincipalAccessor = principalAccessor;
TenantStore = tenantStore;
CurrentTenant = currentTenant;
}
protected override Task<string> NormalizeProviderKeyAsync(string providerKey)
public override bool Compatible(string providerName)
{
if (providerKey != null)
CurrentCompatibleProviderName = providerName;
return providerName == TenantFeatureValueProvider.ProviderName || base.Compatible(providerName);
}
protected async override Task<string> NormalizeProviderKeyAsync(string providerKey)
{
return (await FindEditionIdAsync(providerKey))?.ToString();
}
protected virtual async Task<Guid?> FindEditionIdAsync(string providerKey)
{
if (Guid.TryParse(providerKey, out var parsedEditionOrTenantId))
{
if (CurrentCompatibleProviderName == TenantFeatureValueProvider.ProviderName)
{
var tenant = await TenantStore.FindAsync(parsedEditionOrTenantId);
if (tenant != null)
{
return tenant?.EditionId;
}
}
return parsedEditionOrTenantId;
}
if (CurrentTenant.Id.HasValue)
{
return Task.FromResult(providerKey);
var tenant = await TenantStore.FindAsync(CurrentTenant.GetId());
if (tenant != null)
{
return tenant?.EditionId;
}
}
return Task.FromResult(PrincipalAccessor.Principal?.FindEditionId()?.ToString("N"));
return PrincipalAccessor.Principal?.FindEditionId();
}
}

3
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs

@ -28,7 +28,8 @@ public class AbpTenantManagementDomainMappingProfile : Profile
return connStrings;
});
})
.ForMember(x => x.IsActive, x => x.Ignore());
.ForMember(x => x.IsActive, x => x.Ignore())
.ForMember(x => x.EditionId, x => x.Ignore());
CreateMap<Tenant, TenantEto>();
}

Loading…
Cancel
Save