Browse Source

Refactor repositories.

pull/3732/head
Halil İbrahim Kalkan 7 years ago
parent
commit
f21144ab8f
  1. 2
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Organizations/IOrganizationUnitRepository.cs
  2. 63
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Organizations/OrganizationUnitManager.cs
  3. 39
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs
  4. 44
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs
  5. 4
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs

2
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Organizations/IOrganizationUnitRepository.cs

@ -14,8 +14,6 @@ namespace Volo.Abp.Identity.Organizations
Task<List<OrganizationUnit>> GetListAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default); Task<List<OrganizationUnit>> GetListAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default);
Task<List<OrganizationUnit>> GetListAsync(bool includeDetails = true, CancellationToken cancellationToken = default);
Task<OrganizationUnit> GetOrganizationUnitAsync(string displayName, bool includeDetails = false, CancellationToken cancellationToken = default); Task<OrganizationUnit> GetOrganizationUnitAsync(string displayName, bool includeDetails = false, CancellationToken cancellationToken = default);
} }
} }

63
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Organizations/OrganizationUnitManager.cs

@ -2,9 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services; using Volo.Abp.Domain.Services;
using Volo.Abp.Identity.Localization; using Volo.Abp.Identity.Localization;
using Volo.Abp.Threading; using Volo.Abp.Threading;
@ -17,11 +15,10 @@ namespace Volo.Abp.Identity.Organizations
/// </summary> /// </summary>
public class OrganizationUnitManager : DomainService public class OrganizationUnitManager : DomainService
{ {
protected IOrganizationUnitRepository _organizationUnitRepository { get; private set; } protected IOrganizationUnitRepository OrganizationUnitRepository { get; }
protected IStringLocalizer<IdentityResource> Localizer { get; }
private readonly IStringLocalizer<IdentityResource> _localizer; protected IIdentityRoleRepository IdentityRoleRepository { get; }
private readonly IIdentityRoleRepository _identityRoleRepository; protected ICancellationTokenProvider CancellationTokenProvider { get; }
private readonly ICancellationTokenProvider _cancellationTokenProvider;
public OrganizationUnitManager( public OrganizationUnitManager(
IOrganizationUnitRepository organizationUnitRepository, IOrganizationUnitRepository organizationUnitRepository,
@ -29,10 +26,10 @@ namespace Volo.Abp.Identity.Organizations
IIdentityRoleRepository identityRoleRepository, IIdentityRoleRepository identityRoleRepository,
ICancellationTokenProvider cancellationTokenProvider) ICancellationTokenProvider cancellationTokenProvider)
{ {
_organizationUnitRepository = organizationUnitRepository; OrganizationUnitRepository = organizationUnitRepository;
_localizer = localizer; Localizer = localizer;
_identityRoleRepository = identityRoleRepository; IdentityRoleRepository = identityRoleRepository;
_cancellationTokenProvider = cancellationTokenProvider; CancellationTokenProvider = cancellationTokenProvider;
} }
[UnitOfWork] [UnitOfWork]
@ -40,30 +37,36 @@ namespace Volo.Abp.Identity.Organizations
{ {
organizationUnit.Code = await GetNextChildCodeAsync(organizationUnit.ParentId); organizationUnit.Code = await GetNextChildCodeAsync(organizationUnit.ParentId);
await ValidateOrganizationUnitAsync(organizationUnit); await ValidateOrganizationUnitAsync(organizationUnit);
await _organizationUnitRepository.InsertAsync(organizationUnit); await OrganizationUnitRepository.InsertAsync(organizationUnit);
} }
public virtual async Task UpdateAsync(OrganizationUnit organizationUnit) public virtual async Task UpdateAsync(OrganizationUnit organizationUnit)
{ {
await ValidateOrganizationUnitAsync(organizationUnit); await ValidateOrganizationUnitAsync(organizationUnit);
await _organizationUnitRepository.UpdateAsync(organizationUnit); await OrganizationUnitRepository.UpdateAsync(organizationUnit);
} }
public virtual async Task<string> GetNextChildCodeAsync(Guid? parentId) public virtual async Task<string> GetNextChildCodeAsync(Guid? parentId)
{ {
var lastChild = await GetLastChildOrNullAsync(parentId); var lastChild = await GetLastChildOrNullAsync(parentId);
if (lastChild == null) if (lastChild != null)
{ {
var parentCode = parentId != null ? await GetCodeOrDefaultAsync(parentId.Value) : null; return OrganizationUnit.CalculateNextCode(lastChild.Code);
return OrganizationUnit.AppendCode(parentCode, OrganizationUnit.CreateCode(1));
} }
return OrganizationUnit.CalculateNextCode(lastChild.Code); var parentCode = parentId != null
? await GetCodeOrDefaultAsync(parentId.Value)
: null;
return OrganizationUnit.AppendCode(
parentCode,
OrganizationUnit.CreateCode(1)
);
} }
public virtual async Task<OrganizationUnit> GetLastChildOrNullAsync(Guid? parentId) public virtual async Task<OrganizationUnit> GetLastChildOrNullAsync(Guid? parentId)
{ {
var children = await _organizationUnitRepository.GetChildrenAsync(parentId); var children = await OrganizationUnitRepository.GetChildrenAsync(parentId);
return children.OrderBy(c => c.Code).LastOrDefault(); return children.OrderBy(c => c.Code).LastOrDefault();
} }
@ -74,16 +77,16 @@ namespace Volo.Abp.Identity.Organizations
foreach (var child in children) foreach (var child in children)
{ {
await _organizationUnitRepository.DeleteAsync(child); await OrganizationUnitRepository.DeleteAsync(child);
} }
await _organizationUnitRepository.DeleteAsync(id); await OrganizationUnitRepository.DeleteAsync(id);
} }
[UnitOfWork] [UnitOfWork]
public virtual async Task MoveAsync(Guid id, Guid? parentId) public virtual async Task MoveAsync(Guid id, Guid? parentId)
{ {
var organizationUnit = await _organizationUnitRepository.GetAsync(id); var organizationUnit = await OrganizationUnitRepository.GetAsync(id);
if (organizationUnit.ParentId == parentId) if (organizationUnit.ParentId == parentId)
{ {
return; return;
@ -110,7 +113,7 @@ namespace Volo.Abp.Identity.Organizations
public virtual async Task<string> GetCodeOrDefaultAsync(Guid id) public virtual async Task<string> GetCodeOrDefaultAsync(Guid id)
{ {
var ou = await _organizationUnitRepository.GetAsync(id); var ou = await OrganizationUnitRepository.GetAsync(id);
return ou?.Code; return ou?.Code;
} }
@ -122,7 +125,7 @@ namespace Volo.Abp.Identity.Organizations
if (siblings.Any(ou => ou.DisplayName == organizationUnit.DisplayName)) if (siblings.Any(ou => ou.DisplayName == organizationUnit.DisplayName))
{ {
throw new UserFriendlyException(_localizer["OrganizationUnitDuplicateDisplayNameWarning", organizationUnit.DisplayName]); throw new UserFriendlyException(Localizer["OrganizationUnitDuplicateDisplayNameWarning", organizationUnit.DisplayName]);
} }
} }
@ -130,17 +133,17 @@ namespace Volo.Abp.Identity.Organizations
{ {
if (!recursive) if (!recursive)
{ {
return await _organizationUnitRepository.GetChildrenAsync(parentId); return await OrganizationUnitRepository.GetChildrenAsync(parentId);
} }
if (!parentId.HasValue) if (!parentId.HasValue)
{ {
return await _organizationUnitRepository.GetListAsync(); return await OrganizationUnitRepository.GetListAsync(includeDetails: true);
} }
var code = await GetCodeOrDefaultAsync(parentId.Value); var code = await GetCodeOrDefaultAsync(parentId.Value);
return await _organizationUnitRepository.GetAllChildrenWithParentCodeAsync(code, parentId); return await OrganizationUnitRepository.GetAllChildrenWithParentCodeAsync(code, parentId);
} }
public virtual Task<bool> IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou) public virtual Task<bool> IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou)
@ -151,8 +154,8 @@ namespace Volo.Abp.Identity.Organizations
public virtual async Task AddRoleToOrganizationUnitAsync(Guid roleId, Guid ouId) public virtual async Task AddRoleToOrganizationUnitAsync(Guid roleId, Guid ouId)
{ {
await AddRoleToOrganizationUnitAsync( await AddRoleToOrganizationUnitAsync(
await _identityRoleRepository.GetAsync(roleId), await IdentityRoleRepository.GetAsync(roleId),
await _organizationUnitRepository.GetAsync(ouId, true) await OrganizationUnitRepository.GetAsync(ouId, true)
); );
} }
@ -171,8 +174,8 @@ namespace Volo.Abp.Identity.Organizations
public virtual async Task RemoveRoleFromOrganizationUnitAsync(Guid roleId, Guid ouId) public virtual async Task RemoveRoleFromOrganizationUnitAsync(Guid roleId, Guid ouId)
{ {
await RemoveRoleFromOrganizationUnitAsync( await RemoveRoleFromOrganizationUnitAsync(
await _identityRoleRepository.GetAsync(roleId), await IdentityRoleRepository.GetAsync(roleId),
await _organizationUnitRepository.GetAsync(ouId, true) await OrganizationUnitRepository.GetAsync(ouId, true)
); );
} }

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

