Browse Source

Introduce ITenantNameValidator for extensible tenant name validation

pull/22792/head
Suhaib Mousa 1 year ago
parent
commit
d0d4427779
  1. 28
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/DefaultTenantNameValidator.cs
  2. 9
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantNameValidator.cs
  3. 19
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs
  4. 35
      modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo/Abp/TenantManagement/TenantNameValidator_Tests.cs

28
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/DefaultTenantNameValidator.cs

@ -0,0 +1,28 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Services;
namespace Volo.Abp.TenantManagement;
public class DefaultTenantNameValidator : ITenantNameValidator, ITransientDependency
{
protected ITenantRepository TenantRepository { get; }
public DefaultTenantNameValidator(ITenantRepository tenantRepository)
{
TenantRepository = tenantRepository;
}
public virtual async Task ValidateAsync(string normalizedTenantName, Guid? expectedTenantId = null)
{
Check.NotNullOrWhiteSpace(normalizedTenantName, nameof(normalizedTenantName));
var existingTenant = await TenantRepository.FindByNameAsync(normalizedTenantName);
if (existingTenant != null && existingTenant.Id != expectedTenantId)
{
throw new BusinessException("Volo.Abp.TenantManagement:DuplicateTenantName")
.WithData("Name", normalizedTenantName);
}
}
}

9
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantNameValidator.cs

@ -0,0 +1,9 @@
using System;
using System.Threading.Tasks;
namespace Volo.Abp.TenantManagement;
public interface ITenantNameValidator
{
Task ValidateAsync(string normalizedTenantName, Guid? expectedTenantId = null);
}

19
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs

@ -9,16 +9,16 @@ namespace Volo.Abp.TenantManagement;
public class TenantManager : DomainService, ITenantManager
{
protected ITenantRepository TenantRepository { get; }
public ITenantNameValidator TenantNameValidator { get; }
protected ITenantNormalizer TenantNormalizer { get; }
protected ILocalEventBus LocalEventBus { get; }
public TenantManager(
ITenantRepository tenantRepository,
ITenantNameValidator tenantNameValidator,
ITenantNormalizer tenantNormalizer,
ILocalEventBus localEventBus)
{
TenantRepository = tenantRepository;
TenantNameValidator = tenantNameValidator;
TenantNormalizer = tenantNormalizer;
LocalEventBus = localEventBus;
}
@ -28,7 +28,7 @@ public class TenantManager : DomainService, ITenantManager
Check.NotNull(name, nameof(name));
var normalizedName = TenantNormalizer.NormalizeName(name);
await ValidateNameAsync(normalizedName);
await TenantNameValidator.ValidateAsync(normalizedName);
return new Tenant(GuidGenerator.Create(), name, normalizedName);
}
@ -39,18 +39,9 @@ public class TenantManager : DomainService, ITenantManager
var normalizedName = TenantNormalizer.NormalizeName(name);
await ValidateNameAsync(normalizedName, tenant.Id);
await TenantNameValidator.ValidateAsync(normalizedName, tenant.Id);
await LocalEventBus.PublishAsync(new TenantChangedEvent(tenant.Id, tenant.NormalizedName));
tenant.SetName(name);
tenant.SetNormalizedName(normalizedName);
}
protected virtual async Task ValidateNameAsync(string normalizeName, Guid? expectedId = null)
{
var tenant = await TenantRepository.FindByNameAsync(normalizeName);
if (tenant != null && tenant.Id != expectedId)
{
throw new BusinessException("Volo.Abp.TenantManagement:DuplicateTenantName").WithData("Name", normalizeName);
}
}
}

35
modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo/Abp/TenantManagement/TenantNameValidator_Tests.cs

@ -0,0 +1,35 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Guids;
using Xunit;
namespace Volo.Abp.TenantManagement;
public class TenantNameValidator_Tests : AbpTenantManagementDomainTestBase
{
private readonly ITenantNameValidator _tenantNameValidator;
private readonly ITenantRepository _tenantRepository;
public TenantNameValidator_Tests()
{
_tenantRepository = GetRequiredService<ITenantRepository>();
_tenantNameValidator = GetRequiredService<ITenantNameValidator>();
}
[Fact]
public async Task Should_Throw_If_Name_Is_Null()
{
await Assert.ThrowsAsync<ArgumentException>(() => _tenantNameValidator.ValidateAsync(null));
}
[Fact]
public async Task Should_Throw_If_Duplicate_Name()
{
await Assert.ThrowsAsync<BusinessException>(() => _tenantNameValidator.ValidateAsync("VOLOSOFT"));
}
[Fact]
public async Task Should_Not_Throw_For_Unique_Name()
{
await _tenantNameValidator.ValidateAsync("UNIQUE-TENANT-NAME");
}
}
Loading…
Cancel
Save