Browse Source

Ensure to remove membership from childred when deleting an OU.

pull/4209/head
Halil İbrahim Kalkan 6 years ago
parent
commit
14f57fdd15
  1. 6
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs
  2. 14
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs
  3. 29
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs

6
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) foreach (var child in children)
{ {
await OrganizationUnitRepository.RemoveAllMembersAsync(child);
await OrganizationUnitRepository.RemoveAllRolesAsync(child);
await OrganizationUnitRepository.DeleteAsync(child); await OrganizationUnitRepository.DeleteAsync(child);
} }
@ -137,7 +139,7 @@ namespace Volo.Abp.Identity
{ {
if (!recursive) if (!recursive)
{ {
return await OrganizationUnitRepository.GetChildrenAsync(parentId); return await OrganizationUnitRepository.GetChildrenAsync(parentId, includeDetails: true);
} }
if (!parentId.HasValue) if (!parentId.HasValue)
@ -147,7 +149,7 @@ namespace Volo.Abp.Identity
var code = await GetCodeOrDefaultAsync(parentId.Value); var code = await GetCodeOrDefaultAsync(parentId.Value);
return await OrganizationUnitRepository.GetAllChildrenWithParentCodeAsync(code, parentId); return await OrganizationUnitRepository.GetAllChildrenWithParentCodeAsync(code, parentId, includeDetails: true);
} }
public virtual Task<bool> IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou) public virtual Task<bool> IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou)

14
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 where userRole.UserId == id
select role.Name; select role.Name;
var organizationUnitIds = DbContext.Set<IdentityUserOrganizationUnit>().Where(q => q.UserId == id).Select(q => q.OrganizationUnitId).ToArray(); var organizationUnitIds = DbContext.Set<IdentityUserOrganizationUnit>().Where(q => q.UserId == id).Select(q => q.OrganizationUnitId).ToArray();
var organizationRoleIds = DbContext.Set<OrganizationUnitRole>().Where(our => organizationUnitIds.Contains(our.OrganizationUnitId)).Select(r => r.RoleId).ToArray();
var organizationRoleIds = await (
from ouRole in DbContext.Set<OrganizationUnitRole>()
join ou in DbContext.Set<OrganizationUnit>() 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 orgUnitRoleNameQuery = DbContext.Roles.Where(r => organizationRoleIds.Contains(r.Id)).Select(n => n.Name);
var resultQuery = query.Union(orgUnitRoleNameQuery); var resultQuery = query.Union(orgUnitRoleNameQuery);
return await resultQuery.ToListAsync(GetCancellationToken(cancellationToken)); return await resultQuery.ToListAsync(GetCancellationToken(cancellationToken));
@ -53,11 +60,14 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
{ {
var query = from userOu in DbContext.Set<IdentityUserOrganizationUnit>() var query = from userOu in DbContext.Set<IdentityUserOrganizationUnit>()
join roleOu in DbContext.Set<OrganizationUnitRole>() on userOu.OrganizationUnitId equals roleOu.OrganizationUnitId join roleOu in DbContext.Set<OrganizationUnitRole>() on userOu.OrganizationUnitId equals roleOu.OrganizationUnitId
join ou in DbContext.Set<OrganizationUnit>() on roleOu.OrganizationUnitId equals ou.Id
join userOuRoles in DbContext.Roles on roleOu.RoleId equals userOuRoles.Id join userOuRoles in DbContext.Roles on roleOu.RoleId equals userOuRoles.Id
where userOu.UserId == id where userOu.UserId == id
select userOuRoles.Name; select userOuRoles.Name;
return await query.ToListAsync(GetCancellationToken(cancellationToken)); var result = await query.ToListAsync(GetCancellationToken(cancellationToken));
return result;
} }
public virtual async Task<IdentityUser> FindByLoginAsync( public virtual async Task<IdentityUser> FindByLoginAsync(

29
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs

@ -161,32 +161,19 @@ namespace Volo.Abp.Identity.EntityFrameworkCore
OrganizationUnit organizationUnit, OrganizationUnit organizationUnit,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var ouRolesQuery = DbContext.Set<OrganizationUnitRole>() organizationUnit.Roles.Clear();
.Where(q => q.OrganizationUnitId == organizationUnit.Id); return Task.CompletedTask;
DbContext.Set<OrganizationUnitRole>().RemoveRange(ouRolesQuery);
return Task.FromResult(0);
//Can be long running process that could be made available for cancellation perhaps
//return Task.Run(() =>
// DbContext.Set<OrganizationUnitRole>().RemoveRange(ouRolesQuery),
// GetCancellationToken(cancellationToken)
//);
} }
public virtual Task RemoveAllMembersAsync( public virtual async Task RemoveAllMembersAsync(
OrganizationUnit organizationUnit, OrganizationUnit organizationUnit,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var ouMembersQuery = DbContext.Set<IdentityUserOrganizationUnit>() var ouMembersQuery = await DbContext.Set<IdentityUserOrganizationUnit>()
.Where(q => q.OrganizationUnitId == organizationUnit.Id); .Where(q => q.OrganizationUnitId == organizationUnit.Id)
.ToListAsync(GetCancellationToken(cancellationToken));
DbContext.Set<IdentityUserOrganizationUnit>().RemoveRange(ouMembersQuery);
return Task.FromResult(0); DbContext.Set<IdentityUserOrganizationUnit>().RemoveRange(ouMembersQuery);
//Can be long running process that could be made available for cancellation perhaps
//return Task.Run(() =>
// DbContext.Set<IdentityUserOrganizationUnit>().RemoveRange(ouMembersQuery),
// GetCancellationToken(cancellationToken)
//);
} }
} }
} }

Loading…
Cancel
Save