示例#1
0
        /// <summary>
        /// 添加好友关系
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <FriendDto> CreateFriendshipRequest(CreateFriendshipRequestInput input)
        {
            // 获取当前登录人
            var userIdentifier = AbpSession.ToUserIdentifier();
            //  组合获取要添加的好友信息
            var probableFriend = new UserIdentifier(input.TenantId, input.UserId);

            // 判断跨租户(TODO 目前猜测)
            _chatFeatureChecker.CheckChatFeatures(userIdentifier.TenantId, probableFriend.TenantId);
            // 判断双方是否是联系人
            if (await _friendshipManager.GetFriendshipOrNullAsync(userIdentifier, probableFriend) != null)
            {
                throw new UserFriendlyException(L("YouAlreadySentAFriendshipRequestToThisUser"));
            }
            // 获取到当前登录人信息
            var user = await UserManager.FindByIdAsync(AbpSession.GetUserId().ToString());

            // 将要添加的好友信息
            User probableFriendUser;

            using (CurrentUnitOfWork.SetTenantId(input.TenantId))
            {
                probableFriendUser = await UserManager.FindByIdAsync(input.UserId.ToString());
            }
            // 好友的租户名称
            var friendTenancyName = probableFriend.TenantId.HasValue ? _tenantCache.Get(probableFriend.TenantId.Value).TenancyName : null;
            // 生成一条 登录人 添加 好友的记录
            var sourceFriendship = new Friendship(userIdentifier, probableFriend, friendTenancyName, probableFriendUser.UserName, probableFriendUser.ProfilePictureId, FriendshipState.Accepted);
            await _friendshipManager.CreateFriendshipAsync(sourceFriendship);

            // 获取登录人租户名称
            var userTenancyName = user.TenantId.HasValue ? _tenantCache.Get(user.TenantId.Value).TenancyName : null;
            // 生成一条 好友 和 当前登录人的好友记录
            var targetFriendship = new Friendship(probableFriend, userIdentifier, userTenancyName, user.UserName, user.ProfilePictureId, FriendshipState.Accepted);
            await _friendshipManager.CreateFriendshipAsync(targetFriendship);

            // 判断接收人是否在线
            var clients = _onlineClientManager.GetAllByUserId(probableFriend);

            if (clients.Any())
            {
                var isFriendOnline = _onlineClientManager.IsOnline(sourceFriendship.ToUserIdentifier());
                await _chatCommunicator.SendFriendshipRequestToClient(clients, targetFriendship, false, isFriendOnline);
            }
            // 判断发送人是否在线
            var senderClients = _onlineClientManager.GetAllByUserId(userIdentifier);

            if (senderClients.Any())
            {
                var isFriendOnline = _onlineClientManager.IsOnline(targetFriendship.ToUserIdentifier());
                await _chatCommunicator.SendFriendshipRequestToClient(senderClients, sourceFriendship, true, isFriendOnline);
            }

            var sourceFriendshipRequest = ObjectMapper.Map <FriendDto>(sourceFriendship);

            sourceFriendshipRequest.IsOnline = _onlineClientManager.GetAllByUserId(probableFriend).Any();

            return(sourceFriendshipRequest);
        }
        public async Task <FriendDto> CreateFriendshipRequest(CreateFriendshipRequestInput input)
        {
            var userIdentifier = AbpSession.ToUserIdentifier();
            var probableFriend = new UserIdentifier(input.TenantId, input.UserId);

            _chatFeatureChecker.CheckChatFeatures(userIdentifier.TenantId, probableFriend.TenantId);

            if (_friendshipManager.GetFriendshipOrNull(userIdentifier, probableFriend) != null)
            {
                throw new UserFriendlyException(L("YouAlreadySentAFriendshipRequestToThisUser"));
            }

            var user = await UserManager.FindByIdAsync(AbpSession.GetUserId());

            User probableFriendUser;

            using (CurrentUnitOfWork.SetTenantId(input.TenantId))
            {
                probableFriendUser = (await UserManager.FindByIdAsync(input.UserId));
            }

            var friendTenancyName = probableFriend.TenantId.HasValue ? _tenantCache.Get(probableFriend.TenantId.Value).TenancyName : null;
            var sourceFriendship  = new Friendship(userIdentifier, probableFriend, friendTenancyName, probableFriendUser.UserName, probableFriendUser.ProfilePictureId, FriendshipState.Accepted);

            _friendshipManager.CreateFriendship(sourceFriendship);

            var userTenancyName  = user.TenantId.HasValue ? _tenantCache.Get(user.TenantId.Value).TenancyName : null;
            var targetFriendship = new Friendship(probableFriend, userIdentifier, userTenancyName, user.UserName, user.ProfilePictureId, FriendshipState.Accepted);

            _friendshipManager.CreateFriendship(targetFriendship);

            var clients = _onlineClientManager.GetAllByUserId(probableFriend);

            if (clients.Any())
            {
                var isFriendOnline = _onlineClientManager.IsOnline(sourceFriendship.ToUserIdentifier());
                _chatCommunicator.SendFriendshipRequestToClient(clients, targetFriendship, false, isFriendOnline);
            }

            var senderClients = _onlineClientManager.GetAllByUserId(userIdentifier);

            if (senderClients.Any())
            {
                var isFriendOnline = _onlineClientManager.IsOnline(targetFriendship.ToUserIdentifier());
                _chatCommunicator.SendFriendshipRequestToClient(senderClients, sourceFriendship, true, isFriendOnline);
            }

            var sourceFriendshipRequest = sourceFriendship.MapTo <FriendDto>();

            sourceFriendshipRequest.IsOnline = _onlineClientManager.GetAllByUserId(probableFriend).Any();

            return(sourceFriendshipRequest);
        }
