Skip to content

Commit d0d4427

Browse files
committed
Introduce ITenantNameValidator for extensible tenant name validation
1 parent 82114c0 commit d0d4427

File tree

4 files changed

+77
-14
lines changed

4 files changed

+77
-14
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Volo.Abp.DependencyInjection;
4+
using Volo.Abp.Domain.Services;
5+
6+
namespace Volo.Abp.TenantManagement;
7+
8+
public class DefaultTenantNameValidator : ITenantNameValidator, ITransientDependency
9+
{
10+
protected ITenantRepository TenantRepository { get; }
11+
12+
public DefaultTenantNameValidator(ITenantRepository tenantRepository)
13+
{
14+
TenantRepository = tenantRepository;
15+
}
16+
17+
public virtual async Task ValidateAsync(string normalizedTenantName, Guid? expectedTenantId = null)
18+
{
19+
Check.NotNullOrWhiteSpace(normalizedTenantName, nameof(normalizedTenantName));
20+
21+
var existingTenant = await TenantRepository.FindByNameAsync(normalizedTenantName);
22+
if (existingTenant != null && existingTenant.Id != expectedTenantId)
23+
{
24+
throw new BusinessException("Volo.Abp.TenantManagement:DuplicateTenantName")
25+
.WithData("Name", normalizedTenantName);
26+
}
27+
}
28+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
4+
namespace Volo.Abp.TenantManagement;
5+
6+
public interface ITenantNameValidator
7+
{
8+
Task ValidateAsync(string normalizedTenantName, Guid? expectedTenantId = null);
9+
}

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

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ namespace Volo.Abp.TenantManagement;
99

1010
public class TenantManager : DomainService, ITenantManager
1111
{
12-
protected ITenantRepository TenantRepository { get; }
12+
public ITenantNameValidator TenantNameValidator { get; }
1313
protected ITenantNormalizer TenantNormalizer { get; }
1414
protected ILocalEventBus LocalEventBus { get; }
1515

1616
public TenantManager(
17-
ITenantRepository tenantRepository,
17+
ITenantNameValidator tenantNameValidator,
1818
ITenantNormalizer tenantNormalizer,
1919
ILocalEventBus localEventBus)
2020
{
21-
TenantRepository = tenantRepository;
21+
TenantNameValidator = tenantNameValidator;
2222
TenantNormalizer = tenantNormalizer;
2323
LocalEventBus = localEventBus;
2424
}
@@ -28,7 +28,7 @@ public virtual async Task<Tenant> CreateAsync(string name)
2828
Check.NotNull(name, nameof(name));
2929

3030
var normalizedName = TenantNormalizer.NormalizeName(name);
31-
await ValidateNameAsync(normalizedName);
31+
await TenantNameValidator.ValidateAsync(normalizedName);
3232
return new Tenant(GuidGenerator.Create(), name, normalizedName);
3333
}
3434

@@ -39,18 +39,9 @@ public virtual async Task ChangeNameAsync(Tenant tenant, string name)
3939

4040
var normalizedName = TenantNormalizer.NormalizeName(name);
4141

42-
await ValidateNameAsync(normalizedName, tenant.Id);
42+
await TenantNameValidator.ValidateAsync(normalizedName, tenant.Id);
4343
await LocalEventBus.PublishAsync(new TenantChangedEvent(tenant.Id, tenant.NormalizedName));
4444
tenant.SetName(name);
4545
tenant.SetNormalizedName(normalizedName);
4646
}
47-
48-
protected virtual async Task ValidateNameAsync(string normalizeName, Guid? expectedId = null)
49-
{
50-
var tenant = await TenantRepository.FindByNameAsync(normalizeName);
51-
if (tenant != null && tenant.Id != expectedId)
52-
{
53-
throw new BusinessException("Volo.Abp.TenantManagement:DuplicateTenantName").WithData("Name", normalizeName);
54-
}
55-
}
5647
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Volo.Abp.Guids;
4+
using Xunit;
5+
6+
namespace Volo.Abp.TenantManagement;
7+
8+
public class TenantNameValidator_Tests : AbpTenantManagementDomainTestBase
9+
{
10+
private readonly ITenantNameValidator _tenantNameValidator;
11+
private readonly ITenantRepository _tenantRepository;
12+
public TenantNameValidator_Tests()
13+
{
14+
_tenantRepository = GetRequiredService<ITenantRepository>();
15+
_tenantNameValidator = GetRequiredService<ITenantNameValidator>();
16+
}
17+
18+
[Fact]
19+
public async Task Should_Throw_If_Name_Is_Null()
20+
{
21+
await Assert.ThrowsAsync<ArgumentException>(() => _tenantNameValidator.ValidateAsync(null));
22+
}
23+
24+
[Fact]
25+
public async Task Should_Throw_If_Duplicate_Name()
26+
{
27+
await Assert.ThrowsAsync<BusinessException>(() => _tenantNameValidator.ValidateAsync("VOLOSOFT"));
28+
}
29+
30+
[Fact]
31+
public async Task Should_Not_Throw_For_Unique_Name()
32+
{
33+
await _tenantNameValidator.ValidateAsync("UNIQUE-TENANT-NAME");
34+
}
35+
}

0 commit comments

Comments
 (0)