@ -2,7 +2,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
@ -11,38 +10,48 @@ using Volo.Abp.Identity.Organizations;
namespace Volo.Abp.Identity.EntityFrameworkCore namespace Volo.Abp.Identity.EntityFrameworkCore
{ {
public class EfCoreOrganizationUnitRepository : EfCoreRepository<IIdentityDbContext, OrganizationUnit, Guid>, IOrganizationUnitRepository public class EfCoreOrganizationUnitRepository
: EfCoreRepository<IIdentityDbContext, OrganizationUnit, Guid>,
IOrganizationUnitRepository
{ {
public EfCoreOrganizationUnitRepository(IDbContextProvider<IIdentityDbContext> dbContextProvider) public EfCoreOrganizationUnitRepository(
IDbContextProvider<IIdentityDbContext> dbContextProvider)
: base(dbContextProvider) : base(dbContextProvider)
{ {
} }
public async Task<List<OrganizationUnit>> GetChildrenAsync(Guid? parentId, CancellationToken cancellationToken = default) public async Task<List<OrganizationUnit>> GetChildrenAsync(
Guid? parentId,
CancellationToken cancellationToken = default)
{ {
return await DbSet.Where(x => x.ParentId == parentId) return await DbSet
.Where(x => x.ParentId == parentId)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<OrganizationUnit>> GetAllChildrenWithParentCodeAsync(string code, Guid? parentId, CancellationToken cancellationToken = default) public async Task<List<OrganizationUnit>> GetAllChildrenWithParentCodeAsync(
string code,
Guid? parentId,
CancellationToken cancellationToken = default)
{ {
return await DbSet.Where(ou => ou.Code.StartsWith(code) && ou.Id != parentId.Value) return await DbSet
.Where(ou => ou.Code.StartsWith(code) && ou.Id != parentId.Value)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<OrganizationUnit>> GetListAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default) public async Task<List<OrganizationUnit>> GetListAsync(
{ IEnumerable<Guid> ids,
return await DbSet.Where(t => ids.Contains(t.Id)).ToListAsync(GetCancellationToken(cancellationToken)); CancellationToken cancellationToken = default)
}
public override async Task<List<OrganizationUnit>> GetListAsync(bool includeDetails = true, CancellationToken cancellationToken = default)
{ {
return await DbSet return await DbSet
.IncludeDetails(includeDetails) .Where(t => ids.Contains(t.Id))
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<OrganizationUnit> GetOrganizationUnitAsync(string displayName, bool includeDetails = false, CancellationToken cancellationToken = default) public async Task<OrganizationUnit> GetOrganizationUnitAsync(
string displayName,
bool includeDetails = false,
CancellationToken cancellationToken = default)
{ {
return await DbSet return await DbSet
.IncludeDetails(includeDetails) .IncludeDetails(includeDetails)

44
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs

@ -3,11 +3,9 @@ using MongoDB.Driver.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.Guids;
using Volo.Abp.Identity.Organizations; using Volo.Abp.Identity.Organizations;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
@ -15,42 +13,48 @@ namespace Volo.Abp.Identity.MongoDB
{ {
public class MongoOrganizationUnitRepository : MongoDbRepository<IAbpIdentityMongoDbContext, OrganizationUnit, Guid>, IOrganizationUnitRepository public class MongoOrganizationUnitRepository : MongoDbRepository<IAbpIdentityMongoDbContext, OrganizationUnit, Guid>, IOrganizationUnitRepository
{ {
private readonly IGuidGenerator _guidGenerator;
public MongoOrganizationUnitRepository( public MongoOrganizationUnitRepository(
IMongoDbContextProvider<IAbpIdentityMongoDbContext> dbContextProvider, IMongoDbContextProvider<IAbpIdentityMongoDbContext> dbContextProvider)
IGuidGenerator guidGenerator)
: base(dbContextProvider) : base(dbContextProvider)
{ {
_guidGenerator = guidGenerator;
} }
public async Task<List<OrganizationUnit>> GetChildrenAsync(Guid? parentId, CancellationToken cancellationToken = default) public async Task<List<OrganizationUnit>> GetChildrenAsync(
Guid? parentId,
CancellationToken cancellationToken = default)
{ {
return await DbContext.OrganizationUnits.AsQueryable().Where(ou => ou.ParentId == parentId) return await GetMongoQueryable()
.ToListAsync(GetCancellationToken(cancellationToken)); .Where(ou => ou.ParentId == parentId)
.ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<OrganizationUnit>> GetAllChildrenWithParentCodeAsync(string code, Guid? parentId, CancellationToken cancellationToken = default) public async Task<List<OrganizationUnit>> GetAllChildrenWithParentCodeAsync(
string code,
Guid? parentId,
CancellationToken cancellationToken = default)
{ {
return await DbContext.OrganizationUnits.AsQueryable() return await GetMongoQueryable()
.Where(ou => ou.Code.StartsWith(code) && ou.Id != parentId.Value) .Where(ou => ou.Code.StartsWith(code) && ou.Id != parentId.Value)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<OrganizationUnit>> GetListAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default) public async Task<List<OrganizationUnit>> GetListAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default)
{ {
return await DbContext.OrganizationUnits.AsQueryable() return await GetMongoQueryable()
.Where(t => ids.Contains(t.Id)).ToListAsync(GetCancellationToken(cancellationToken)); .Where(t => ids.Contains(t.Id))
.ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<OrganizationUnit> GetOrganizationUnitAsync(string displayName, bool includeDetails = false, CancellationToken cancellationToken = default) public async Task<OrganizationUnit> GetOrganizationUnitAsync(
string displayName,
bool includeDetails = false,
CancellationToken cancellationToken = default)
{ {
return await DbContext.OrganizationUnits.AsQueryable() return await GetMongoQueryable()
.FirstOrDefaultAsync( .FirstOrDefaultAsync(
ou => ou.DisplayName == displayName, ou => ou.DisplayName == displayName,
GetCancellationToken(cancellationToken) GetCancellationToken(cancellationToken)
); );
} }
} }
} }

4
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs

@ -44,7 +44,7 @@ namespace Volo.Abp.Identity
[Fact] [Fact]
public async Task GetListAsync() public async Task GetListAsync()
{ {
var ouIds = (await OrganizationUnitRepository.GetListAsync()) var ouIds = (await OrganizationUnitRepository.GetListAsync(includeDetails: true))
.Select(ou => ou.Id).Take(2); .Select(ou => ou.Id).Take(2);
var ous = await OrganizationUnitRepository.GetListAsync(ouIds); var ous = await OrganizationUnitRepository.GetListAsync(ouIds);
ous.Count.ShouldBe(2); ous.Count.ShouldBe(2);
@ -67,7 +67,7 @@ namespace Volo.Abp.Identity
[Fact] [Fact]
public async Task Should_Eager_Load_OrganizationUnit_Collections() public async Task Should_Eager_Load_OrganizationUnit_Collections()
{ {
var ou = (await OrganizationUnitRepository.GetListAsync(true)) var ou = (await OrganizationUnitRepository.GetListAsync(includeDetails: true))
.FirstOrDefault(ou => ou.DisplayName == "OU111"); .FirstOrDefault(ou => ou.DisplayName == "OU111");
ou.Roles.ShouldNotBeNull(); ou.Roles.ShouldNotBeNull();
ou.Roles.Any().ShouldBeTrue(); ou.Roles.Any().ShouldBeTrue();

Loading…
Cancel
Save