Пример #1
0
        public async Task Process()
        {
            try
            {
                Stream = _client.GetStream();
                User user = null;

                // Авторизація клієнта (поки не авторизується, далі не пустить, тому й в циклі
                while (user == null && _client.Connected)
                {
                    // Отримання логіну та паролю
                    string message = GetMessage();
                    if (message == "Disconnect")
                    {
                        throw new Exception();
                    }
                    else if (message.Length > 0)
                    {
                        Creds creds = null;
                        try { creds = JsonConvert.DeserializeObject <Creds>(message); }
                        catch (Exception) { Console.WriteLine($"User {this.Id}({UserName}) sent message with credantials strucrure promlem"); }
                        if (creds != null)
                        {
                            UserName = creds.Login;
                            Console.WriteLine($"User {this.Id}({UserName}) is trying to connect");
                            // Перевірка чи з'єднання є повторним (чи юзер зараз вже користується додатком на іншому пристрої)
                            if (_server.UserConnectionIsRepeated(UserName, this))
                            {
                                _server.BroadcastMessage("repeat", this);
                                Console.WriteLine($"User {this.Id}({UserName}) has already connected before");
                                continue;
                            }
                            // Перевірка логіну та паролю
                            user = await _dbHelper.CheckCredentials(creds.Login, creds.Password);

                            var userDTO = _mapper.Map <UserDTO>(user);
                            message = JsonConvert.SerializeObject(userDTO);
                            // Відправка відповіді
                            _server.BroadcastMessage(message, this);
                            // Логування
                            if (userDTO == null)
                            {
                                Console.WriteLine($"User {this.Id}({UserName}) authorization failed");
                            }
                            else
                            {
                                Accounts = user.Client.Accounts.ToList();
                                Console.WriteLine($"User {this.Id}({UserName}) has connected");
                            }
                        }
                    }
                }

                // Робота сесії клієнта
                while (true)
                {
                    try
                    {
                        // Постійне очікування на команду
                        string message = GetMessage();
                        // Якщо прийшла команда на переказ коштів
                        if (message.Substring(0, 10) == "operation ")
                        {
                            var          res  = "Successful";
                            var          obj  = message.Substring(10);
                            OperationDTO oper = JsonConvert.DeserializeObject <OperationDTO>(message.Substring(10));
                            try
                            {
                                var toAccount = (await _dbHelper.FindAccount(a => a.Number == oper.ToAccountNumber)).FirstOrDefault();
                                if (toAccount == null)
                                {
                                    res = "Wrong:  Recipient account not found";
                                }

                                var fromAccount = (await _dbHelper.FindAccount(a => a.Number == oper.FromAccountNumber)).FirstOrDefault();
                                if (fromAccount == null)
                                {
                                    res = "Wrong:  Sender account not found";
                                }

                                if (res == "Successful")
                                {
                                    if (!fromAccount.WithdrawMoney(oper.Amount))
                                    {
                                        res = "Wrong:  Not enough money";
                                    }
                                    else
                                    {
                                        var operation = _mapper.Map <Operation>(oper);

                                        operation.ResultIsSuccess = true;

                                        operation.Account = fromAccount;
                                        fromAccount.Operations.Add(operation);

                                        var operationTo = (Operation)operation.Clone();
                                        operationTo.Account = toAccount;
                                        toAccount.Amount   += operationTo.Amount;
                                        toAccount.Operations.Add(operationTo);

                                        await _dbHelper.SaveChangesAsync();

                                        var anotherTcpClient = _server.GetAccountFoOrherOperation(toAccount.Number, this);
                                        if (anotherTcpClient != null)
                                        {
                                            var operationDTO = _mapper.Map <OperationDTO>(operationTo);
                                            operationDTO.CurrentAccountNumber = toAccount.Number;
                                            message = JsonConvert.SerializeObject(operationDTO);
                                            _server.BroadcastMessage("operation " + message, anotherTcpClient);
                                        }
                                    }
                                }
                                Console.WriteLine($"User {this.Id}({UserName}) operation result:\n\t{oper.CurrentAccountNumber}: {res}");
                            }
                            catch (Exception ex)
                            { Console.WriteLine($"User {this.Id}({UserName}) operation error:\n\t{oper.CurrentAccountNumber}: {ex.Message}"); }
                            _server.BroadcastMessage("operatRes " + res, this);
                        }
                        // Якщо прийшов запит на отримання всіх клієнтів
                        else if (message.Substring(0, 10) == "getClients")
                        {
                            try
                            {
                                var clients    = (await _dbHelper.GetAllClients()).ToList();
                                var clientDTOs = _mapper.Map <List <ClientDTO> >(clients);
                                message = JsonConvert.SerializeObject(clientDTOs);
                                _server.BroadcastMessage("allClients" + message, this);
                                Console.WriteLine($"User {this.Id}({UserName}) get result:\n\temployee: clients are got successfully");
                            }
                            catch (Exception ex)
                            { Console.WriteLine($"User {this.Id}({UserName}) get error:\n\temployee: {ex.Message}"); }
                        }
                        // Якщо прийшов запит на створення клієнта
                        else if (message.Substring(0, 10) == "clientAdd ")
                        {
                            var res       = "Successful";
                            var clientDTO = JsonConvert.DeserializeObject <ClientDTO>(message.Substring(10));
                            try
                            {
                                var clientInDB = (await _dbHelper.FindClient(c => c.IPN == clientDTO.IPN)).FirstOrDefault();
                                if (clientInDB != null)
                                {
                                    res = "Wrong:  Client has already exist";
                                }
                                else
                                {
                                    var client = _mapper.Map <Client>(clientDTO);
                                    await _dbHelper.AddClient(client);

                                    await _dbHelper.SaveChangesAsync();
                                }
                                Console.WriteLine($"User {this.Id}({UserName}) action result:\n\tclient created: {res}");
                            }
                            catch (Exception ex)
                            { Console.WriteLine($"User {this.Id}({UserName}) action error:\n\tadd client: {ex.Message}"); }
                            _server.BroadcastMessage("operatRes " + res, this);
                        }
                        // Якщо прийшов запит на створення користувача (для змоги користуватися додатком)
                        else if (message.Substring(0, 10) == "userAdd   ")
                        {
                            var res     = "Successful";
                            var userDTO = JsonConvert.DeserializeObject <UserDTO>(message.Substring(10));
                            try
                            {
                                var clientInDB = (await _dbHelper.FindClient(c => c.IPN == userDTO.Client.IPN)).FirstOrDefault();
                                if (clientInDB == null)
                                {
                                    res = "Wrong:  Client hasn't found";
                                }
                                else
                                {
                                    var userInDB = (await _dbHelper.FindUser(u => u.ClientId == clientInDB.Id)).FirstOrDefault();
                                    if (userInDB != null)
                                    {
                                        res = "Wrong:  User has already exist";
                                    }
                                    else
                                    {
                                        var userToAdd  = _mapper.Map <User>(userDTO);
                                        var clientRole = (await _dbHelper.FindRole(r => r.Name == "Client")).FirstOrDefault();
                                        if (clientRole != null)
                                        {
                                            userToAdd.RoleId = clientRole.Id;
                                        }
                                        userToAdd.Client       = clientInDB;
                                        userToAdd.PasswordSalt = crypto.GenerateSalt();
                                        userToAdd.PasswordHash = crypto.Compute(userDTO.PasswordHash, userToAdd.PasswordSalt);
                                        await _dbHelper.AddUser(userToAdd);

                                        await _dbHelper.SaveChangesAsync();
                                    }
                                }
                                Console.WriteLine($"User {this.Id}({UserName}) action result:\n\tadd user: {res}");
                            }
                            catch (Exception ex)
                            { Console.WriteLine($"User {this.Id}({UserName}) action error:\n\tadd user: {ex.Message}"); }
                            _server.BroadcastMessage("operatRes " + res, this);
                        }
                        // Якщо прийшов запитна створення рахунку
                        else if (message.Substring(0, 10) == "accountAdd")
                        {
                            var res        = "Successful";
                            var ipn        = message.Substring(10, 10);
                            var accountDTO = JsonConvert.DeserializeObject <AccountDTO>(message.Substring(20));
                            try
                            {
                                var clientInDB = (await _dbHelper.FindClient(c => c.IPN == ipn)).FirstOrDefault();
                                if (clientInDB == null)
                                {
                                    res = "Wrong:  Client hasn't found";
                                }
                                else
                                {
                                    var accountToAdd = _mapper.Map <Account>(accountDTO);
                                    accountToAdd.Client = clientInDB;
                                    await _dbHelper.AddAccount(accountToAdd);

                                    await _dbHelper.SaveChangesAsync();
                                }
                                Console.WriteLine($"User {this.Id}({UserName}) action result:\n\tadd account: {res}");
                            }
                            catch (Exception ex)
                            { Console.WriteLine($"User {this.Id}({UserName}) action error:\n\tadd account: {ex.Message}"); }
                            _server.BroadcastMessage("operatRes " + res, this);
                        }
                    }
                    catch (Exception) { break; }
                }
            }
            catch (Exception) {}
            finally { Close(); }
        }