示例#3
0
        private async Task HandleSenderToReceiverAsync(UserIdentifier senderIdentifier, UserIdentifier receiverIdentifier, string message, Guid sharedMessageId)
        {
            var friendshipState = (await _friendshipManager.GetFriendshipOrNullAsync(senderIdentifier, receiverIdentifier))?.State;

            if (friendshipState == null)
            {
                friendshipState = FriendshipState.Accepted;

                var receiverTenancyName = receiverIdentifier.TenantId.HasValue
                    ? _tenantCache.Get(receiverIdentifier.TenantId.Value).TenancyName
                    : null;

                var receiverUser = _userManager.GetUser(receiverIdentifier);
                await _friendshipManager.CreateFriendshipAsync(
                    new Friendship(
                        senderIdentifier,
                        receiverIdentifier,
                        receiverTenancyName,
                        receiverUser.UserName,
                        receiverUser.ProfilePictureId,
                        friendshipState.Value)
                    );
            }

            if (friendshipState.Value == FriendshipState.Blocked)
            {
                //Do not send message if receiver banned the sender
                return;
            }

            var sentMessage = new ChatMessage(
                senderIdentifier,
                receiverIdentifier,
                ChatSide.Sender,
                message,
                ChatMessageReadState.Read,
                sharedMessageId,
                ChatMessageReadState.Unread
                );

            Save(sentMessage);

            await _chatCommunicator.SendMessageToClient(
                _onlineClientManager.GetAllByUserId(senderIdentifier),
                sentMessage
                );
        }
示例#4
0
        public void ShouldGetTenantById()
        {
            //Act
            var tenant = tenantCache.Get(1);

            //Assert
            tenant.TenancyName.ShouldBe(Tenant.DefaultTenantName);
        }
示例#5
0
        public void Should_Get_Tenant_By_Id()
        {
            //Act
            var tenant = _tenantCache.Get(1);

            //Assert
            tenant.TenancyName.ShouldBe(Tenant.DefaultTenantName);
        }
示例#6
0
        private void HandleSenderToReceiver(UserIdentifier senderIdentifier, UserIdentifier receiverIdentifier, string message)
        {
            var friendshipState = _friendshipManager.GetFriendshipOrNull(senderIdentifier, receiverIdentifier)?.State;

            if (friendshipState == null)
            {
                friendshipState = FriendshipState.Accepted;

                var receiverTenancyName = receiverIdentifier.TenantId.HasValue
                    ? _tenantCache.Get(receiverIdentifier.TenantId.Value).TenancyName
                    : null;

                var receiverUser = _userManager.GetUser(receiverIdentifier);
                _friendshipManager.CreateFriendship(
                    new Friendship(
                        senderIdentifier,
                        receiverIdentifier,
                        receiverTenancyName,
                        receiverUser.UserName,
                        receiverUser.Avatar,
                        friendshipState.Value)
                    );
            }

            if (friendshipState.Value == FriendshipState.Blocked)
            {
                //Do not send message if receiver banned the sender
                return;
            }

            var sentMessage = new ChatMessage(
                senderIdentifier,
                receiverIdentifier,
                ChatSide.Sender,
                message,
                ChatMessageReadState.Read
                );

            Save(sentMessage);

            _chatCommunicator.SendMessageToClient(
                _onlineClientManager.GetAllByUserId(senderIdentifier),
                sentMessage
                );
        }
        private string GetTenantLogoUrl(int?tenantId)
        {
            if (!tenantId.HasValue)
            {
                return(_webUrlService.GetServerRootAddress().EnsureEndsWith('/') + "TenantCustomization/GetTenantLogo?skin=light");
            }

            var tenant = _tenantCache.Get(tenantId.Value);

            return(_webUrlService.GetServerRootAddress(tenant.TenancyName).EnsureEndsWith('/') + "TenantCustomization/GetTenantLogo?skin=light&tenantId=" + tenantId.Value);
        }
示例#8
0
        public virtual string GetNameOrConnectionString(DbPerTenantConnectionStringResolveArgs args)
        {
            if (args.TenantId == null)
            {
                //Requested for host
                return(base.GetNameOrConnectionString(args));
            }
            var tenantCacheItem = _tenantCache.Get(args.TenantId.Value);

            if (tenantCacheItem.ConnectionString.IsNullOrEmpty())
            {
                //Tenant has not dedicated database
                return(base.GetNameOrConnectionString(args));
            }
            return(tenantCacheItem.ConnectionString);
        }
