fix: allow slug reuse after tenant soft-delete
existsBySlug found DELETED records, blocking slug reuse. Changed to existsBySlugAndStatusNot(slug, DELETED) so deleted tenant slugs can be reclaimed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,4 +13,5 @@ public interface TenantRepository extends JpaRepository<TenantEntity, UUID> {
|
|||||||
Optional<TenantEntity> findByLogtoOrgId(String logtoOrgId);
|
Optional<TenantEntity> findByLogtoOrgId(String logtoOrgId);
|
||||||
List<TenantEntity> findByStatus(TenantStatus status);
|
List<TenantEntity> findByStatus(TenantStatus status);
|
||||||
boolean existsBySlug(String slug);
|
boolean existsBySlug(String slug);
|
||||||
|
boolean existsBySlugAndStatusNot(String slug, TenantStatus status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class TenantService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TenantEntity create(CreateTenantRequest request, UUID actorId) {
|
public TenantEntity create(CreateTenantRequest request, UUID actorId) {
|
||||||
if (tenantRepository.existsBySlug(request.slug())) {
|
if (tenantRepository.existsBySlugAndStatusNot(request.slug(), TenantStatus.DELETED)) {
|
||||||
throw new IllegalArgumentException("Slug already taken");
|
throw new IllegalArgumentException("Slug already taken");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class TenantServiceTest {
|
|||||||
var request = new CreateTenantRequest("Acme Corp", "acme-corp", "MID");
|
var request = new CreateTenantRequest("Acme Corp", "acme-corp", "MID");
|
||||||
var actorId = UUID.randomUUID();
|
var actorId = UUID.randomUUID();
|
||||||
|
|
||||||
when(tenantRepository.existsBySlug("acme-corp")).thenReturn(false);
|
when(tenantRepository.existsBySlugAndStatusNot("acme-corp", TenantStatus.DELETED)).thenReturn(false);
|
||||||
when(tenantRepository.save(any(TenantEntity.class))).thenAnswer(inv -> inv.getArgument(0));
|
when(tenantRepository.save(any(TenantEntity.class))).thenAnswer(inv -> inv.getArgument(0));
|
||||||
|
|
||||||
var result = tenantService.create(request, actorId);
|
var result = tenantService.create(request, actorId);
|
||||||
@@ -59,7 +59,7 @@ class TenantServiceTest {
|
|||||||
void create_throwsForDuplicateSlug() {
|
void create_throwsForDuplicateSlug() {
|
||||||
var request = new CreateTenantRequest("Acme Corp", "acme-corp", null);
|
var request = new CreateTenantRequest("Acme Corp", "acme-corp", null);
|
||||||
|
|
||||||
when(tenantRepository.existsBySlug("acme-corp")).thenReturn(true);
|
when(tenantRepository.existsBySlugAndStatusNot("acme-corp", TenantStatus.DELETED)).thenReturn(true);
|
||||||
|
|
||||||
assertThatThrownBy(() -> tenantService.create(request, UUID.randomUUID()))
|
assertThatThrownBy(() -> tenantService.create(request, UUID.randomUUID()))
|
||||||
.isInstanceOf(IllegalArgumentException.class)
|
.isInstanceOf(IllegalArgumentException.class)
|
||||||
@@ -71,7 +71,7 @@ class TenantServiceTest {
|
|||||||
var request = new CreateTenantRequest("Acme Corp", "acme-corp", null);
|
var request = new CreateTenantRequest("Acme Corp", "acme-corp", null);
|
||||||
var actorId = UUID.randomUUID();
|
var actorId = UUID.randomUUID();
|
||||||
|
|
||||||
when(tenantRepository.existsBySlug("acme-corp")).thenReturn(false);
|
when(tenantRepository.existsBySlugAndStatusNot("acme-corp", TenantStatus.DELETED)).thenReturn(false);
|
||||||
when(tenantRepository.save(any(TenantEntity.class))).thenAnswer(inv -> inv.getArgument(0));
|
when(tenantRepository.save(any(TenantEntity.class))).thenAnswer(inv -> inv.getArgument(0));
|
||||||
|
|
||||||
tenantService.create(request, actorId);
|
tenantService.create(request, actorId);
|
||||||
@@ -85,7 +85,7 @@ class TenantServiceTest {
|
|||||||
void create_defaultsToLowTier() {
|
void create_defaultsToLowTier() {
|
||||||
var request = new CreateTenantRequest("Acme Corp", "acme-corp", null);
|
var request = new CreateTenantRequest("Acme Corp", "acme-corp", null);
|
||||||
|
|
||||||
when(tenantRepository.existsBySlug("acme-corp")).thenReturn(false);
|
when(tenantRepository.existsBySlugAndStatusNot("acme-corp", TenantStatus.DELETED)).thenReturn(false);
|
||||||
when(tenantRepository.save(any(TenantEntity.class))).thenAnswer(inv -> inv.getArgument(0));
|
when(tenantRepository.save(any(TenantEntity.class))).thenAnswer(inv -> inv.getArgument(0));
|
||||||
|
|
||||||
var result = tenantService.create(request, UUID.randomUUID());
|
var result = tenantService.create(request, UUID.randomUUID());
|
||||||
|
|||||||
Reference in New Issue
Block a user