Fix fetch userStrategies

This commit is contained in:
2025-09-29 00:59:29 +07:00
parent e2d7e75247
commit 5953b96a38

View File

@@ -3,6 +3,7 @@ using Managing.Api.Models.Responses;
using Managing.Application.Abstractions.Grains; using Managing.Application.Abstractions.Grains;
using Managing.Application.Abstractions.Services; using Managing.Application.Abstractions.Services;
using Managing.Application.ManageBot.Commands; using Managing.Application.ManageBot.Commands;
using Managing.Core;
using Managing.Domain.Backtests; using Managing.Domain.Backtests;
using Managing.Domain.Bots; using Managing.Domain.Bots;
using Managing.Domain.Candles; using Managing.Domain.Candles;
@@ -35,6 +36,7 @@ public class DataController : ControllerBase
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly ITradingService _tradingService; private readonly ITradingService _tradingService;
private readonly IGrainFactory _grainFactory; private readonly IGrainFactory _grainFactory;
private readonly IServiceScopeFactory _serviceScopeFactory;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="DataController"/> class. /// Initializes a new instance of the <see cref="DataController"/> class.
@@ -48,6 +50,7 @@ public class DataController : ControllerBase
/// <param name="mediator">Mediator for handling commands and queries.</param> /// <param name="mediator">Mediator for handling commands and queries.</param>
/// <param name="tradingService">Service for trading operations.</param> /// <param name="tradingService">Service for trading operations.</param>
/// <param name="grainFactory">Orleans grain factory for accessing grains.</param> /// <param name="grainFactory">Orleans grain factory for accessing grains.</param>
/// <param name="serviceScopeFactory">Service scope factory for creating scoped services.</param>
public DataController( public DataController(
IExchangeService exchangeService, IExchangeService exchangeService,
IAccountService accountService, IAccountService accountService,
@@ -56,7 +59,8 @@ public class DataController : ControllerBase
IAgentService agentService, IAgentService agentService,
IMediator mediator, IMediator mediator,
ITradingService tradingService, ITradingService tradingService,
IGrainFactory grainFactory) IGrainFactory grainFactory,
IServiceScopeFactory serviceScopeFactory)
{ {
_exchangeService = exchangeService; _exchangeService = exchangeService;
_accountService = accountService; _accountService = accountService;
@@ -66,6 +70,7 @@ public class DataController : ControllerBase
_mediator = mediator; _mediator = mediator;
_tradingService = tradingService; _tradingService = tradingService;
_grainFactory = grainFactory; _grainFactory = grainFactory;
_serviceScopeFactory = serviceScopeFactory;
} }
/// <summary> /// <summary>
@@ -405,9 +410,12 @@ public class DataController : ControllerBase
var endDate = DateTime.UtcNow; var endDate = DateTime.UtcNow;
var agentBalanceHistory = await _agentService.GetAgentBalances(agentName, startDate, endDate); var agentBalanceHistory = await _agentService.GetAgentBalances(agentName, startDate, endDate);
// Convert to detailed view model with additional information // Convert to detailed view model with additional information using separate scopes to avoid DbContext concurrency
var result = await Task.WhenAll( var result = await Task.WhenAll(
userStrategies.Select(strategy => MapStrategyToViewModelAsync(strategy, agentBalanceHistory)) userStrategies.Select(strategy =>
ServiceScopeHelpers.WithScopedService<ITradingService, UserStrategyDetailsViewModel>(
_serviceScopeFactory,
async tradingService => await MapStrategyToViewModelAsync(strategy, agentBalanceHistory, tradingService)))
); );
return Ok(result); return Ok(result);
@@ -446,7 +454,7 @@ public class DataController : ControllerBase
var agentBalanceHistory = await _agentService.GetAgentBalances(agentName, startDate, endDate); var agentBalanceHistory = await _agentService.GetAgentBalances(agentName, startDate, endDate);
// Map the strategy to a view model using the shared method // Map the strategy to a view model using the shared method
var result = await MapStrategyToViewModelAsync(strategy, agentBalanceHistory); var result = await MapStrategyToViewModelAsync(strategy, agentBalanceHistory, _tradingService);
return Ok(result); return Ok(result);
} }
@@ -456,9 +464,10 @@ public class DataController : ControllerBase
/// </summary> /// </summary>
/// <param name="strategy">The trading bot to map</param> /// <param name="strategy">The trading bot to map</param>
/// <param name="agentBalanceHistory">Agent balance history data</param> /// <param name="agentBalanceHistory">Agent balance history data</param>
/// <param name="tradingService">Trading service for fetching positions</param>
/// <returns>A view model with detailed strategy information</returns> /// <returns>A view model with detailed strategy information</returns>
private async Task<UserStrategyDetailsViewModel> MapStrategyToViewModelAsync(Bot strategy, private async Task<UserStrategyDetailsViewModel> MapStrategyToViewModelAsync(Bot strategy,
AgentBalanceHistory agentBalanceHistory) AgentBalanceHistory agentBalanceHistory, ITradingService tradingService)
{ {
// Calculate volume statistics // Calculate volume statistics
decimal totalVolume = strategy.Volume; decimal totalVolume = strategy.Volume;
@@ -469,8 +478,8 @@ public class DataController : ControllerBase
int winRate = wins + losses > 0 ? (wins * 100) / (wins + losses) : 0; int winRate = wins + losses > 0 ? (wins * 100) / (wins + losses) : 0;
// Fetch positions associated with this bot // Fetch positions associated with this bot using the provided trading service
var positions = await _tradingService.GetPositionsByInitiatorIdentifierAsync(strategy.Identifier); var positions = await tradingService.GetPositionsByInitiatorIdentifierAsync(strategy.Identifier);
// Convert agent balance history to wallet balances dictionary // Convert agent balance history to wallet balances dictionary
var walletBalances = agentBalanceHistory?.AgentBalances? var walletBalances = agentBalanceHistory?.AgentBalances?