public async Task <LoadMessagesOperationResult> LoadMessagesAsync(int?top = null)
        {
            IEnumerable <ChatMessage> messages;

            try
            {
                messages = await _chatMessagesRepository.GetMessagesAsync(top);
            }
            catch (Exception ex)
            {
                return(ServerOperationResult.Failure <LoadMessagesOperationResult>(ex.Message));
            }

            return(new LoadMessagesOperationResult
            {
                Messages = messages
            });
        }
        public async Task <LoginOperationResult> LoginAsync(string login, string password)
        {
            var clientCallback = OperationContext.Current.GetCallbackChannel <IClientCallback>();

            CheckAlreadyLoggedInAsync(login);

            User user;

            try
            {
                user = await _usersRepository.LoginAsync(login, password);
            }
            catch (Exception ex)
            {
                return(ServerOperationResult.Failure <LoginOperationResult>(ex.Message));
            }

            return(user == null
                ? ServerOperationResult.Failure <LoginOperationResult>("Не верный логин или пароль.")
                : Login(user, clientCallback));
        }
        public async Task <SendMessageOperationResult> SendMessageAsync(ChatMessage message, bool save = true)
        {
            if (save)
            {
                try
                {
                    await _chatMessagesRepository.AddMessageAsync(message);
                }
                catch (Exception ex)
                {
                    return(ServerOperationResult.Failure <SendMessageOperationResult>(ex.Message));
                }
            }

            foreach (var clientInfo in _clients.Where(c => c.Value.User.Id != message.UserId))
            {
                clientInfo.Value.Callback.SetMessage(message);
            }

            return(new SendMessageOperationResult());
        }
        public async Task <LoginOperationResult> RegisterAsync(string userName, string login, string password)
        {
            var clientCallback = OperationContext.Current.GetCallbackChannel <IClientCallback>();

            User user;

            try
            {
                var loginExists = await _usersRepository.CheckLoginExists(login);

                if (loginExists)
                {
                    return(ServerOperationResult.Failure <LoginOperationResult>($"Логин {login} уже зарегистрирован."));
                }

                user = await _usersRepository.RegisterAsync(userName, login, password);
            }
            catch (Exception ex)
            {
                return(ServerOperationResult.Failure <LoginOperationResult>(ex.Message));
            }

            return(Login(user, clientCallback));
        }