From 249b13076aa00ea6f8038ea72b2717d9c9ee9cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20Topa=C3=A7o=C4=9Flu?= <93638566+Reactive21@users.noreply.github.com> Date: Sun, 29 Oct 2023 10:31:05 +0300 Subject: [PATCH] Added Future Service --- .../Infrastructure/IBinanceFutureService.cs | 15 ++++++ .../DeleteSymbol/DeleteSymbolCommand.cs | 1 - .../DeleteSymbolCommandHandler.cs | 5 -- .../UpdateSymbol/UpdateSymbolCommand.cs | 4 +- .../UpdateSymbolCommandHandler.cs | 5 -- .../GetByIdSymbolQueryHandler.cs | 2 +- .../GetListSymbolQueryHandler.cs | 2 +- Core/HyBe.Domain/Entities/Symbols/Symbol.cs | 5 +- .../HyBe.SharedKernel.csproj | 24 +++++---- .../BinanceFutures/BinanceFutureService.cs | 32 ++++++++++++ .../InfrastructureServiceRegistration.cs | 1 + .../Services/SymbolService.cs | 51 ++++++++++++++++++- .../Controllers/v1/SymbolController.cs | 13 +---- Presentation/HyBe.WebAPI/HyBe.WebAPI.csproj | 4 ++ 14 files changed, 122 insertions(+), 42 deletions(-) create mode 100644 Core/HyBe.Application/Abstractions/Infrastructure/IBinanceFutureService.cs create mode 100644 Infrastructure/HyBe.Infrastructure/ExternalServices/BinanceFutures/BinanceFutureService.cs diff --git a/Core/HyBe.Application/Abstractions/Infrastructure/IBinanceFutureService.cs b/Core/HyBe.Application/Abstractions/Infrastructure/IBinanceFutureService.cs new file mode 100644 index 0000000..8daef9b --- /dev/null +++ b/Core/HyBe.Application/Abstractions/Infrastructure/IBinanceFutureService.cs @@ -0,0 +1,15 @@ +using Binance.Net.Objects.Models.Futures; +using HyBe.SharedKernel.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HyBe.Application.Abstractions.Infrastructure +{ + public interface IBinanceFutureService + { + Task> GetListSymbol(); + } +} diff --git a/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommand.cs b/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommand.cs index 067b60c..53498bf 100644 --- a/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommand.cs +++ b/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommand.cs @@ -13,7 +13,6 @@ namespace HyBe.Application.Features.Symbols.Commands.DeleteSymbol public class DeleteSymbolCommand : IRequest { public DeleteSymbolRequest Request { get; set; } - public string MemberId { get; set; } public DeleteSymbolCommand(DeleteSymbolRequest request) { diff --git a/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommandHandler.cs b/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommandHandler.cs index 2d3b4f4..8defe5a 100644 --- a/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommandHandler.cs +++ b/Core/HyBe.Application/Features/Symbols/Commands/DeleteSymbol/DeleteSymbolCommandHandler.cs @@ -29,11 +29,6 @@ public DeleteSymbolCommandHandler(ISymbolService symbolService, IMapper mapper) #region Methods public async Task Handle(DeleteSymbolCommand query, CancellationToken cancellationToken) { - var getSymbol = _symbolService.Get(b => b.MemberId.ToString() == query.MemberId && b.Id == query.Request.Id); - if (getSymbol.Success == false) - { - return new ErrorResult("Data Not Found!"); - } var result = _symbolService.Delete(query.Request.Id); if (result.Success) return new SuccessResult(); diff --git a/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommand.cs b/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommand.cs index 9a91b6f..c3fdb30 100644 --- a/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommand.cs +++ b/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommand.cs @@ -1,5 +1,4 @@ -using HyBe.Domain.Contracts.Backtests; -using HyBe.Domain.Contracts.Symbols; +using HyBe.Domain.Contracts.Symbols; using HyBe.SharedKernel.Utilities; using MediatR; using System; @@ -13,7 +12,6 @@ namespace HyBe.Application.Features.Symbols.Commands.UpdateSymbol public class UpdateSymbolCommand : IRequest { public UpdateSymbolRequest Request { get; set; } - public string MemberId { get; set; } public UpdateSymbolCommand(UpdateSymbolRequest request) { diff --git a/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommandHandler.cs b/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommandHandler.cs index fa1865c..a32ff04 100644 --- a/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommandHandler.cs +++ b/Core/HyBe.Application/Features/Symbols/Commands/UpdateSymbol/UpdateSymbolCommandHandler.cs @@ -31,11 +31,6 @@ public UpdateSymbolCommandHandler(ISymbolService symbolService, IMapper mapper) #region Methods public async Task Handle(UpdateSymbolCommand query, CancellationToken cancellationToken) { - var getSymbol = _symbolService.Get(b => b.MemberId.ToString() == query.MemberId && b.Id == query.Request.Id); - if (getSymbol == null) - { - return new ErrorResult("Data Not Found!"); - } var symbolMapper = _mapper.Map(query.Request); var result = _symbolService.Update(symbolMapper); if (result.Success) diff --git a/Core/HyBe.Application/Features/Symbols/Queries/GetByIdSymbol/GetByIdSymbolQueryHandler.cs b/Core/HyBe.Application/Features/Symbols/Queries/GetByIdSymbol/GetByIdSymbolQueryHandler.cs index e2fa198..80792b9 100644 --- a/Core/HyBe.Application/Features/Symbols/Queries/GetByIdSymbol/GetByIdSymbolQueryHandler.cs +++ b/Core/HyBe.Application/Features/Symbols/Queries/GetByIdSymbol/GetByIdSymbolQueryHandler.cs @@ -32,7 +32,7 @@ public GetByIdSymbolQueryHandler(ISymbolService symbolService, IMapper mapper) public async Task Handle(GetByIdSymbolQuery query, CancellationToken cancellationToken) { - var result = _symbolService.Get(b => b.MemberId.ToString() == query.Request.MemberId && b.Id == query.Request.Id); + var result = _symbolService.Get(b => b.Id == query.Request.Id); if (result.Success) { var symbolMapper = _mapper.Map(result.Data); diff --git a/Core/HyBe.Application/Features/Symbols/Queries/GetListSymbol/GetListSymbolQueryHandler.cs b/Core/HyBe.Application/Features/Symbols/Queries/GetListSymbol/GetListSymbolQueryHandler.cs index 3d091a5..5c07e6e 100644 --- a/Core/HyBe.Application/Features/Symbols/Queries/GetListSymbol/GetListSymbolQueryHandler.cs +++ b/Core/HyBe.Application/Features/Symbols/Queries/GetListSymbol/GetListSymbolQueryHandler.cs @@ -33,7 +33,7 @@ public GetListSymbolQueryHandler(ISymbolService symbolService, IMapper mapper) public async Task Handle(GetListSymbolQuery query, CancellationToken cancellationToken) { - var result = _symbolService.GetAll(b => b.MemberId.ToString() == query.Request.MemberId); + var result = _symbolService.GetAll(); if (result.Success) { var symbolMapper = _mapper.Map>(result.Data); diff --git a/Core/HyBe.Domain/Entities/Symbols/Symbol.cs b/Core/HyBe.Domain/Entities/Symbols/Symbol.cs index 2fb7d49..65c71ad 100644 --- a/Core/HyBe.Domain/Entities/Symbols/Symbol.cs +++ b/Core/HyBe.Domain/Entities/Symbols/Symbol.cs @@ -8,5 +8,8 @@ public class Symbol : BaseEntity public decimal MinQuantity { get; set; } public decimal MaxQuantity { get; set; } public bool IsActive { get; set; } - public Guid MemberId { get; set; } + public decimal StepSize { get; set; } + public decimal TickSize { get; set; } + public decimal Precision { get; set; } + public string Icon { get; set; } } \ No newline at end of file diff --git a/Core/HyBe.SharedKernel/HyBe.SharedKernel.csproj b/Core/HyBe.SharedKernel/HyBe.SharedKernel.csproj index ce5a49d..dd18cf8 100644 --- a/Core/HyBe.SharedKernel/HyBe.SharedKernel.csproj +++ b/Core/HyBe.SharedKernel/HyBe.SharedKernel.csproj @@ -32,26 +32,28 @@ - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + - - - + + + - - + + + diff --git a/Infrastructure/HyBe.Infrastructure/ExternalServices/BinanceFutures/BinanceFutureService.cs b/Infrastructure/HyBe.Infrastructure/ExternalServices/BinanceFutures/BinanceFutureService.cs new file mode 100644 index 0000000..6b977e5 --- /dev/null +++ b/Infrastructure/HyBe.Infrastructure/ExternalServices/BinanceFutures/BinanceFutureService.cs @@ -0,0 +1,32 @@ +using Binance.Net.Clients; +using Binance.Net.Interfaces.Clients; +using Binance.Net.Objects.Models.Futures; +using CryptoExchange.Net.Authentication; +using HyBe.Application.Abstractions.Infrastructure; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HyBe.Infrastructure.ExternalServices.BinanceFeatures +{ + public class BinanceFutureService : IBinanceFutureService + { + private readonly IBinanceRestClient _client; + public BinanceFutureService() + { + var binanceClient = new BinanceRestClient(options => { options.UsdFuturesOptions.ApiCredentials = new ApiCredentials("", ""); }); + _client = binanceClient; + } + public async Task> GetListSymbol() + { + var symbolList = await _client.UsdFuturesApi.ExchangeData.GetExchangeInfoAsync(); + if (symbolList.Success) + { + return symbolList.Data.Symbols.ToList(); + } + return new List(); + } + } +} diff --git a/Infrastructure/HyBe.Infrastructure/InfrastructureServiceRegistration.cs b/Infrastructure/HyBe.Infrastructure/InfrastructureServiceRegistration.cs index 62f471c..0437b7d 100644 --- a/Infrastructure/HyBe.Infrastructure/InfrastructureServiceRegistration.cs +++ b/Infrastructure/HyBe.Infrastructure/InfrastructureServiceRegistration.cs @@ -11,6 +11,7 @@ public static class InfrastructureServiceRegistration public static IServiceCollection AddInfrastructureServices(this IServiceCollection services) { services.AddScoped(); + services.AddScoped(); return services; } } diff --git a/Infrastructure/HyBe.Persistence/Services/SymbolService.cs b/Infrastructure/HyBe.Persistence/Services/SymbolService.cs index 01d3923..ff62304 100644 --- a/Infrastructure/HyBe.Persistence/Services/SymbolService.cs +++ b/Infrastructure/HyBe.Persistence/Services/SymbolService.cs @@ -1,15 +1,62 @@ -using HyBe.Application.Abstractions.Services; +using CryptoExchange.Net.Interfaces; +using HyBe.Application.Abstractions.Infrastructure; +using HyBe.Application.Abstractions.Services; using HyBe.Domain.Entities.Symbols; using HyBe.Persistence.Contexts; using HyBe.Persistence.Repositories; using HyBe.SharedKernel.Repositories; +using System.Net; namespace HyBe.Persistence.Services; public class SymbolService : EfRepository, ISymbolService { - public SymbolService(HypanceDbContext hypanceDbContext) : base(hypanceDbContext) + private readonly IBinanceFutureService _binanceFutureService; + public SymbolService(HypanceDbContext hypanceDbContext, IBinanceFutureService binanceFutureService) : base(hypanceDbContext) { + _binanceFutureService = binanceFutureService; + } + public async Task AddOrUpdateSymbolList() + { + var symbolList = await _binanceFutureService.GetListSymbol(); + foreach (var symbol in symbolList) + { + var newSymbol = new Symbol + { + Name = symbol.Pair, + MinQuantity = symbol.LotSizeFilter.MinQuantity, + MaxQuantity = symbol.LotSizeFilter.MaxQuantity, + IsActive = true, + TickSize = symbol.PriceFilter.TickSize, + StepSize = symbol.LotSizeFilter.StepSize, + Precision = symbol.PricePrecision, + Icon = GetSymbolIcon(symbol.BaseAsset) + }; + Add(newSymbol); + } + } + private string GetSymbolIcon(string coin) + { + string imageUrl = $"https://s3-symbol-logo.tradingview.com/crypto/XTVC%7Bcoin%7D--big.svg"; + string fileName = $"{coin}.svg"; + string savePath = Path.Combine(Environment.CurrentDirectory, "wwwroot/icons"); + Directory.CreateDirectory(savePath); + string filePath = Path.Combine(savePath, fileName); + if (File.Exists(filePath)) + return filePath; + + using (WebClient client = new WebClient()) + { + try + { + client.DownloadFile(imageUrl, filePath); + return filePath; + } + catch (Exception ex) + { + return ex.Message; + } + } } } diff --git a/Presentation/HyBe.WebAPI/Controllers/v1/SymbolController.cs b/Presentation/HyBe.WebAPI/Controllers/v1/SymbolController.cs index a054583..6cb4323 100644 --- a/Presentation/HyBe.WebAPI/Controllers/v1/SymbolController.cs +++ b/Presentation/HyBe.WebAPI/Controllers/v1/SymbolController.cs @@ -36,9 +36,7 @@ public async Task GetList() { try { - System.Security.Claims.ClaimsPrincipal currentUser = this.User; - var claims = currentUser.Claims.ToArray(); - var request = new GetListSymbolRequest { MemberId = claims[3].Value }; + var request = new GetListSymbolRequest {}; var query = _mapper.Map(request); var result = await _mediatr.Send(query); return Ok(result); @@ -69,10 +67,7 @@ public async Task Create([FromBody] CreateSymbolRequest request) { try { - System.Security.Claims.ClaimsPrincipal currentUser = this.User; - var claims = currentUser.Claims.ToArray(); var query = _mapper.Map(request); - query.Request.MemberId = claims[3].Value; var result = await _mediatr.Send(query); return Ok(result); } @@ -87,10 +82,7 @@ public async Task Update([FromBody] UpdateSymbolRequest request) { try { - System.Security.Claims.ClaimsPrincipal currentUser = this.User; - var claims = currentUser.Claims.ToArray(); var query = _mapper.Map(request); - query.MemberId = claims[3].Value; var result = await _mediatr.Send(query); return Ok(result); } @@ -105,10 +97,7 @@ public async Task Delete([FromBody] DeleteSymbolRequest request) { try { - System.Security.Claims.ClaimsPrincipal currentUser = this.User; - var claims = currentUser.Claims.ToArray(); var query = _mapper.Map(request); - query.MemberId = claims[3].Value; var result = await _mediatr.Send(query); return Ok(result); } diff --git a/Presentation/HyBe.WebAPI/HyBe.WebAPI.csproj b/Presentation/HyBe.WebAPI/HyBe.WebAPI.csproj index e13587b..2ebdfbe 100644 --- a/Presentation/HyBe.WebAPI/HyBe.WebAPI.csproj +++ b/Presentation/HyBe.WebAPI/HyBe.WebAPI.csproj @@ -30,5 +30,9 @@ + + + +