diff --git a/src/Managing.Api/Controllers/DataController.cs b/src/Managing.Api/Controllers/DataController.cs index c67e949..e10cb95 100644 --- a/src/Managing.Api/Controllers/DataController.cs +++ b/src/Managing.Api/Controllers/DataController.cs @@ -32,6 +32,7 @@ public class DataController : ControllerBase private readonly IAccountService _accountService; private readonly ICacheService _cacheService; private readonly IStatisticService _statisticService; + private readonly IAgentService _agentService; private readonly IHubContext _hubContext; private readonly IMediator _mediator; private readonly ITradingService _tradingService; @@ -51,6 +52,7 @@ public class DataController : ControllerBase IAccountService accountService, ICacheService cacheService, IStatisticService statisticService, + IAgentService agentService, IHubContext hubContext, IMediator mediator, ITradingService tradingService) @@ -59,6 +61,7 @@ public class DataController : ControllerBase _accountService = accountService; _cacheService = cacheService; _statisticService = statisticService; + _agentService = agentService; _hubContext = hubContext; _mediator = mediator; _tradingService = tradingService; @@ -664,7 +667,7 @@ public class DataController : ControllerBase DateTime startDate, DateTime? endDate = null) { - var balances = await _statisticService.GetAgentBalances(agentName, startDate, endDate); + var balances = await _agentService.GetAgentBalances(agentName, startDate, endDate); return Ok(balances); } @@ -683,7 +686,7 @@ public class DataController : ControllerBase int page = 1, int pageSize = 10) { - var (agents, totalCount) = await _statisticService.GetBestAgents(startDate, endDate, page, pageSize); + var (agents, totalCount) = await _agentService.GetBestAgents(startDate, endDate, page, pageSize); var response = new BestAgentsResponse { diff --git a/src/Managing.Application.Abstractions/Services/IAgentService.cs b/src/Managing.Application.Abstractions/Services/IAgentService.cs index 5537662..552e481 100644 --- a/src/Managing.Application.Abstractions/Services/IAgentService.cs +++ b/src/Managing.Application.Abstractions/Services/IAgentService.cs @@ -1,5 +1,16 @@ +using Managing.Domain.Statistics; + namespace Managing.Application.Abstractions.Services; public interface IAgentService { + Task GetAgentBalances(string agentName, DateTime start, DateTime? end = null); + + Task<(IList Agents, int TotalCount)> GetBestAgents(DateTime start, DateTime? end = null, + int page = 1, + int pageSize = 10); + + Task SaveOrUpdateAgentSummary(AgentSummary agentSummary); + + Task> GetAllAgentSummaries(); } \ No newline at end of file diff --git a/src/Managing.Application.Abstractions/Services/IStatisticService.cs b/src/Managing.Application.Abstractions/Services/IStatisticService.cs index 3884ead..f78714f 100644 --- a/src/Managing.Application.Abstractions/Services/IStatisticService.cs +++ b/src/Managing.Application.Abstractions/Services/IStatisticService.cs @@ -6,12 +6,6 @@ namespace Managing.Application.Abstractions.Services; public interface IStatisticService { - Task GetAgentBalances(string agentName, DateTime start, DateTime? end = null); - - Task<(IList Agents, int TotalCount)> GetBestAgents(DateTime start, DateTime? end = null, - int page = 1, - int pageSize = 10); - List GetBadTraders(); Task> GetBadTradersAsync(); List GetBestTraders(); @@ -28,6 +22,4 @@ public interface IStatisticService Task UpdateTopVolumeTicker(Enums.TradingExchanges exchange, int top); Task UpdateFundingRates(); Task> GetFundingRates(); - Task SaveOrUpdateAgentSummary(AgentSummary agentSummary); - Task> GetAllAgentSummaries(); } \ No newline at end of file diff --git a/src/Managing.Application/Agents/AgentService.cs b/src/Managing.Application/Agents/AgentService.cs index 9833471..73fdf01 100644 --- a/src/Managing.Application/Agents/AgentService.cs +++ b/src/Managing.Application/Agents/AgentService.cs @@ -1,7 +1,117 @@ +using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; +using Managing.Domain.Statistics; +using Microsoft.Extensions.Logging; namespace Managing.Application.Agents; public class AgentService : IAgentService { + private readonly IAgentBalanceRepository _agentBalanceRepository; + private readonly IAgentSummaryRepository _agentSummaryRepository; + private readonly ICacheService _cacheService; + private readonly ILogger _logger; + + public AgentService( + IAgentBalanceRepository agentBalanceRepository, + IAgentSummaryRepository agentSummaryRepository, + ICacheService cacheService, + ILogger logger) + { + _agentBalanceRepository = agentBalanceRepository; + _agentSummaryRepository = agentSummaryRepository; + _cacheService = cacheService; + _logger = logger; + } + + public async Task GetAgentBalances(string agentName, DateTime start, + DateTime? end = null) + { + var effectiveEnd = end ?? DateTime.UtcNow; + string cacheKey = $"AgentBalances_{agentName}_{start:yyyyMMdd}_{effectiveEnd:yyyyMMdd}"; + + // Check if the balances are already cached + var cachedBalances = _cacheService.GetValue(cacheKey); + + if (cachedBalances != null) + { + return cachedBalances; + } + + var balances = await _agentBalanceRepository.GetAgentBalances(agentName, start, end); + + // Create a single AgentBalanceHistory with all balances + var result = new AgentBalanceHistory + { + AgentName = agentName, + AgentBalances = balances.OrderBy(b => b.Time).ToList() + }; + + // Cache the results for 5 minutes + _cacheService.SaveValue(cacheKey, result, TimeSpan.FromMinutes(5)); + + return result; + } + + public async Task<(IList Agents, int TotalCount)> GetBestAgents( + DateTime start, + DateTime? end = null, + int page = 1, + int pageSize = 10) + { + var effectiveEnd = end ?? DateTime.UtcNow; + string cacheKey = $"BestAgents_{start:yyyyMMdd}_{effectiveEnd:yyyyMMdd}"; + + // Check if the results are already cached + var cachedResult = _cacheService.GetValue<(IList, int)>(cacheKey); + + if (cachedResult != default) + { + // Apply pagination to cached results + var (cachedAgents, cachedTotalCount) = cachedResult; + var paginatedAgents = cachedAgents + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToList(); + return (paginatedAgents, cachedTotalCount); + } + + // Get all agents with their balance history + var (fetchedAgents, fetchedTotalCount) = + await _agentBalanceRepository.GetAllAgentBalancesWithHistory(start, end); + + // Cache all results for 5 minutes + _cacheService.SaveValue(cacheKey, (fetchedAgents, fetchedTotalCount), TimeSpan.FromMinutes(5)); + + // Apply pagination + var result = fetchedAgents + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToList(); + + return (result, fetchedTotalCount); + } + + public async Task SaveOrUpdateAgentSummary(AgentSummary agentSummary) + { + try + { + // Use the injected AgentSummaryRepository to save or update + await _agentSummaryRepository.SaveOrUpdateAsync(agentSummary); + + _logger.LogInformation("AgentSummary saved/updated for user {UserId} with agent name {AgentName}", + agentSummary.UserId, agentSummary.AgentName); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error saving/updating AgentSummary for user {UserId} with agent name {AgentName}", + agentSummary.UserId, agentSummary.AgentName); + throw; + } + } + + public async Task> GetAllAgentSummaries() + { + return await _agentSummaryRepository.GetAllAsync(); + } } \ No newline at end of file diff --git a/src/Managing.Application/Bots/Grains/AgentGrain.cs b/src/Managing.Application/Bots/Grains/AgentGrain.cs index 2583075..665605a 100644 --- a/src/Managing.Application/Bots/Grains/AgentGrain.cs +++ b/src/Managing.Application/Bots/Grains/AgentGrain.cs @@ -13,7 +13,7 @@ public class AgentGrain : Grain, IAgentGrain, IRemindable private readonly IPersistentState _state; private readonly ILogger _logger; private readonly IBotService _botService; - private readonly IStatisticService _statisticService; + private readonly IAgentService _agentService; private const string _updateSummaryReminderName = "UpdateAgentSummary"; public AgentGrain( @@ -21,12 +21,12 @@ public class AgentGrain : Grain, IAgentGrain, IRemindable IPersistentState state, ILogger logger, IBotService botService, - IStatisticService statisticService) + IAgentService agentService) { _state = state; _logger = logger; _botService = botService; - _statisticService = statisticService; + _agentService = agentService; } public override Task OnActivateAsync(CancellationToken cancellationToken) @@ -135,7 +135,7 @@ public class AgentGrain : Grain, IAgentGrain, IRemindable }; // Save summary to database - await _statisticService.SaveOrUpdateAgentSummary(summary); + await _agentService.SaveOrUpdateAgentSummary(summary); } catch (Exception ex) { diff --git a/src/Managing.Application/ManageBot/GetAllAgentSummariesCommandHandler.cs b/src/Managing.Application/ManageBot/GetAllAgentSummariesCommandHandler.cs index b0a6655..2d13988 100644 --- a/src/Managing.Application/ManageBot/GetAllAgentSummariesCommandHandler.cs +++ b/src/Managing.Application/ManageBot/GetAllAgentSummariesCommandHandler.cs @@ -11,18 +11,18 @@ namespace Managing.Application.ManageBot public class GetAllAgentSummariesCommandHandler : IRequestHandler> { - private readonly IStatisticService _statisticService; + private readonly IAgentService _agentService; - public GetAllAgentSummariesCommandHandler(IStatisticService statisticService) + public GetAllAgentSummariesCommandHandler(IAgentService agentService) { - _statisticService = statisticService; + _agentService = agentService; } public async Task> Handle(GetAllAgentSummariesCommand request, CancellationToken cancellationToken) { // Get all agent summaries from the database - var allAgentSummaries = await _statisticService.GetAllAgentSummaries(); + var allAgentSummaries = await _agentService.GetAllAgentSummaries(); if (request.TimeFilter != "Total") { diff --git a/src/Managing.Application/Trading/StatisticService.cs b/src/Managing.Application/Trading/StatisticService.cs index 464319d..c3962b1 100644 --- a/src/Managing.Application/Trading/StatisticService.cs +++ b/src/Managing.Application/Trading/StatisticService.cs @@ -24,8 +24,7 @@ public class StatisticService : IStatisticService private readonly ITradaoService _tradaoService; private readonly IMessengerService _messengerService; private readonly ICacheService _cacheService; - private readonly IAgentBalanceRepository _agentBalanceRepository; - private readonly IAgentSummaryRepository _agentSummaryRepository; + private readonly ILogger _logger; public StatisticService( @@ -38,9 +37,7 @@ public class StatisticService : IStatisticService IBacktester backtester, ITradaoService tradaoService, IMessengerService messengerService, - ICacheService cacheService, - IAgentBalanceRepository agentBalanceRepository, - IAgentSummaryRepository agentSummaryRepository) + ICacheService cacheService) { _exchangeService = exchangeService; _accountService = accountService; @@ -52,8 +49,6 @@ public class StatisticService : IStatisticService _tradaoService = tradaoService; _messengerService = messengerService; _cacheService = cacheService; - _agentBalanceRepository = agentBalanceRepository; - _agentSummaryRepository = agentSummaryRepository; } public async Task UpdateTopVolumeTicker(TradingExchanges exchange, int top) @@ -433,95 +428,4 @@ public class StatisticService : IStatisticService await _messengerService.SendBadTraders(lastBadTrader); } - - public async Task GetAgentBalances(string agentName, DateTime start, - DateTime? end = null) - { - var effectiveEnd = end ?? DateTime.UtcNow; - string cacheKey = $"AgentBalances_{agentName}_{start:yyyyMMdd}_{effectiveEnd:yyyyMMdd}"; - - // Check if the balances are already cached - var cachedBalances = _cacheService.GetValue(cacheKey); - - if (cachedBalances != null) - { - return cachedBalances; - } - - var balances = await _agentBalanceRepository.GetAgentBalances(agentName, start, end); - - // Create a single AgentBalanceHistory with all balances - var result = new AgentBalanceHistory - { - AgentName = agentName, - AgentBalances = balances.OrderBy(b => b.Time).ToList() - }; - - // Cache the results for 5 minutes - _cacheService.SaveValue(cacheKey, result, TimeSpan.FromMinutes(5)); - - return result; - } - - public async Task<(IList Agents, int TotalCount)> GetBestAgents( - DateTime start, - DateTime? end = null, - int page = 1, - int pageSize = 10) - { - var effectiveEnd = end ?? DateTime.UtcNow; - string cacheKey = $"BestAgents_{start:yyyyMMdd}_{effectiveEnd:yyyyMMdd}"; - - // Check if the results are already cached - var cachedResult = _cacheService.GetValue<(IList, int)>(cacheKey); - - if (cachedResult != default) - { - // Apply pagination to cached results - var (cachedAgents, cachedTotalCount) = cachedResult; - var paginatedAgents = cachedAgents - .Skip((page - 1) * pageSize) - .Take(pageSize) - .ToList(); - return (paginatedAgents, cachedTotalCount); - } - - // Get all agents with their balance history - var (fetchedAgents, fetchedTotalCount) = - await _agentBalanceRepository.GetAllAgentBalancesWithHistory(start, end); - - // Cache all results for 5 minutes - _cacheService.SaveValue(cacheKey, (fetchedAgents, fetchedTotalCount), TimeSpan.FromMinutes(5)); - - // Apply pagination - var result = fetchedAgents - .Skip((page - 1) * pageSize) - .Take(pageSize) - .ToList(); - - return (result, fetchedTotalCount); - } - - public async Task SaveOrUpdateAgentSummary(AgentSummary agentSummary) - { - try - { - // Use the injected AgentSummaryRepository to save or update - await _agentSummaryRepository.SaveOrUpdateAsync(agentSummary); - - _logger.LogInformation("AgentSummary saved/updated for user {UserId} with agent name {AgentName}", - agentSummary.UserId, agentSummary.AgentName); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error saving/updating AgentSummary for user {UserId} with agent name {AgentName}", - agentSummary.UserId, agentSummary.AgentName); - throw; - } - } - - public async Task> GetAllAgentSummaries() - { - return await _agentSummaryRepository.GetAllAsync(); - } } \ No newline at end of file diff --git a/src/Managing.Application/Users/UserService.cs b/src/Managing.Application/Users/UserService.cs index c9a6ca8..1e4f931 100644 --- a/src/Managing.Application/Users/UserService.cs +++ b/src/Managing.Application/Users/UserService.cs @@ -4,7 +4,6 @@ using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; using Managing.Common; using Managing.Domain.Accounts; -using Managing.Domain.Statistics; using Managing.Domain.Users; using Microsoft.Extensions.Logging; @@ -18,7 +17,6 @@ public class UserService : IUserService private readonly ILogger _logger; private readonly ICacheService _cacheService; private readonly IGrainFactory _grainFactory; - private readonly IAgentSummaryRepository _agentSummaryRepository; private string[] authorizedAddresses = [ @@ -40,8 +38,7 @@ public class UserService : IUserService IAccountService accountService, ILogger logger, ICacheService cacheService, - IGrainFactory grainFactory, - IAgentSummaryRepository agentSummaryRepository) + IGrainFactory grainFactory) { _evmManager = evmManager; _userRepository = userRepository; @@ -49,7 +46,6 @@ public class UserService : IUserService _logger = logger; _cacheService = cacheService; _grainFactory = grainFactory; - _agentSummaryRepository = agentSummaryRepository; } public async Task Authenticate(string name, string address, string message, string signature) @@ -252,19 +248,5 @@ public class UserService : IUserService return await _userRepository.GetAllUsersAsync(); } - public async Task SaveOrUpdateAgentSummary(AgentSummary agentSummary) - { - try - { - await _agentSummaryRepository.SaveOrUpdateAsync(agentSummary); - _logger.LogInformation("AgentSummary saved/updated for user {UserId} with agent name {AgentName}", - agentSummary.UserId, agentSummary.AgentName); - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to save/update AgentSummary for user {UserId} with agent name {AgentName}", - agentSummary.UserId, agentSummary.AgentName); - throw; - } - } + } \ No newline at end of file diff --git a/src/Managing.Infrastructure.Database/Managing.Infrastructure.Databases.csproj b/src/Managing.Infrastructure.Database/Managing.Infrastructure.Databases.csproj index 218c02f..d293cc9 100644 --- a/src/Managing.Infrastructure.Database/Managing.Infrastructure.Databases.csproj +++ b/src/Managing.Infrastructure.Database/Managing.Infrastructure.Databases.csproj @@ -19,4 +19,9 @@ + + + + +