public async Task GetListAsync() { var john = await UserRepository.GetAsync(TestData.UserJohnId); var david = await UserRepository.GetAsync(TestData.UserDavidId); var neo = await UserRepository.GetAsync(TestData.UserNeoId); var davidLinkUsers = await IdentityLinkUserRepository.GetListAsync(new IdentityLinkUserInfo(david.Id, david.TenantId)); davidLinkUsers.ShouldNotBeNull(); davidLinkUsers.ShouldContain(x => x.SourceUserId == john.Id && x.SourceTenantId == john.TenantId); davidLinkUsers.ShouldContain(x => x.TargetUserId == neo.Id && x.TargetTenantId == neo.TenantId); }
public async Task <List <IdentityLinkUser> > GetListAsync(IdentityLinkUserInfo linkUserInfo, bool includeIndirect = false, CancellationToken cancellationToken = default) { using (CurrentTenant.Change(null)) { var users = await IdentityLinkUserRepository.GetListAsync(linkUserInfo, cancellationToken : cancellationToken); if (includeIndirect == false) { return(users); } var userInfos = new List <IdentityLinkUserInfo>() { linkUserInfo }; var allUsers = new List <IdentityLinkUser>(); allUsers.AddRange(users); do { var nextUsers = new List <IdentityLinkUserInfo>(); foreach (var user in users) { if (userInfos.Any(x => x.TenantId != user.SourceTenantId || x.UserId != user.SourceUserId)) { nextUsers.Add(new IdentityLinkUserInfo(user.SourceUserId, user.SourceTenantId)); } if (userInfos.Any(x => x.TenantId != user.TargetTenantId || x.UserId != user.TargetUserId)) { nextUsers.Add(new IdentityLinkUserInfo(user.TargetUserId, user.TargetTenantId)); } } users = new List <IdentityLinkUser>(); foreach (var next in nextUsers) { users.AddRange(await IdentityLinkUserRepository.GetListAsync(next, userInfos, cancellationToken)); } userInfos.AddRange(nextUsers); allUsers.AddRange(users); } while (users.Any()); return(allUsers); } }