Ejemplo n.º 1
0
        public async Task UpdateAccountsAmount(AccountUpdateModel accountUpdateModel)
        {
            var transactionMessageModel = new TransactionMessageModel
            {
                TransactionId     = accountUpdateModel.TransactionId,
                SenderAccountId   = accountUpdateModel.SenderAccountId,
                ReceiverAccountId = accountUpdateModel.ReceiverAccountId,
                Amount            = accountUpdateModel.Amount
            };

            if (await IsTransactionPermitted(accountUpdateModel))
            {
                try
                {
                    var senderAccount = await _mediator.Send(
                        new GetAccountByIdQuery(accountUpdateModel.SenderAccountId)
                        );

                    var receiverAccount = await _mediator.Send(
                        new GetAccountByIdQuery(accountUpdateModel.ReceiverAccountId)
                        );

                    if (senderAccount != null && receiverAccount != null)
                    {
                        if (senderAccount.Amount >= accountUpdateModel.Amount)
                        {
                            senderAccount.Amount   -= accountUpdateModel.Amount;
                            receiverAccount.Amount += accountUpdateModel.Amount;

                            await _mediator.Send(new UpdateAccountCommand(senderAccount.Id, senderAccount));

                            await _mediator.Send(new UpdateAccountCommand(receiverAccount.Id, receiverAccount));

                            transactionMessageModel.Status = "Finished";
                            transactionMessageModel.Info   = "The transaction was successful";
                            _transactionUpdateSender.UpdateTransaction(transactionMessageModel);
                        }
                        else
                        {
                            transactionMessageModel.Status = "Failed";
                            transactionMessageModel.Info   = "The account balance is too low";
                            _transactionUpdateSender.UpdateTransaction(transactionMessageModel);
                        }
                    }
                }
                catch (Exception ex)
                {
                    transactionMessageModel.Status = "Failed";
                    transactionMessageModel.Info   = "Account number not found. The operation has failed";
                    _transactionUpdateSender.UpdateTransaction(transactionMessageModel);
                }
            }
            else
            {
                transactionMessageModel.Status = "Failed";
                transactionMessageModel.Info   = "Operation prohibited";
                _transactionUpdateSender.UpdateTransaction(transactionMessageModel);
            }
        }
Ejemplo n.º 2
0
        public void SendTransaction(TransactionMessageModel transaction)
        {
            var factory = new ConnectionFactory()
            {
                HostName = _hostname, UserName = _username, Password = _password
            };

            using var connection = factory.CreateConnection();
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: _queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);

                var json = JsonConvert.SerializeObject(transaction);
                var body = Encoding.UTF8.GetBytes(json);

                channel.BasicPublish(exchange: "", routingKey: _queueName, basicProperties: null, body: body);
            }
        }