Clear a bit more

This commit is contained in:
2025-08-05 19:34:42 +07:00
parent 0c8c3de807
commit 2dcbcc3ef2
9 changed files with 143 additions and 136 deletions

View File

@@ -32,6 +32,7 @@ public class DataController : ControllerBase
private readonly IAccountService _accountService; private readonly IAccountService _accountService;
private readonly ICacheService _cacheService; private readonly ICacheService _cacheService;
private readonly IStatisticService _statisticService; private readonly IStatisticService _statisticService;
private readonly IAgentService _agentService;
private readonly IHubContext<CandleHub> _hubContext; private readonly IHubContext<CandleHub> _hubContext;
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly ITradingService _tradingService; private readonly ITradingService _tradingService;
@@ -51,6 +52,7 @@ public class DataController : ControllerBase
IAccountService accountService, IAccountService accountService,
ICacheService cacheService, ICacheService cacheService,
IStatisticService statisticService, IStatisticService statisticService,
IAgentService agentService,
IHubContext<CandleHub> hubContext, IHubContext<CandleHub> hubContext,
IMediator mediator, IMediator mediator,
ITradingService tradingService) ITradingService tradingService)
@@ -59,6 +61,7 @@ public class DataController : ControllerBase
_accountService = accountService; _accountService = accountService;
_cacheService = cacheService; _cacheService = cacheService;
_statisticService = statisticService; _statisticService = statisticService;
_agentService = agentService;
_hubContext = hubContext; _hubContext = hubContext;
_mediator = mediator; _mediator = mediator;
_tradingService = tradingService; _tradingService = tradingService;
@@ -664,7 +667,7 @@ public class DataController : ControllerBase
DateTime startDate, DateTime startDate,
DateTime? endDate = null) DateTime? endDate = null)
{ {
var balances = await _statisticService.GetAgentBalances(agentName, startDate, endDate); var balances = await _agentService.GetAgentBalances(agentName, startDate, endDate);
return Ok(balances); return Ok(balances);
} }
@@ -683,7 +686,7 @@ public class DataController : ControllerBase
int page = 1, int page = 1,
int pageSize = 10) 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 var response = new BestAgentsResponse
{ {

View File

@@ -1,5 +1,16 @@
using Managing.Domain.Statistics;
namespace Managing.Application.Abstractions.Services; namespace Managing.Application.Abstractions.Services;
public interface IAgentService public interface IAgentService
{ {
Task<AgentBalanceHistory> GetAgentBalances(string agentName, DateTime start, DateTime? end = null);
Task<(IList<AgentBalanceHistory> Agents, int TotalCount)> GetBestAgents(DateTime start, DateTime? end = null,
int page = 1,
int pageSize = 10);
Task SaveOrUpdateAgentSummary(AgentSummary agentSummary);
Task<IEnumerable<AgentSummary>> GetAllAgentSummaries();
} }

View File

@@ -6,12 +6,6 @@ namespace Managing.Application.Abstractions.Services;
public interface IStatisticService public interface IStatisticService
{ {
Task<AgentBalanceHistory> GetAgentBalances(string agentName, DateTime start, DateTime? end = null);
Task<(IList<AgentBalanceHistory> Agents, int TotalCount)> GetBestAgents(DateTime start, DateTime? end = null,
int page = 1,
int pageSize = 10);
List<Trader> GetBadTraders(); List<Trader> GetBadTraders();
Task<List<Trader>> GetBadTradersAsync(); Task<List<Trader>> GetBadTradersAsync();
List<Trader> GetBestTraders(); List<Trader> GetBestTraders();
@@ -28,6 +22,4 @@ public interface IStatisticService
Task UpdateTopVolumeTicker(Enums.TradingExchanges exchange, int top); Task UpdateTopVolumeTicker(Enums.TradingExchanges exchange, int top);
Task UpdateFundingRates(); Task UpdateFundingRates();
Task<List<FundingRate>> GetFundingRates(); Task<List<FundingRate>> GetFundingRates();
Task SaveOrUpdateAgentSummary(AgentSummary agentSummary);
Task<IEnumerable<AgentSummary>> GetAllAgentSummaries();
} }

View File

@@ -1,7 +1,117 @@
using Managing.Application.Abstractions.Repositories;
using Managing.Application.Abstractions.Services; using Managing.Application.Abstractions.Services;
using Managing.Domain.Statistics;
using Microsoft.Extensions.Logging;
namespace Managing.Application.Agents; namespace Managing.Application.Agents;
public class AgentService : IAgentService public class AgentService : IAgentService
{ {
private readonly IAgentBalanceRepository _agentBalanceRepository;
private readonly IAgentSummaryRepository _agentSummaryRepository;
private readonly ICacheService _cacheService;
private readonly ILogger<AgentService> _logger;
public AgentService(
IAgentBalanceRepository agentBalanceRepository,
IAgentSummaryRepository agentSummaryRepository,
ICacheService cacheService,
ILogger<AgentService> logger)
{
_agentBalanceRepository = agentBalanceRepository;
_agentSummaryRepository = agentSummaryRepository;
_cacheService = cacheService;
_logger = logger;
}
public async Task<AgentBalanceHistory> 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<AgentBalanceHistory>(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<AgentBalanceHistory> 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<AgentBalanceHistory>, 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<IEnumerable<AgentSummary>> GetAllAgentSummaries()
{
return await _agentSummaryRepository.GetAllAsync();
}
} }

View File

@@ -13,7 +13,7 @@ public class AgentGrain : Grain, IAgentGrain, IRemindable
private readonly IPersistentState<AgentGrainState> _state; private readonly IPersistentState<AgentGrainState> _state;
private readonly ILogger<AgentGrain> _logger; private readonly ILogger<AgentGrain> _logger;
private readonly IBotService _botService; private readonly IBotService _botService;
private readonly IStatisticService _statisticService; private readonly IAgentService _agentService;
private const string _updateSummaryReminderName = "UpdateAgentSummary"; private const string _updateSummaryReminderName = "UpdateAgentSummary";
public AgentGrain( public AgentGrain(
@@ -21,12 +21,12 @@ public class AgentGrain : Grain, IAgentGrain, IRemindable
IPersistentState<AgentGrainState> state, IPersistentState<AgentGrainState> state,
ILogger<AgentGrain> logger, ILogger<AgentGrain> logger,
IBotService botService, IBotService botService,
IStatisticService statisticService) IAgentService agentService)
{ {
_state = state; _state = state;
_logger = logger; _logger = logger;
_botService = botService; _botService = botService;
_statisticService = statisticService; _agentService = agentService;
} }
public override Task OnActivateAsync(CancellationToken cancellationToken) public override Task OnActivateAsync(CancellationToken cancellationToken)
@@ -135,7 +135,7 @@ public class AgentGrain : Grain, IAgentGrain, IRemindable
}; };
// Save summary to database // Save summary to database
await _statisticService.SaveOrUpdateAgentSummary(summary); await _agentService.SaveOrUpdateAgentSummary(summary);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -11,18 +11,18 @@ namespace Managing.Application.ManageBot
public class GetAllAgentSummariesCommandHandler : IRequestHandler<GetAllAgentSummariesCommand, public class GetAllAgentSummariesCommandHandler : IRequestHandler<GetAllAgentSummariesCommand,
IEnumerable<AgentSummary>> IEnumerable<AgentSummary>>
{ {
private readonly IStatisticService _statisticService; private readonly IAgentService _agentService;
public GetAllAgentSummariesCommandHandler(IStatisticService statisticService) public GetAllAgentSummariesCommandHandler(IAgentService agentService)
{ {
_statisticService = statisticService; _agentService = agentService;
} }
public async Task<IEnumerable<AgentSummary>> Handle(GetAllAgentSummariesCommand request, public async Task<IEnumerable<AgentSummary>> Handle(GetAllAgentSummariesCommand request,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
// Get all agent summaries from the database // Get all agent summaries from the database
var allAgentSummaries = await _statisticService.GetAllAgentSummaries(); var allAgentSummaries = await _agentService.GetAllAgentSummaries();
if (request.TimeFilter != "Total") if (request.TimeFilter != "Total")
{ {

View File

@@ -24,8 +24,7 @@ public class StatisticService : IStatisticService
private readonly ITradaoService _tradaoService; private readonly ITradaoService _tradaoService;
private readonly IMessengerService _messengerService; private readonly IMessengerService _messengerService;
private readonly ICacheService _cacheService; private readonly ICacheService _cacheService;
private readonly IAgentBalanceRepository _agentBalanceRepository;
private readonly IAgentSummaryRepository _agentSummaryRepository;
private readonly ILogger<StatisticService> _logger; private readonly ILogger<StatisticService> _logger;
public StatisticService( public StatisticService(
@@ -38,9 +37,7 @@ public class StatisticService : IStatisticService
IBacktester backtester, IBacktester backtester,
ITradaoService tradaoService, ITradaoService tradaoService,
IMessengerService messengerService, IMessengerService messengerService,
ICacheService cacheService, ICacheService cacheService)
IAgentBalanceRepository agentBalanceRepository,
IAgentSummaryRepository agentSummaryRepository)
{ {
_exchangeService = exchangeService; _exchangeService = exchangeService;
_accountService = accountService; _accountService = accountService;
@@ -52,8 +49,6 @@ public class StatisticService : IStatisticService
_tradaoService = tradaoService; _tradaoService = tradaoService;
_messengerService = messengerService; _messengerService = messengerService;
_cacheService = cacheService; _cacheService = cacheService;
_agentBalanceRepository = agentBalanceRepository;
_agentSummaryRepository = agentSummaryRepository;
} }
public async Task UpdateTopVolumeTicker(TradingExchanges exchange, int top) public async Task UpdateTopVolumeTicker(TradingExchanges exchange, int top)
@@ -433,95 +428,4 @@ public class StatisticService : IStatisticService
await _messengerService.SendBadTraders(lastBadTrader); await _messengerService.SendBadTraders(lastBadTrader);
} }
public async Task<AgentBalanceHistory> 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<AgentBalanceHistory>(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<AgentBalanceHistory> 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<AgentBalanceHistory>, 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<IEnumerable<AgentSummary>> GetAllAgentSummaries()
{
return await _agentSummaryRepository.GetAllAsync();
}
} }

View File

@@ -4,7 +4,6 @@ using Managing.Application.Abstractions.Repositories;
using Managing.Application.Abstractions.Services; using Managing.Application.Abstractions.Services;
using Managing.Common; using Managing.Common;
using Managing.Domain.Accounts; using Managing.Domain.Accounts;
using Managing.Domain.Statistics;
using Managing.Domain.Users; using Managing.Domain.Users;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@@ -18,7 +17,6 @@ public class UserService : IUserService
private readonly ILogger<UserService> _logger; private readonly ILogger<UserService> _logger;
private readonly ICacheService _cacheService; private readonly ICacheService _cacheService;
private readonly IGrainFactory _grainFactory; private readonly IGrainFactory _grainFactory;
private readonly IAgentSummaryRepository _agentSummaryRepository;
private string[] authorizedAddresses = private string[] authorizedAddresses =
[ [
@@ -40,8 +38,7 @@ public class UserService : IUserService
IAccountService accountService, IAccountService accountService,
ILogger<UserService> logger, ILogger<UserService> logger,
ICacheService cacheService, ICacheService cacheService,
IGrainFactory grainFactory, IGrainFactory grainFactory)
IAgentSummaryRepository agentSummaryRepository)
{ {
_evmManager = evmManager; _evmManager = evmManager;
_userRepository = userRepository; _userRepository = userRepository;
@@ -49,7 +46,6 @@ public class UserService : IUserService
_logger = logger; _logger = logger;
_cacheService = cacheService; _cacheService = cacheService;
_grainFactory = grainFactory; _grainFactory = grainFactory;
_agentSummaryRepository = agentSummaryRepository;
} }
public async Task<User> Authenticate(string name, string address, string message, string signature) public async Task<User> Authenticate(string name, string address, string message, string signature)
@@ -252,19 +248,5 @@ public class UserService : IUserService
return await _userRepository.GetAllUsersAsync(); 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;
}
}
} }

View File

@@ -19,4 +19,9 @@
<ItemGroup> <ItemGroup>
<Folder Include="Migrations\"/> <Folder Include="Migrations\"/>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Managing.Application.Abstractions\Managing.Application.Abstractions.csproj"/>
<ProjectReference Include="..\Managing.Domain\Managing.Domain.csproj"/>
</ItemGroup>
</Project> </Project>