From 3d883fdb9964c25c91dc90fb117c9dae0025fcf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tommy=20=C3=96man?= Date: Thu, 2 Jun 2022 23:46:42 +0200 Subject: [PATCH] Sparat innan resan --- .../Exceptions/InsufficientFundsException.cs | 35 +++++++++ OemanTrader.Domain/Models/Account.cs | 2 +- .../TransactionServices/BuyStockService.cs | 52 +++++++++++++ .../TransactionServices/IBuyStockService.cs | 14 ++++ .../Services/AccountDataService.cs | 73 +++++++++++++++++++ OemanTrader.WPF/App.xaml.cs | 22 +++++- .../Commands/UpdateCurrentViewModelCommand.cs | 2 +- OemanTrader.WPF/Controls/MajorIndexCard.xaml | 2 +- OemanTrader.WPF/Controls/NavigationBar.xaml | 5 +- 9 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 OemanTrader.Domain/Exceptions/InsufficientFundsException.cs create mode 100644 OemanTrader.Domain/Services/TransactionServices/BuyStockService.cs create mode 100644 OemanTrader.Domain/Services/TransactionServices/IBuyStockService.cs create mode 100644 OemanTrader.EntityFramework/Services/AccountDataService.cs diff --git a/OemanTrader.Domain/Exceptions/InsufficientFundsException.cs b/OemanTrader.Domain/Exceptions/InsufficientFundsException.cs new file mode 100644 index 0000000..a0197c0 --- /dev/null +++ b/OemanTrader.Domain/Exceptions/InsufficientFundsException.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace OemanTrader.Domain.Exceptions +{ + public class InsufficientFundsException : Exception + { + public double AccountBalance { get; set; } + public double RequiredBalance { get; set; } + + public InsufficientFundsException(double accountBalance, double requiredBalance) + { + AccountBalance = accountBalance; + RequiredBalance = requiredBalance; + } + + public InsufficientFundsException(double accountBalance, double requiredBalance, string? message) : base(message) + { + AccountBalance = accountBalance; + RequiredBalance = requiredBalance; + } + + public InsufficientFundsException(double accountBalance, double requiredBalance, string? message, Exception? innerException) : base(message, innerException) + { + AccountBalance = accountBalance; + RequiredBalance = requiredBalance; + } + + + } +} diff --git a/OemanTrader.Domain/Models/Account.cs b/OemanTrader.Domain/Models/Account.cs index 242c4cd..9c4c6a0 100644 --- a/OemanTrader.Domain/Models/Account.cs +++ b/OemanTrader.Domain/Models/Account.cs @@ -10,6 +10,6 @@ namespace OemanTrader.Domain.Models { public User AccountHolder { get; set; } public double Balance { get; set; } - public IEnumerable AssetTransactions { get; set; } + public ICollection AssetTransactions { get; set; } } } diff --git a/OemanTrader.Domain/Services/TransactionServices/BuyStockService.cs b/OemanTrader.Domain/Services/TransactionServices/BuyStockService.cs new file mode 100644 index 0000000..5388378 --- /dev/null +++ b/OemanTrader.Domain/Services/TransactionServices/BuyStockService.cs @@ -0,0 +1,52 @@ +using OemanTrader.Domain.Exceptions; +using OemanTrader.Domain.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OemanTrader.Domain.Services.TransactionServices +{ + public class BuyStockService : IBuyStockService + { + private readonly IStockPriceService _stockPriceService; + private readonly IDataService _accountService; + + public BuyStockService(IStockPriceService stockPriceService, IDataService accountService) + { + _stockPriceService = stockPriceService; + _accountService = accountService; + } + + public async Task BuyStock(Account buyer, string symbol, int shares) + { + double stockPrice = await _stockPriceService.GetPrice(symbol); + double transactionPrice = stockPrice * shares; + + if (transactionPrice > buyer.Balance) + { + throw new InsufficientFundsException(buyer.Balance,transactionPrice); + } + + AssetTransaction transaction = new AssetTransaction() + { + Account = buyer, + Asset = new Asset() { + PricePerShare = stockPrice, + Symbol = symbol + }, + DateProcessed = DateTime.Now, + ShareAmount = shares, + IsPurchase = true + }; + + buyer.AssetTransactions.Add(transaction); + buyer.Balance -= transactionPrice; + + await _accountService.Update(buyer.Id, buyer); + + return buyer; + } + } +} diff --git a/OemanTrader.Domain/Services/TransactionServices/IBuyStockService.cs b/OemanTrader.Domain/Services/TransactionServices/IBuyStockService.cs new file mode 100644 index 0000000..f6177bd --- /dev/null +++ b/OemanTrader.Domain/Services/TransactionServices/IBuyStockService.cs @@ -0,0 +1,14 @@ +using OemanTrader.Domain.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OemanTrader.Domain.Services.TransactionServices +{ + public interface IBuyStockService + { + Task BuyStock(Account buyer, string stock, int shares); + } +} diff --git a/OemanTrader.EntityFramework/Services/AccountDataService.cs b/OemanTrader.EntityFramework/Services/AccountDataService.cs new file mode 100644 index 0000000..8028ec0 --- /dev/null +++ b/OemanTrader.EntityFramework/Services/AccountDataService.cs @@ -0,0 +1,73 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.Internal; +using OemanTrader.Domain.Models; +using OemanTrader.Domain.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OemanTrader.EntityFramework.Services +{ + public class AccountDataService : IDataService + { + private readonly OemanTraderDbContextFactory _contextFactory; + + public AccountDataService(OemanTraderDbContextFactory contextFactory) + { + _contextFactory = contextFactory; + } + public async Task Create(Account entity) + { + using (var context = _contextFactory.CreateDbContext()) + { + EntityEntry createdResult = await context.Set().AddAsync(entity); + + await context.SaveChangesAsync(); + return createdResult.Entity; + } + } + public async Task Delete(int id) + { + using (var context = _contextFactory.CreateDbContext()) + { + + Account entity = await context.Set().FirstOrDefaultAsync((e) => e.Id == id); + context.Set().Remove(entity); + await context.SaveChangesAsync(); + return true; + } + } + + public async Task Get(int id) + { + using (var context = _contextFactory.CreateDbContext()) + { + Account entity = await context.Accounts.Include(a => a.AssetTransactions).FirstOrDefaultAsync((e) => e.Id == id); + return entity; + } + } + + public async Task> GetAll() + { + using (var context = _contextFactory.CreateDbContext()) + { + IEnumerable entities = await context.Accounts.Include(a => a.AssetTransactions).ToListAsync(); + return entities; + } + } + + public async Task Update(int Id, Account entity) + { + using (var context = _contextFactory.CreateDbContext()) + { + entity.Id = Id; + context.Set().Update(entity); + await context.SaveChangesAsync(); + return entity; + } + } + } +} diff --git a/OemanTrader.WPF/App.xaml.cs b/OemanTrader.WPF/App.xaml.cs index 121c8f8..cd91ed6 100644 --- a/OemanTrader.WPF/App.xaml.cs +++ b/OemanTrader.WPF/App.xaml.cs @@ -1,4 +1,8 @@ using Microsoft.Extensions.DependencyInjection; +using OemanTrader.Domain.Models; +using OemanTrader.Domain.Services; +using OemanTrader.Domain.Services.TransactionServices; +using OemanTrader.EntityFramework.Services; using OemanTrader.FinantialModelingPrepAPI.Services; using OemanTrader.WPF.ViewModels; using System; @@ -16,20 +20,32 @@ namespace OemanTrader.WPF /// public partial class App : Application { - protected override void OnStartup(StartupEventArgs e) + protected override async void OnStartup(StartupEventArgs e) { //new MajorIndexService().GetMajorIndex(Domain.Models.MajorIndexType.DowJones).ContinueWith((t) => //{ // var index = t.Result; - //}); + //}); + + IDataService accountService = new AccountDataService(new EntityFramework.OemanTraderDbContextFactory()); + IStockPriceService stockPriceService = new StockPriceService(new FinantialModelingPrepAPI.FinancialModelingPrepHttpClientFactory("2035d4934632e1d7c38f15982e39d3aa")); + IBuyStockService buyStockService = new BuyStockService(stockPriceService, accountService); + + Account buyer = await accountService.Get(1); + + await buyStockService.BuyStock(buyer, "T", 5); + + //new StockPriceService(new FinantialModelingPrepAPI.FinancialModelingPrepHttpClientFactory("2035d4934632e1d7c38f15982e39d3aa")).GetPrice("AAPL"); + Window window = new MainWindow(); window.DataContext = new MainViewModel(); window.Show(); + base.OnStartup(e); } - + private IServiceProvider CreateServiceProvider() { // 1. Singelton - one instance per application diff --git a/OemanTrader.WPF/Commands/UpdateCurrentViewModelCommand.cs b/OemanTrader.WPF/Commands/UpdateCurrentViewModelCommand.cs index e260ab6..f1316e4 100644 --- a/OemanTrader.WPF/Commands/UpdateCurrentViewModelCommand.cs +++ b/OemanTrader.WPF/Commands/UpdateCurrentViewModelCommand.cs @@ -34,7 +34,7 @@ namespace OemanTrader.WPF.Commands { case ViewType.Home: // OBS OBS - //_navigator.CurrentViewModel = new HomeViewModel(MajorIndexViewModel.LoadMajorIndexViewModel(new MajorIndexService())); + _navigator.CurrentViewModel = new HomeViewModel(MajorIndexListingViewModel.LoadMajorIndexViewModel(new MajorIndexService( new FinantialModelingPrepAPI.FinancialModelingPrepHttpClientFactory("2035d4934632e1d7c38f15982e39d3aa")))); break; case ViewType.Portfolio: _navigator.CurrentViewModel = new PortfolioViewModel(); diff --git a/OemanTrader.WPF/Controls/MajorIndexCard.xaml b/OemanTrader.WPF/Controls/MajorIndexCard.xaml index 0028427..2e56888 100644 --- a/OemanTrader.WPF/Controls/MajorIndexCard.xaml +++ b/OemanTrader.WPF/Controls/MajorIndexCard.xaml @@ -12,7 +12,7 @@ - + diff --git a/OemanTrader.WPF/Controls/NavigationBar.xaml b/OemanTrader.WPF/Controls/NavigationBar.xaml index eb2e71c..7de6444 100644 --- a/OemanTrader.WPF/Controls/NavigationBar.xaml +++ b/OemanTrader.WPF/Controls/NavigationBar.xaml @@ -7,6 +7,7 @@ xmlns:nav="clr-namespace:OemanTrader.WPF.State.Navigators" d:DataContext="{d:DesignInstance Type=nav:Navigator}" xmlns:vm="clr-namespace:OemanTrader.WPF.ViewModels" xmlns:converters="clr-namespace:OemanTrader.WPF.Converters" + mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> @@ -29,7 +30,9 @@ -