Esempio n. 1
0
        public async Task <Transaction> Create(Transaction transaction)
        {
            if (!await TransactionValidator.Create(transaction))
            {
                return(transaction);
            }

            using (UnitOfWork.Begin())
            {
                try
                {
                    CategoryFilter categoryFilter = new CategoryFilter
                    {
                        Name = new StringFilter {
                            Equal = transaction.CategoryName
                        }
                    };
                    Category category = await UnitOfWork.CategoryRepository.Get(categoryFilter);

                    WalletFilter walletFilter = new WalletFilter
                    {
                        Name = new StringFilter {
                            Equal = transaction.WalletName
                        },
                        UserId = new GuidFilter {
                            Equal = transaction.UserId
                        }
                    };
                    Wallet wallet = await UnitOfWork.WalletRepository.Get(walletFilter);


                    transaction.Id         = Guid.NewGuid();
                    transaction.WalletId   = wallet.Id;
                    transaction.CategoryId = category.Id;
                    if (category.Type == CategoryType.Inflow)
                    {
                        wallet.Balance += transaction.Amount;
                    }
                    else
                    {
                        wallet.Balance -= transaction.Amount;
                    }

                    await UnitOfWork.WalletRepository.Update(wallet);

                    await UnitOfWork.TransactionRepository.Create(transaction);

                    await UnitOfWork.Commit();
                }
                catch (Exception ex)
                {
                    await UnitOfWork.Rollback();

                    transaction.AddError(nameof(TransactionService), nameof(Transaction.Id), CommonEnum.ErrorCode.SystemError);
                }
            }
            return(transaction);
        }