using KLHZ.Trader.Core.Contracts.Messaging.Dtos; using KLHZ.Trader.Core.Contracts.Messaging.Interfaces; using KLHZ.Trader.Core.DataLayer; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace KLHZ.Trader.Service.Controllers { [ApiController] [Route("[controller]/[action]")] public class PlayController : ControllerBase { private readonly IDataBus _dataBus; private readonly IDbContextFactory _dbContextFactory; public PlayController(IDataBus dataBus, IDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; _dataBus = dataBus; } [HttpGet] public async Task Run(string figi) { try { var time1 = DateTime.UtcNow.AddDays(-7); var time2 = DateTime.UtcNow.AddMinutes(-30); using var context1 = await _dbContextFactory.CreateDbContextAsync(); context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; var data = await context1.PriceChanges .Where(c => c.Figi == figi && c.Time >= time1 && c.Time <= time2) .OrderBy(c => c.Time) .Select(c => new NewPriceMessage() { Figi = figi, Ticker = c.Ticker, Time = c.Time, Value = c.Value, IsHistoricalData = true }) .ToArrayAsync(); foreach (var mess in data) { await _dataBus.Broadcast(mess); } } catch (Exception ex) { } } [HttpGet] public async Task LoadTradesToHistory() { try { using var context1 = await _dbContextFactory.CreateDbContextAsync(); context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; var data = await context1.OrderbookItemsReserve //.Where(c => c.Figi == figi) //.OrderBy(c => c.BoughtAt) .ToArrayAsync(); data = data.DistinctBy(d => new { d.Figi, d.Time, d.ItemType}).ToArray(); //await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); var data2 = data.Select(d => new Core.DataLayer.Entities.Orders.OrderbookItem() { Figi = d.Figi, Time = d.Time, ItemType = d.ItemType, Ticker = d.Ticker, Count = d.Count, Price = d.Price, }).ToArray(); int count = 0; foreach(var mess in data2) { count++; await context1.OrderbookItems.AddAsync(mess); if (count > 10000) { await context1.SaveChangesAsync(); count = 0; } } await context1.SaveChangesAsync(); } catch (Exception ex) { } } ////[HttpGet] //public async Task LoadTradesToHistory(string figi) //{ // try // { // using var context1 = await _dbContextFactory.CreateDbContextAsync(); // context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; // var data = await context1.InstrumentTrades // .Where(c => c.Figi == figi) // .OrderBy(c => c.BoughtAt) // .Select(c => new PriceChange() // { // Figi = figi, // Ticker = c.Ticker, // Time = c.BoughtAt, // Value = c.Price, // IsHistoricalData = true // }) // .ToArrayAsync(); // await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync(); // await context1.PriceChanges.AddRangeAsync(data); // await context1.SaveChangesAsync(); // } // catch (Exception ex) // { // } //} } }