From 14f57fdd152f7c716f0562400ee2ae5157bcefb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 3 Jun 2020 17:42:39 +0300 Subject: [PATCH] Ensure to remove membership from childred when deleting an OU. --- .../Abp/Identity/OrganizationUnitManager.cs | 6 ++-- .../EfCoreIdentityUserRepository.cs | 14 +++++++-- .../EfCoreOrganizationUnitRepository.cs | 29 +++++-------------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs index fb5a5278f2..778bde3802 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs @@ -77,6 +77,8 @@ namespace Volo.Abp.Identity foreach (var child in children) { + await OrganizationUnitRepository.RemoveAllMembersAsync(child); + await OrganizationUnitRepository.RemoveAllRolesAsync(child); await OrganizationUnitRepository.DeleteAsync(child); } @@ -137,7 +139,7 @@ namespace Volo.Abp.Identity { if (!recursive) { - return await OrganizationUnitRepository.GetChildrenAsync(parentId); + return await OrganizationUnitRepository.GetChildrenAsync(parentId, includeDetails: true); } if (!parentId.HasValue) @@ -147,7 +149,7 @@ namespace Volo.Abp.Identity var code = await GetCodeOrDefaultAsync(parentId.Value); - return await OrganizationUnitRepository.GetAllChildrenWithParentCodeAsync(code, parentId); + return await OrganizationUnitRepository.GetAllChildrenWithParentCodeAsync(code, parentId, includeDetails: true); } public virtual Task IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index f2e82cfb77..9ad8effa8a 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -41,7 +41,14 @@ namespace Volo.Abp.Identity.EntityFrameworkCore where userRole.UserId == id select role.Name; var organizationUnitIds = DbContext.Set().Where(q => q.UserId == id).Select(q => q.OrganizationUnitId).ToArray(); - var organizationRoleIds = DbContext.Set().Where(our => organizationUnitIds.Contains(our.OrganizationUnitId)).Select(r => r.RoleId).ToArray(); + + var organizationRoleIds = await ( + from ouRole in DbContext.Set() + join ou in DbContext.Set() on ouRole.OrganizationUnitId equals ou.Id + where organizationUnitIds.Contains(ouRole.OrganizationUnitId) + select ouRole.RoleId + ).ToListAsync(GetCancellationToken(cancellationToken)); + var orgUnitRoleNameQuery = DbContext.Roles.Where(r => organizationRoleIds.Contains(r.Id)).Select(n => n.Name); var resultQuery = query.Union(orgUnitRoleNameQuery); return await resultQuery.ToListAsync(GetCancellationToken(cancellationToken)); @@ -53,11 +60,14 @@ namespace Volo.Abp.Identity.EntityFrameworkCore { var query = from userOu in DbContext.Set() join roleOu in DbContext.Set() on userOu.OrganizationUnitId equals roleOu.OrganizationUnitId + join ou in DbContext.Set() on roleOu.OrganizationUnitId equals ou.Id join userOuRoles in DbContext.Roles on roleOu.RoleId equals userOuRoles.Id where userOu.UserId == id select userOuRoles.Name; - return await query.ToListAsync(GetCancellationToken(cancellationToken)); + var result = await query.ToListAsync(GetCancellationToken(cancellationToken)); + + return result; } public virtual async Task FindByLoginAsync( diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs index 812c655140..06b2084707 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs @@ -161,32 +161,19 @@ namespace Volo.Abp.Identity.EntityFrameworkCore OrganizationUnit organizationUnit, CancellationToken cancellationToken = default) { - var ouRolesQuery = DbContext.Set() - .Where(q => q.OrganizationUnitId == organizationUnit.Id); - - DbContext.Set().RemoveRange(ouRolesQuery); - return Task.FromResult(0); - //Can be long running process that could be made available for cancellation perhaps - //return Task.Run(() => - // DbContext.Set().RemoveRange(ouRolesQuery), - // GetCancellationToken(cancellationToken) - //); + organizationUnit.Roles.Clear(); + return Task.CompletedTask; } - public virtual Task RemoveAllMembersAsync( + public virtual async Task RemoveAllMembersAsync( OrganizationUnit organizationUnit, CancellationToken cancellationToken = default) { - var ouMembersQuery = DbContext.Set() - .Where(q => q.OrganizationUnitId == organizationUnit.Id); - - DbContext.Set().RemoveRange(ouMembersQuery); - return Task.FromResult(0); - //Can be long running process that could be made available for cancellation perhaps - //return Task.Run(() => - // DbContext.Set().RemoveRange(ouMembersQuery), - // GetCancellationToken(cancellationToken) - //); + var ouMembersQuery = await DbContext.Set() + .Where(q => q.OrganizationUnitId == organizationUnit.Id) + .ToListAsync(GetCancellationToken(cancellationToken)); + + DbContext.Set().RemoveRange(ouMembersQuery); } } }