Ejemplo n.º 1
0
        public void AddUsersForAddUsersToChat(string jsonUsers, string userGuid, string chatGuid)
        {
            var userElasticResult = _userRepository.Get(userGuid);

            if (!userElasticResult.Success)
            {
                Clients.Caller.onAddUsersForAddUsersToChatCaller(
                    JsonConvert.SerializeObject(new { error = true, message = UserErrorMessage }));
                return;
            }
            var user = userElasticResult.Value;

            var chatElasticResult = _chatRepository.Get(chatGuid);

            if (!chatElasticResult.Success)
            {
                Clients.Caller.onAddUsersForAddUsersToChatCaller(
                    JsonConvert.SerializeObject(new { error = true, message = ChatErrorMessage }));
                return;
            }
            var chat = chatElasticResult.Value;

            var usersGuids = JsonConvert.DeserializeObject <string[]>(jsonUsers);

            var usersElasticResult = _userRepository.GetAllByGuids(usersGuids);

            if (!usersElasticResult.Success)
            {
                Clients.Caller.onAddUsersForAddUsersToChatCaller(
                    JsonConvert.SerializeObject(new { error = true, message = ServerErrorMessage }));
                return;
            }
            var users = usersElasticResult.Value;

            var chatUserElasticResult = _chatUserRepository.GetAllByChatGuid(chatGuid);

            if (!chatUserElasticResult.Success)
            {
                Clients.Caller.onAddUsersForAddUsersToChatCaller(
                    JsonConvert.SerializeObject(new { error = true, message = ServerErrorMessage }));
                return;
            }

            var chatUsers = chatUserElasticResult.Value;

            var newUsers = users.Where(u => chatUsers.All(cu => cu.UserGuid != u.Guid)).ToArray();

            foreach (var newUser in newUsers)
            {
                var elasticResult = _chatUserRepository.Add(chatGuid, newUser.Guid);
                if (!elasticResult.Success)
                {
                    Clients.Caller.onAddUsersForAddUsersToChatCaller(
                        JsonConvert.SerializeObject(new { error = true, message = ServerErrorMessage }));
                    return;
                }

                var messageElasticResult = _messageRepository.AddAdminMessage(chatGuid, user,
                                                                              string.Format(NewChatUserFormatString, newUser.UserName));
                if (!messageElasticResult.Success)
                {
                    Clients.Caller.onAddUsersForAddUsersToChatCaller(
                        JsonConvert.SerializeObject(new { error = true, message = ServerErrorMessage }));
                    return;
                }

                var message = messageElasticResult.Value;
                Clients.Group(chatGuid).onSendMessageOthers(JsonConvert.SerializeObject(new { message, chatGuid }));

                foreach (var connectionId in newUser.ConnectionIds)
                {
                    Groups.Add(connectionId, chatGuid);
                }
            }

            var newUsersConnectionIds = newUsers.SelectMany(u => u.ConnectionIds).ToArray();

            Clients.Clients(newUsersConnectionIds)
            .onAddUsersForAddUsersToChatNewUsers(JsonConvert.SerializeObject(chat));
        }