示例#9
0
        public async Task <string> GetTenantAdminToken([FromBody] GetTenantAdminToken input)
        {
            var tenancyName = _tenantCache.Get(input.TenantId).TenancyName;

            var loginResult = await GetLoginResultAsync(
                AbpUserBase.AdminUserName,
                CharonX.Authorization.Users.User.DefaultPassword,
                tenancyName
                );

            int?tenantId = null;

            if (loginResult.Tenant != null)
            {
                tenantId = loginResult.Tenant.Id;
            }

            var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity, tenantId));

            return(accessToken);
        }
示例#10
0
 private string GetTenancyName(int?tenantId)
 {
     return(tenantId.HasValue ? TenantCache.Get(tenantId.Value).TenancyName : null);
 }
示例#11
0
        public async Task <ResultDto <PaymentOrderDto> > PlaceOrderAsync(CreatePaymentOrderDto input)
        {
            var tenant = tenantCache.Get(input.TenantId);

            if (!string.IsNullOrEmpty(input.ExternalOrderId))
            {
                var isDuplicate = await paymentOrderRepository.GetAll().AnyAsync(o =>
                                                                                 o.TenantId == input.TenantId && o.ExternalOrderId == input.ExternalOrderId);

                if (isDuplicate)
                {
                    return(new ResultDto <PaymentOrderDto> {
                        IsSuccess = false, ErrorMessage = "商户订单号重复"
                    });
                }
            }
            //支付通道
            var channel = await channelRepository.FirstOrDefaultAsync(c => c.ChannelCode == input.ChannelCode);

            if (channel == null)
            {
                return(new ResultDto <PaymentOrderDto>()
                {
                    IsSuccess = false, ErrorMessage = "支付通道编码错误"
                });
            }
            int channelId = channel.Id;
            //银行
            int?       bankId = null;
            List <int> excludedBankCompanies = null;

            if (channel.RequiredBank)
            {
                var bank = await bankRepository.FirstOrDefaultAsync(b => b.BankCode == input.BankCode);

                if (bank != null)
                {
                    bankId = bank.Id;
                    excludedBankCompanies = await bankOverrideRepository.GetAll().Where(bo => bo.BankId == bank.Id && bo.OverrideIsActive == false).Select(bo => bo.CompanyId).ToListAsync();
                }
                else
                {
                    return(new ResultDto <PaymentOrderDto>()
                    {
                        IsSuccess = false, ErrorMessage = "银行编码错误"
                    });
                }
            }
            //TODO 支付订单策略

            var policies = await paymentOrderPolicyService.GetPoliciesAsync(input.TenantId, channelId);

            if (policies == null)
            {
                return(new ResultDto <PaymentOrderDto> {
                    IsSuccess = false, ErrorMessage = "没有匹配的支付接口"
                });
            }

            var verifiedPaymentOrder = new VerifiedPaymentOrderDto()
            {
                PaymentOrder = input
            };
            bool isUnsupportedBank = false;

            //订单提交策略验证
            foreach (var item in policies)
            {
                if (await paymentOrderPolicyService.VerifyPolicyAsync(item, input))
                {
                    if (excludedBankCompanies != null && excludedBankCompanies.Contains(item.CompanyId))
                    {
                        isUnsupportedBank = true;
                        continue;
                    }
                    verifiedPaymentOrder.Success   = true;
                    verifiedPaymentOrder.CompanyId = item.CompanyId;
                    verifiedPaymentOrder.AccountId = item.AccountId;
                    verifiedPaymentOrder.ChannelId = channelId;
                    verifiedPaymentOrder.BankId    = bankId;
                    break;
                }
            }

            if (verifiedPaymentOrder.CompanyId == 0)
            {
                if (isUnsupportedBank)
                {
                    return(new ResultDto <PaymentOrderDto>()
                    {
                        IsSuccess = false, ErrorMessage = "不支持该银行"
                    });
                }
                else
                {
                    return(new ResultDto <PaymentOrderDto>()
                    {
                        IsSuccess = false, ErrorMessage = "没有可用的第三方平台"
                    });
                }
            }

            if (verifiedPaymentOrder.AccountId == 0)
            {
                return(new ResultDto <PaymentOrderDto>()
                {
                    IsSuccess = false, ErrorMessage = "没有可用的第三方账号"
                });
            }
            var company = await companyRepository.GetAsync(verifiedPaymentOrder.CompanyId);

            var account = await accountRepository.GetAsync(verifiedPaymentOrder.AccountId);

            var channelOverride = await channelOverrideRepository.FirstOrDefaultAsync(co => co.CompanyId == company.Id && co.ChannelId == channelId);

            var paymentOrder = BuildPaymentOrder(verifiedPaymentOrder, GetFeeRate(company, channelOverride, account), input.TransparentKey);
            await paymentOrderRepository.InsertAsync(paymentOrder);

            await CurrentUnitOfWork.SaveChangesAsync();

            return(new ResultDto <PaymentOrderDto>
            {
                IsSuccess = true,
                Data = ObjectMapper.Map <PaymentOrderDto>(paymentOrder),
                ErrorMessage = "提交成功"
            });
        }