using Knoks.Core.Data.Interfaces; using Knoks.Core.Entities; using Knoks.Core.Entities.Args; using Knoks.Core.Logic.Interfaces; using Knoks.Framework.DataAccess; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Knoks.Framework.Extentions; namespace Knoks.Core.Data.Dao { public class KnokDao : IKnokDao { private readonly IProcExecutor _executor; private ILogger _logger; /// /// ctor /// /// /// public KnokDao(ILogger logger, IProcExecutor executor) { _executor = executor; _logger = logger; } public async Task CreateKnok(CreateKnokArgs create, decimal currentPrice) { _logger.LogDebug("CreateKnok : {0}", create); var knok = create; var a = knok?.Technical; var teh = new { HasTechnical = knok.Technical != null, Technical_Header = a?.Header, Technical_Description = a?.Description, Technical_References = a?.References };//, TechnicalImageUrl = a?.Image?.Url, Technical_ImageContent = a?.Image?.Content, Technical_ImageContentType = a?.Image?.ContentType }; a = knok?.Fundamental; var func = new { HasFundamental = knok.Fundamental != null, Fundamental_Header = a?.Header, Fundamental_Description = a?.Description, Fundamental_References = a?.References };//, Fundamental_ImageUrl = a?.Image?.Url, Fundamental_ImageContent = a?.Image?.Content, Fundamental_ImageContentType = a?.Image?.ContentType }; var row = (await _executor.Go("BO_CreateKnok", create/*, knok*/, teh, func, new { CurrentPrice = currentPrice })).Тables[0][0]; return ParseFullKnok(row); } public async Task GetKnokDetails(long knokId, int knokFeedExpirationHours) { var row = (await _executor.Go("BO_GetKnoksFull", new { KnokId = knokId, KnokFeedExpirationHours = knokFeedExpirationHours})).Тables[0][0]; return ParseFullKnok(row); } public async Task GetKnokFullDetails(long knokId, long userId, int knokFeedExpirationHours, List durationCRTAggrItems) { var fullKnok = (await _executor.Go("BO_GetKnoksFull", new { KnokId = knokId, UserId = userId, KnokFeedExpirationHours = knokFeedExpirationHours, RangeSettings = durationCRTAggrItems.ToDataTable() })); var row = fullKnok.Тables[0][0]; var chartData = fullKnok.Тables[1].Rows .Select(crt => { return crt.ToMapped(); }).ToArray(); var knok = ParseFullKnok(row); var config = durationCRTAggrItems.FirstOrDefault(x => x.MaxRange >= knok.Duration && x.MinRange <= knok.Duration); int ratesGranularityHours = 2; if (config != null) { if (config.Period.ToUpper().Contains("H")) { short.TryParse(config.Period.ToUpper().Replace("H", string.Empty), out var period); ratesGranularityHours = period; } else if (config.Period.ToUpper().Contains("D")) { short.TryParse(config.Period.ToUpper().Replace("D", string.Empty), out var period); ratesGranularityHours = period * 24; } } knok.RatesGranularityHours = (short)(ratesGranularityHours == 0 ? 1 : ratesGranularityHours); var result = await _executor.Go("API_GetUserAccounts", new { UserId = knok.CreatorUserId }); var user = result.Тables[0][0].To(); var stat = (await _executor.Go("BO_GetKnoksFull", new { KnokId = knokId, RangeSettings = durationCRTAggrItems.ToDataTable() })); var st = stat.Тables[0][0].To(); return new KnokFullData { Knok = knok, Knoker = user, Status = st, ChartData = chartData }; } private Knok ParseFullKnok(Row row) { var knok = row.To(); // knok.CurrentProfit = knok.PrevPrice.HasValue && knok.CurrentPrice.HasValue ? knok.CurrentPrice.Value - knok.PrevPrice.Value : 0m; knok.CurrentProfitPercent = knok.PrevPrice.HasValue && knok.CurrentPrice.HasValue ? Math.Round(knok.CurrentPrice.Value / (knok.PrevPrice.Value / 100) - 100, 1) : 0m; if (knok.HasTechnical) { knok.Technical = row.ToMapped(p => "Technical_" + p); knok.Technical.Image = row.ToMapped(p => "Technical_Image_" + p); } if (knok.HasFundamental) { knok.Fundamental = row.ToMapped(p => "Fundamental_" + p); } return knok; } public async Task CreateImage(long knokId, KnokImage image) { await _executor.Go("BO_SetKnokImage", new { KnokId = knokId, image.Url, image.FileName }); return image; } public Task LoadImage(long knokId, Knok knok) { var image = knok?.Technical?.Image; return Task.FromResult(image); } public async Task> GetPublicKnoks(KnokFeedArgs args, int knokFeedExpirationHours) { var result = await _executor.Go("BO_GetPublicKnoks", args, new { KnokFeedExpirationHours = knokFeedExpirationHours }); return result.Тables[0].Rows.Select(row => new KnokFeed() { Knok = row.ToMapped(), Knoker = row.ToMapped(), Status = row.ToMapped() }); } public async Task> GetAliveKnoks(KnokOngoingArgs args, List durationCRTAggrItems) { var result = await _executor.Go("BO_GetAliveKnoks", args, new { RangeSettings = durationCRTAggrItems.ToDataTable() }); return result.Тables[0].Rows.Select(row => { var knok = row.ToMapped(); //knok.CurrentPricePercent = knok.PrevPrice.HasValue && knok.CurrentPrice.HasValue ? // Math.Round((knok.CurrentPrice.Value - knok.PrevPrice.Value) / knok.PrevPrice.Value, 1) : 0m; //knok.CurrentProfitPercent = 100 * knok.CurrentProfit; //knok.PotentialProfitPercent = 100 * knok.PotentialProfitValue; return new KnokOngoing() { Knok = knok, Knokser = row.ToMapped(), Status = row.ToMapped(), ChartData = result.Тables[1].Rows .Select(crt => { return crt.ToMapped(); }).Where(x => knok.KnokId == x.KnokId).OrderBy(or => or.X).ToArray() }; }); } public async Task> GetTickersAliveKnoks(KnokFeedArgs args) { var result = await _executor.Go("BO_GetAliveKnoks", args); return result.Тables[0].Rows.Select(row => new KnokFeed() { Knok = row.ToMapped(), Knoker = row.ToMapped(), Status = row.ToMapped() }); } public async Task GetKnokPrice(long userId) { var pW = await _executor.Go("GetProbabilityOfWinning", new { UserId = userId }); var wP = await _executor.Go("GetWinPayoff", new { UserId = userId }); var lP = await _executor.Go("GetLossPayoff", new { UserId = userId }); var result = pW.ReturnValue.Value * wP.ReturnValue.Value + (1 - pW.ReturnValue.Value) * lP.ReturnValue.Value; //return result; return 0; } public async Task GetOwnData(long userId) { var result = await _executor.Go("BO_GetPublicKnoks_OwnData", new { UserId = userId }); var data = result.Тables[0][0]; return new KnokOwnData() { Knoker = data.ToMapped(), Status = data.ToMapped() }; } public async Task PublishKnok(long knokId, long userId, long accountId, decimal publishPrice, decimal knokRating) { var row = (await _executor.Go("BO_PublishKnok", new { knokId, userId, accountId, publishPrice, knokRating })).Тables[2][0]; return ParseFullKnok(row); } public Task PurchaseKnok(long knokId, long userId, long accountId) { return _executor.Go("BO_AddUserKnok", new { KnokId = knokId, UserId =userId, AccountId = accountId }); } public async Task GetKnokserProfile(long knokserId) { var result = (await _executor.Go("BO_GetKnokserProfile", new { KnokserId = knokserId })); return result.Тables[0][0].ToMapped(); } public async Task> GetKnoks(bool? activeOnly = null, long? greaterThanSignalId = null) { var result = (await _executor.Go("KST_GetKnoks", new { ActiveOnly = activeOnly, GreaterThanSignalId = greaterThanSignalId })); return result.Тables[0].Rows.Select(row => row.ToMapped()).ToList(); } public async Task UpdateKnok(IDictionary changes, decimal knokerWinRate, decimal userRefundRate) { changes.Add("KnokerWinRate", knokerWinRate); changes.Add("UserRefundRate", userRefundRate); var result = await _executor.Go("KST_UpdateKnok", changes); return result.Тables[0][0].To(); } public async Task> GetEndedKnoks(KnokEndedArgs args, List durationCRTAggrItems) { var result = await _executor.Go("BO_GetEndedKnoks", args, new { RangeSettings = durationCRTAggrItems.ToDataTable() }); return result.Тables[0].Rows.Select(row => { var knok = row.ToMapped(); return new KnokEnded() { Knok = knok, Knokser = row.ToMapped(), Status = row.ToMapped(), ChartData = result.Тables[1].Rows .Select(crt => { return crt.ToMapped(); }).Where(x => knok.KnokId == x.KnokId).OrderBy(or => or.X).ToArray() }; }); } public async Task> GetCurrentlyPublishedKnoks(KnokCurrentlyPublishedArgs args, long userId, int knokFeedExpirationHours, List durationCRTAggrItems) { var result = await _executor.Go("BO_GetCurrentlyPublishedKnoks", args, new { KnokFeedExpirationHours = knokFeedExpirationHours, RangeSettings = durationCRTAggrItems.ToDataTable() }); return result.Тables[0].Rows.Select(row => { var knok = row.ToMapped(); return new KnokOngoing() { Knok = knok, Knokser = row.ToMapped(), Status = row.ToMapped(), ChartData = result.Тables[1].Rows .Select(crt => { return crt.ToMapped(); }).Where(x => knok.KnokId == x.KnokId).OrderBy(or => or.X).ToArray() }; }); } public async Task> GetPastPublishedKnoks(KnokPastPublishedArgs args, long userId, List durationCRTAggrItems) { var result = await _executor.Go("BO_GetPastPublishedKnoks", args, new { RangeSettings = durationCRTAggrItems.ToDataTable() }); return result.Тables[0].Rows.Select(row => { var knok = row.ToMapped(); return new KnokEnded() { Knok = knok, Knokser = row.ToMapped(), Status = row.ToMapped(), ChartData = result.Тables[1].Rows .Select(crt => { return crt.ToMapped(); }).Where(x => knok.KnokId == x.KnokId).OrderBy(or => or.X).ToArray() }; }); } } }