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)
{
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<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
select role.Name;
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 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<IdentityUserOrganizationUnit>()
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
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<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,
CancellationToken cancellationToken = default)
{
var ouRolesQuery = DbContext.Set<OrganizationUnitRole>()
.Where(q => q.OrganizationUnitId == organizationUnit.Id);
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)
//);
organizationUnit.Roles.Clear();
return Task.CompletedTask;
}
public virtual Task RemoveAllMembersAsync(
public virtual async Task RemoveAllMembersAsync(
OrganizationUnit organizationUnit,
CancellationToken cancellationToken = default)
{
var ouMembersQuery = DbContext.Set<IdentityUserOrganizationUnit>()
.Where(q => q.OrganizationUnitId == organizationUnit.Id);
DbContext.Set<IdentityUserOrganizationUnit>().RemoveRange(ouMembersQuery);
return Task.FromResult(0);
//Can be long running process that could be made available for cancellation perhaps
//return Task.Run(() =>
// DbContext.Set<IdentityUserOrganizationUnit>().RemoveRange(ouMembersQuery),
// GetCancellationToken(cancellationToken)
//);
var ouMembersQuery = await DbContext.Set<IdentityUserOrganizationUnit>()
.Where(q => q.OrganizationUnitId == organizationUnit.Id)
.ToListAsync(GetCancellationToken(cancellationToken));
DbContext.Set<IdentityUserOrganizationUnit>().RemoveRange(ouMembersQuery);
}
}
}

Loading…
Cancel
Save