Пример #1
0
        /// <summary>
        /// Distribution of the received data across database services and sending the operation result
        /// and synchronizing another users chats
        /// </summary>
        /// <param name="clientOperationMessage"></param>
        public void HandleRequest(byte[] byteMessage)
        {
            var stringDecryptedMessage = _encoder.Decryption(byteMessage);

            Console.WriteLine("received decrypted message : " + stringDecryptedMessage);
            _logger.Info($"Received decrypted message from user {_client.Id} : {stringDecryptedMessage}");
            var message = _jsonStringSerializer.Deserialize <ClientOperationMessage>(stringDecryptedMessage);


            //TODO : наверняка можно сделать лучше
            //switch will convert by compiler to hashtable
            if (message != null)
            {
                _logger.Info($"Getted correct message from user {_client.Id}");
                switch (message.Operation)
                {
                case ClientOperations.Authorization:
                    var userReceiveModelAuthorization = _jsonStringSerializer.Deserialize <UserReceiveModel>(message.JsonData);
                    var authorizationResult           = _mainLogic.GetUser(userReceiveModelAuthorization, true);
                    authorizationResult.ToListener = ListenerType.AuthorizationListener;

                    if (authorizationResult.OperationResult == OperationsResults.Successfully)
                    {
                        _client.Id = (authorizationResult.JsonData as UserResponseModel).UserId;
                        Console.WriteLine(_client.Id + " Пользователь успешно авторизировался");

                        _logger.Info($"User {_client.Id} authorization is successfully");

                        _clientsSynchronizer.SynchronizeOnlineStatus(authorizationResult.JsonData as UserResponseModel);
                        authorizationResult.JsonData = _jsonStringSerializer.Serialize(authorizationResult.JsonData as UserResponseModel);
                    }
                    else
                    {
                        _logger.Info($"User {_client.Id} authorization is unseccessfully");
                    }

                    var authorizationResultJson = _jsonStringSerializer.Serialize(authorizationResult);
                    _client.SendMessage(_encoder.Encryption(authorizationResultJson));
                    //_client.SendMessage(authorizationResultJson);
                    break;

                case ClientOperations.Registration:
                    var userReceiveModelRegistration = _jsonStringSerializer.Deserialize <UserReceiveModel>(message.JsonData);
                    var registrationResult           = _mainLogic.UserRegistration(userReceiveModelRegistration);
                    var registrationResultJson       = _jsonStringSerializer.Serialize(registrationResult);

                    _logger.Info($"User registration - login: {userReceiveModelRegistration.Login} " +
                                 $" password: {userReceiveModelRegistration.Password} " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), registrationResult.OperationResult)} " +
                                 $"Error info : {registrationResult.ErrorInfo}");

                    _client.SendMessage(_encoder.Encryption(registrationResultJson));
                    //_client.SendMessage(registrationResultJson);
                    break;

                case ClientOperations.UpdateProfile:
                    var userReceiveModelUpdateProfile = _jsonStringSerializer.Deserialize <UserReceiveModel>(message.JsonData);
                    var updateProfileResult           = _mainLogic.UserProfileUpdate(userReceiveModelUpdateProfile);
                    var updateProfileResultJson       = _jsonStringSerializer.Serialize(updateProfileResult);

                    _logger.Info($"User {_client.Id} - username: {userReceiveModelUpdateProfile.UserName} " +
                                 $" password: {userReceiveModelUpdateProfile.Password} " +
                                 $" name: {userReceiveModelUpdateProfile.Name} " +
                                 $" secondname: {userReceiveModelUpdateProfile.SecondName} " +
                                 $" gender: {userReceiveModelUpdateProfile.Gender} " +
                                 $" phoneNumber: {userReceiveModelUpdateProfile.PhoneNumber} " +
                                 $" country: {userReceiveModelUpdateProfile.Country} " +
                                 $" city: {userReceiveModelUpdateProfile.City} " +
                                 $" name: {userReceiveModelUpdateProfile.Name} " +
                                 $" result: {Enum.GetName(typeof(OperationsResults), updateProfileResult.OperationResult)}" +
                                 $" Error info : {updateProfileResult.ErrorInfo}");

                    _client.SendMessage(_encoder.Encryption(updateProfileResultJson));
                    //_client.SendMessage(updateProfileResultJson);
                    break;

                case ClientOperations.GetUsers:
                    var userPaginationReceiveModel = _jsonStringSerializer.Deserialize <UserPaginationReceiveModel>(message.JsonData);
                    var getUsersResult             = _mainLogic.GetPageOfUsers(userPaginationReceiveModel);

                    _logger.Info($"User {_client.Id} has get users " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), getUsersResult.OperationResult)} " +
                                 $"error info: {getUsersResult.ErrorInfo}");

                    getUsersResult.JsonData = _jsonStringSerializer.Serialize(getUsersResult.JsonData as List <UserListResponseModel>);
                    var getUsersResultJson = _jsonStringSerializer.Serialize(getUsersResult);

                    _client.SendMessage(_encoder.Encryption(getUsersResultJson));
                    //_client.SendMessage(getUsersResultJson);
                    break;

                case ClientOperations.SendMessage:
                    var messageReceiveModelSend = _jsonStringSerializer.Deserialize <MessageReceiveModel>(message.JsonData);
                    var messageSendResult       = _mainLogic.AddMessage(messageReceiveModelSend);

                    if (messageSendResult.JsonData != null)
                    {
                        var messageResponseModel = messageSendResult.JsonData as MessageResponseModel;

                        _logger.Info($"User {_client.Id} has send message " +
                                     $"chat id: {messageResponseModel.ChatId} " +
                                     $"message: {messageResponseModel.UserMassage}");

                        _clientsSynchronizer.SynchronizeChatsMessages(messageResponseModel);
                        messageSendResult.JsonData = _jsonStringSerializer.Serialize(messageResponseModel);
                    }
                    else
                    {
                        _logger.Info($"User {_client.Id} has not send message " +
                                     $"result: {Enum.GetName(typeof(OperationsResults), messageSendResult.OperationResult)} " +
                                     $"error info: {messageSendResult.ErrorInfo}");
                    }

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(messageSendResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(messageSendResult));
                    break;

                case ClientOperations.CreateChat:
                    var chatReceiveModelCreate = _jsonStringSerializer.Deserialize <ChatReceiveModel>(message.JsonData);
                    var chatCreateResult       = _mainLogic.ChatCreate(chatReceiveModelCreate);

                    if (chatCreateResult.JsonData != null)
                    {
                        var chatResponseModel = chatCreateResult.JsonData as ChatResponseModel;

                        _logger.Info($"User {_client.Id} has create chat " +
                                     $"chat id: {chatResponseModel.Id} " +
                                     $"creator id: {chatResponseModel.CreatorId} " +
                                     $"chatname: {chatResponseModel.ChatName} " +
                                     $"message: {chatResponseModel.CountUsers}");

                        _clientsSynchronizer.SynchronizeCreatingChat(chatResponseModel);
                        chatCreateResult.JsonData = _jsonStringSerializer.Serialize(chatResponseModel);
                    }
                    else
                    {
                        _logger.Info($"User {_client.Id} has not create chat " +
                                     $"result: {Enum.GetName(typeof(OperationsResults), chatCreateResult.OperationResult)} " +
                                     $"error info: {chatCreateResult.ErrorInfo}");
                    }

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(chatCreateResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(chatCreateResult));
                    break;

                case ClientOperations.UpdateChat:
                    var chatReceiveModelUpdate = _jsonStringSerializer.Deserialize <ChatReceiveModel>(message.JsonData);
                    var chatBeforeUpdate       = _mainLogic.GetChat(chatReceiveModelUpdate);
                    var chatUpdateResult       = _mainLogic.ChatUpdate(chatReceiveModelUpdate);

                    if (chatUpdateResult.JsonData != null)
                    {
                        var chatResponseModelAfterUpdate = chatUpdateResult.JsonData as ChatResponseModel;

                        _logger.Info($"User {_client.Id} has update chat " +
                                     $"chat id: {chatResponseModelAfterUpdate.Id} " +
                                     $"creator id: {chatResponseModelAfterUpdate.CreatorId} " +
                                     $"chatname: {chatResponseModelAfterUpdate.ChatName} " +
                                     $"count users: {chatResponseModelAfterUpdate.CountUsers}");

                        if (chatBeforeUpdate.CountUsers == 2 && chatResponseModelAfterUpdate.CountUsers > 2)
                        {
                            _clientsSynchronizer.SynchronizeCreatingChat(chatResponseModelAfterUpdate);
                        }
                        else
                        {
                            _clientsSynchronizer.SynchronizeUpdatingChat(chatResponseModelAfterUpdate, chatBeforeUpdate);
                        }

                        if (chatResponseModelAfterUpdate.CreatorId != _client.Id)
                        {
                            chatUpdateResult.JsonData = null;
                        }
                        else
                        {
                            chatUpdateResult.JsonData = _jsonStringSerializer.Serialize(chatResponseModelAfterUpdate);
                        }
                    }
                    else
                    {
                        _logger.Info($"User {_client.Id} has not update chat " +
                                     $"result: {Enum.GetName(typeof(OperationsResults), chatUpdateResult.OperationResult)} " +
                                     $"error info: {chatUpdateResult.ErrorInfo}");
                    }

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(chatUpdateResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(chatUpdateResult));
                    break;

                case ClientOperations.DeleteChat:
                    var chatReceiveModelDelete = _jsonStringSerializer.Deserialize <ChatReceiveModel>(message.JsonData);
                    var chatDeleteResult       = _mainLogic.ChatDelete(chatReceiveModelDelete);

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(chatDeleteResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(chatDeleteResult));

                    _logger.Info($"User {_client.Id} has delete chat " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), chatDeleteResult.OperationResult)} " +
                                 $"error info: {chatDeleteResult.ErrorInfo}");

                    if (chatDeleteResult.OperationResult == OperationsResults.Successfully)
                    {
                        _clientsSynchronizer.SynchronizeDeletingChat(chatReceiveModelDelete);
                    }
                    break;

                case ClientOperations.GetChats:
                    var userPaginationModetGetChats = _jsonStringSerializer.Deserialize <UserPaginationReceiveModel>(message.JsonData);
                    var getChatsResult = _mainLogic.GetPageOfChats(userPaginationModetGetChats);

                    _logger.Info($"User {_client.Id} has get chats " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), getChatsResult.OperationResult)} " +
                                 $"error info: {getChatsResult.ErrorInfo}");

                    getChatsResult.JsonData = _jsonStringSerializer.Serialize(getChatsResult.JsonData as List <ChatResponseModel>);
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(getChatsResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(getChatsResult));
                    break;

                //---
                case ClientOperations.UpdateMessage:
                    var messageReceiveModelUpdate = _jsonStringSerializer.Deserialize <MessageReceiveModel>(message.JsonData);
                    var updateMessageResult       = _mainLogic.UpdateMessage(messageReceiveModelUpdate);

                    if (updateMessageResult.JsonData != null)
                    {
                        var messageResponseModel = updateMessageResult.JsonData as MessageResponseModel;

                        _logger.Info($"User {_client.Id} has update message " +
                                     $"message id: {messageResponseModel.Id} " +
                                     $"user id: {messageResponseModel.UserId} " +
                                     $"message: {messageResponseModel.UserMassage}");

                        _clientsSynchronizer.SynchronizeChatsMessages(messageResponseModel);
                        updateMessageResult.JsonData = _jsonStringSerializer.Serialize(messageResponseModel);
                    }
                    else
                    {
                        _logger.Info($"User {_client.Id} has not update message " +
                                     $"result: {Enum.GetName(typeof(OperationsResults), updateMessageResult.OperationResult)} " +
                                     $"error info: {updateMessageResult.ErrorInfo}");
                    }

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(updateMessageResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(updateMessageResult));
                    break;

                case ClientOperations.DeleteMessage:
                    var messageReceiveModelDelete = _jsonStringSerializer.Deserialize <MessageReceiveModel>(message.JsonData);
                    var deleteMessageResult       = _mainLogic.DeleteMessage(messageReceiveModelDelete);
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(deleteMessageResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(deleteMessageResult));

                    _logger.Info($"User {_client.Id} has delete message " +
                                 $"message id: {messageReceiveModelDelete.Id} " +
                                 $"chat id: {messageReceiveModelDelete.ChatId} " +
                                 $"message: {messageReceiveModelDelete.UserMassage} " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), deleteMessageResult.OperationResult)} " +
                                 $"error info: {deleteMessageResult.ErrorInfo}");

                    if (deleteMessageResult.OperationResult == OperationsResults.Successfully)
                    {
                        _clientsSynchronizer.SynchronizeChatsDeletingMessages(messageReceiveModelDelete);
                    }
                    break;

                case ClientOperations.GetMessages:
                    var chatPaginationReceiveMessageGet = _jsonStringSerializer.Deserialize <ChatPaginationReceiveModel>(message.JsonData);
                    var getChatMessagesResult           = _mainLogic.GetChatMessages(chatPaginationReceiveMessageGet);

                    _logger.Info($"User {_client.Id} has get messages " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), getChatMessagesResult.OperationResult)} " +
                                 $"error info: {getChatMessagesResult.ErrorInfo}");

                    getChatMessagesResult.JsonData = _jsonStringSerializer.Serialize(getChatMessagesResult.JsonData as List <MessageResponseModel>);
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(getChatMessagesResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(getChatMessagesResult));

                    break;

                case ClientOperations.AddFriend:
                    var friendReceiveModelAdd = _jsonStringSerializer.Deserialize <FriendReceiveModel>(message.JsonData);

                    _logger.Info($"User {_client.Id} has send invite to {friendReceiveModelAdd.FriendId} for friend");

                    _clientsSynchronizer.SynchronizeAddFriendNotifications(friendReceiveModelAdd);
                    break;

                case ClientOperations.DeleteFriend:
                    var friendReceiveModelDelete = _jsonStringSerializer.Deserialize <FriendReceiveModel>(message.JsonData);
                    var friendDeleteResult       = _mainLogic.DeleteFriend(friendReceiveModelDelete);
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(friendDeleteResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(friendDeleteResult));

                    _logger.Info($"User {_client.Id} has delete friend {friendReceiveModelDelete.FriendId} " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), friendDeleteResult.OperationResult)} " +
                                 $"error info: {friendDeleteResult.ErrorInfo}");

                    if (friendDeleteResult.OperationResult == OperationsResults.Successfully)
                    {
                        _clientsSynchronizer.SynchronizeDeletingFriend(friendReceiveModelDelete);
                    }
                    break;

                case ClientOperations.GetFriends:
                    var userPaginationReceiveModelGetFriends = _jsonStringSerializer.Deserialize <UserPaginationReceiveModel>(message.JsonData);
                    var getFriendsResult = _mainLogic.GetFriendsPage(userPaginationReceiveModelGetFriends);

                    _logger.Info($"User {_client.Id} has get friends " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), getFriendsResult.OperationResult)} " +
                                 $"error info: {getFriendsResult.ErrorInfo}");

                    getFriendsResult.JsonData = _jsonStringSerializer.Serialize(getFriendsResult.JsonData as List <UserListResponseModel>);
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(getFriendsResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(getFriendsResult));

                    break;

                case ClientOperations.UpdateNotification:
                    var notificationReceiveModelUpdate = _jsonStringSerializer.Deserialize <NotificationReceiveModel>(message.JsonData);
                    var notificationUpdateResult       = _mainLogic.UpdateNotification(notificationReceiveModelUpdate);
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(notificationUpdateResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(notificationUpdateResult));

                    _logger.Info($"User {_client.Id} has update notification " +
                                 $"notification id: {notificationReceiveModelUpdate.Id} " +
                                 $"from user id: {notificationReceiveModelUpdate.FromUserId} " +
                                 $"to user id: {notificationReceiveModelUpdate.ToUserId} " +
                                 $"message: {notificationReceiveModelUpdate.Message} " +
                                 $"is accepted: {notificationReceiveModelUpdate.IsAccepted} " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), notificationUpdateResult.OperationResult)} " +
                                 $"error info: {notificationUpdateResult.ErrorInfo}");

                    if (notificationUpdateResult.OperationResult == OperationsResults.Successfully)
                    {
                        _clientsSynchronizer.SynchronizeAddingFriend(notificationReceiveModelUpdate);
                    }
                    break;

                case ClientOperations.GetNotifications:
                    var notificationReceiveModelGetPage = _jsonStringSerializer.Deserialize <UserPaginationReceiveModel>(message.JsonData);
                    var getNotificationPageResult       = _mainLogic.GetNotificationsPage(notificationReceiveModelGetPage);

                    _logger.Info($"User {_client.Id} has get notifications " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), getNotificationPageResult.OperationResult)} " +
                                 $"error info: {getNotificationPageResult.ErrorInfo}");

                    if (getNotificationPageResult.JsonData != null)
                    {
                        getNotificationPageResult.JsonData = _jsonStringSerializer.Serialize(getNotificationPageResult.JsonData as List <NotificationResponseModel>);
                    }

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(getNotificationPageResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(getNotificationPageResult));

                    break;

                case ClientOperations.GetUser:
                    var userReceiveModelGetUser = _jsonStringSerializer.Deserialize <UserReceiveModel>(message.JsonData);
                    var getUserResult           = _mainLogic.GetUser(userReceiveModelGetUser);

                    _logger.Info($"User {_client.Id} has get user {userReceiveModelGetUser.Id} info " +
                                 $"result: {Enum.GetName(typeof(OperationsResults), getUserResult.OperationResult)} " +
                                 $"error info: {getUserResult.ErrorInfo}");

                    if (getUserResult.JsonData != null)
                    {
                        getUserResult.JsonData = _jsonStringSerializer.Serialize(getUserResult.JsonData as UserResponseModel);
                    }

                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(getUserResult)));
                    //_client.SendMessage(_jsonStringSerializer.Serialize(getUserResult));
                    break;

                default:
                    _client.SendMessage(_encoder.Encryption(_jsonStringSerializer.Serialize(new OperationResultInfo()
                    {
                        ErrorInfo       = "Незарегистрированная операция",
                        OperationResult = OperationsResults.Unsuccessfully,
                        JsonData        = null
                    })));
                    break;
                }
            }
            else
            {
                Console.WriteLine("Ошибка целостности полученных данных");
                _logger.Warn($"User {_client.Id} ошибка целостности полученных данных");
            }
        }