public async Task <List <IdentityLinkUser> > GetListAsync(IdentityLinkUserInfo linkUserInfo, CancellationToken cancellationToken = default)
 {
     return(await(await GetMongoQueryableAsync(cancellationToken)).Where(x =>
                                                                         x.SourceUserId == linkUserInfo.UserId && x.SourceTenantId == linkUserInfo.TenantId ||
                                                                         x.TargetUserId == linkUserInfo.UserId && x.TargetTenantId == linkUserInfo.TenantId)
            .ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)));
 }
示例#2
0
    public virtual async Task DeleteAsync(IdentityLinkUserInfo linkUserInfo, CancellationToken cancellationToken = default)
    {
        var linkUsers = await(await GetDbSetAsync()).Where(x =>
                                                           x.SourceUserId == linkUserInfo.UserId && x.SourceTenantId == linkUserInfo.TenantId ||
                                                           x.TargetUserId == linkUserInfo.UserId && x.TargetTenantId == linkUserInfo.TenantId)
                        .ToListAsync(cancellationToken: GetCancellationToken(cancellationToken));

        await DeleteManyAsync(linkUsers, cancellationToken : cancellationToken);
    }
示例#3
0
    public IdentityLinkUser(Guid id, IdentityLinkUserInfo sourceUser, IdentityLinkUserInfo targetUser)
        : base(id)
    {
        SourceUserId   = sourceUser.UserId;
        SourceTenantId = sourceUser.TenantId;

        TargetUserId   = targetUser.UserId;
        TargetTenantId = targetUser.TenantId;
    }
 public async Task <IdentityLinkUser> FindAsync(IdentityLinkUserInfo sourceLinkUserInfo, IdentityLinkUserInfo targetLinkUserInfo, CancellationToken cancellationToken = default)
 {
     return(await DbSet.FirstOrDefaultAsync(x =>
                                            x.SourceUserId == sourceLinkUserInfo.UserId && x.SourceTenantId == sourceLinkUserInfo.TenantId &&
                                            x.TargetUserId == targetLinkUserInfo.UserId && x.TargetTenantId == targetLinkUserInfo.TenantId ||
                                            x.TargetUserId == sourceLinkUserInfo.UserId && x.TargetTenantId == sourceLinkUserInfo.TenantId &&
                                            x.SourceUserId == targetLinkUserInfo.UserId && x.SourceTenantId == targetLinkUserInfo.TenantId
                                            , cancellationToken : GetCancellationToken(cancellationToken)));
 }
 public virtual async Task <IdentityLinkUser> FindAsync(IdentityLinkUserInfo sourceLinkUserInfo, IdentityLinkUserInfo targetLinkUserInfo, CancellationToken cancellationToken = default)
 {
     return(await(await GetMongoQueryableAsync(cancellationToken))
            .OrderBy(x => x.Id).FirstOrDefaultAsync(x =>
                                                    x.SourceUserId == sourceLinkUserInfo.UserId && x.SourceTenantId == sourceLinkUserInfo.TenantId &&
                                                    x.TargetUserId == targetLinkUserInfo.UserId && x.TargetTenantId == targetLinkUserInfo.TenantId ||
                                                    x.TargetUserId == sourceLinkUserInfo.UserId && x.TargetTenantId == sourceLinkUserInfo.TenantId &&
                                                    x.SourceUserId == targetLinkUserInfo.UserId && x.SourceTenantId == targetLinkUserInfo.TenantId
                                                    , cancellationToken: GetCancellationToken(cancellationToken)));
 }
示例#6
0
    public virtual async Task <string> GenerateLinkTokenAsync(IdentityLinkUserInfo targetLinkUser, string tokenPurpose, CancellationToken cancellationToken = default)
    {
        using (CurrentTenant.Change(targetLinkUser.TenantId))
        {
            var user = await UserManager.GetByIdAsync(targetLinkUser.UserId);

            return(await UserManager.GenerateUserTokenAsync(
                       user,
                       LinkUserTokenProviderConsts.LinkUserTokenProviderName,
                       tokenPurpose));
        }
    }
示例#7
0
 public virtual async Task <bool> IsLinkedAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, bool includeIndirect = false, CancellationToken cancellationToken = default)
 {
     using (CurrentTenant.Change(null))
     {
         if (includeIndirect)
         {
             return((await GetListAsync(sourceLinkUser, true, cancellationToken: cancellationToken))
                    .Any(x => x.SourceTenantId == targetLinkUser.TenantId && x.SourceUserId == targetLinkUser.UserId ||
                         x.TargetTenantId == targetLinkUser.TenantId && x.TargetUserId == targetLinkUser.UserId));
         }
         return(await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser, cancellationToken) != null);
     }
 }
示例#8
0
    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);
        }
    }
示例#9
0
    public virtual async Task UnlinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, CancellationToken cancellationToken = default)
    {
        using (CurrentTenant.Change(null))
        {
            if (!await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken))
            {
                return;
            }

            var linkedUser = await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser, cancellationToken);

            if (linkedUser != null)
            {
                await IdentityLinkUserRepository.DeleteAsync(linkedUser, cancellationToken : cancellationToken);
            }
        }
    }
        public virtual async Task <List <IdentityLinkUser> > GetListAsync(IdentityLinkUserInfo linkUserInfo, List <IdentityLinkUserInfo> excludes = null,
                                                                          CancellationToken cancellationToken = default)
        {
            var query = (await GetMongoQueryableAsync(cancellationToken)).Where(x =>
                                                                                x.SourceUserId == linkUserInfo.UserId && x.SourceTenantId == linkUserInfo.TenantId ||
                                                                                x.TargetUserId == linkUserInfo.UserId && x.TargetTenantId == linkUserInfo.TenantId);

            if (!excludes.IsNullOrEmpty())
            {
                foreach (var userInfo in excludes)
                {
                    query = query.Where(x =>
                                        (x.SourceTenantId != userInfo.TenantId || x.SourceUserId != userInfo.UserId) &&
                                        (x.TargetTenantId != userInfo.TenantId || x.TargetUserId != userInfo.UserId));
                }
            }

            return(await query.ToListAsync(cancellationToken : GetCancellationToken(cancellationToken)));
        }
示例#11
0
    public virtual async Task LinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, CancellationToken cancellationToken = default)
    {
        using (CurrentTenant.Change(null))
        {
            if (sourceLinkUser.UserId == targetLinkUser.UserId && sourceLinkUser.TenantId == targetLinkUser.TenantId)
            {
                return;
            }

            if (await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken))
            {
                return;
            }

            var userLink = new IdentityLinkUser(
                GuidGenerator.Create(),
                sourceLinkUser,
                targetLinkUser);
            await IdentityLinkUserRepository.InsertAsync(userLink, true, cancellationToken);
        }
    }