Fix db and fix endpoints

This commit is contained in:
2025-08-05 22:30:18 +07:00
parent 2dcbcc3ef2
commit 36529ae403
36 changed files with 5073 additions and 245 deletions

View File

@@ -40,6 +40,7 @@ public class PostgreSqlTradingRepository : ITradingRepository
{
var scenario = await _context.Scenarios
.AsNoTracking()
.Include(s => s.User)
.Include(s => s.ScenarioIndicators)
.ThenInclude(si => si.Indicator)
.FirstOrDefaultAsync(s => s.Name == name)
@@ -80,14 +81,36 @@ public class PostgreSqlTradingRepository : ITradingRepository
});
}
public async Task<IEnumerable<Scenario>> GetScenariosByUserAsync(User user)
{
var userId = user?.Id ?? 0;
var scenarios = await _context.Scenarios
.AsNoTracking()
.Include(s => s.User)
.Include(s => s.ScenarioIndicators)
.ThenInclude(si => si.Indicator)
.Where(s => s.UserId == userId)
.ToListAsync()
.ConfigureAwait(false);
return scenarios.Select(scenario =>
{
var mappedScenario = PostgreSqlMappers.Map(scenario);
mappedScenario.Indicators = scenario.ScenarioIndicators
.Select(si => PostgreSqlMappers.Map(si.Indicator))
.ToList();
return mappedScenario;
});
}
public async Task InsertScenarioAsync(Scenario scenario)
{
var userId = scenario.User?.Id ?? 0;
// Check if scenario already exists for the same user
var existingScenario = await _context.Scenarios
.AsNoTracking()
.FirstOrDefaultAsync(s => s.Name == scenario.Name &&
((scenario.User == null && s.UserName == null) ||
(scenario.User != null && s.UserName == scenario.User.Name)));
.FirstOrDefaultAsync(s => s.Name == scenario.Name && s.UserId == userId);
if (existingScenario != null)
{
@@ -104,11 +127,10 @@ public class PostgreSqlTradingRepository : ITradingRepository
{
foreach (var indicator in scenario.Indicators)
{
var indicatorUserId = indicator.User?.Id ?? 0;
var indicatorEntity = await _context.Indicators
.AsNoTracking()
.FirstOrDefaultAsync(i => i.Name == indicator.Name &&
((indicator.User == null && i.UserName == null) ||
(indicator.User != null && i.UserName == indicator.User.Name)));
.FirstOrDefaultAsync(i => i.Name == indicator.Name && i.UserId == indicatorUserId);
if (indicatorEntity != null)
{
@@ -134,7 +156,7 @@ public class PostgreSqlTradingRepository : ITradingRepository
if (entity != null)
{
entity.LoopbackPeriod = scenario.LoopbackPeriod ?? 1;
entity.UserName = scenario.User?.Name;
entity.UserId = scenario.User?.Id ?? 0;
entity.UpdatedAt = DateTime.UtcNow;
await _context.SaveChangesAsync();
@@ -196,12 +218,11 @@ public class PostgreSqlTradingRepository : ITradingRepository
public async Task InsertIndicatorAsync(IndicatorBase indicatorBase)
{
var indicatorUserId = indicatorBase.User?.Id ?? 0;
// Check if indicator already exists for the same user
var existingIndicator = await _context.Indicators
.AsNoTracking()
.FirstOrDefaultAsync(i => i.Name == indicatorBase.Name &&
((indicatorBase.User == null && i.UserName == null) ||
(indicatorBase.User != null && i.UserName == indicatorBase.User.Name)));
.FirstOrDefaultAsync(i => i.Name == indicatorBase.Name && i.UserId == indicatorUserId);
if (existingIndicator != null)
{
@@ -233,7 +254,7 @@ public class PostgreSqlTradingRepository : ITradingRepository
entity.SmoothPeriods = indicatorBase.SmoothPeriods;
entity.StochPeriods = indicatorBase.StochPeriods;
entity.CyclePeriods = indicatorBase.CyclePeriods;
entity.UserName = indicatorBase.User?.Name;
entity.UserId = indicatorBase.User?.Id ?? 0;
entity.UpdatedAt = DateTime.UtcNow;
await _context.SaveChangesAsync();
@@ -249,6 +270,7 @@ public class PostgreSqlTradingRepository : ITradingRepository
{
var position = await _context.Positions
.AsNoTracking()
.Include(p => p.User)
.Include(p => p.OpenTrade)
.Include(p => p.StopLossTrade)
.Include(p => p.TakeProfit1Trade)
@@ -268,6 +290,7 @@ public class PostgreSqlTradingRepository : ITradingRepository
{
var positions = await _context.Positions
.AsNoTracking()
.Include(p => p.User)
.Include(p => p.OpenTrade)
.Include(p => p.StopLossTrade)
.Include(p => p.TakeProfit1Trade)
@@ -288,6 +311,7 @@ public class PostgreSqlTradingRepository : ITradingRepository
{
var positions = await _context.Positions
.AsNoTracking()
.Include(p => p.User)
.Include(p => p.OpenTrade)
.Include(p => p.StopLossTrade)
.Include(p => p.TakeProfit1Trade)
@@ -301,12 +325,11 @@ public class PostgreSqlTradingRepository : ITradingRepository
public async Task InsertPositionAsync(Position position)
{
var positionUserId = position.User?.Id ?? 0;
// Check if position already exists for the same user
var existingPosition = await _context.Positions
.AsNoTracking()
.FirstOrDefaultAsync(p => p.Identifier == position.Identifier &&
((position.User == null && p.UserName == null) ||
(position.User != null && p.UserName == position.User.Name)));
.FirstOrDefaultAsync(p => p.Identifier == position.Identifier && p.UserId == positionUserId);
if (existingPosition != null)
{
@@ -385,10 +408,11 @@ public class PostgreSqlTradingRepository : ITradingRepository
public async Task<IEnumerable<Signal>> GetSignalsByUserAsync(User user)
{
var userId = user?.Id ?? 0;
var signals = await _context.Signals
.AsNoTracking()
.Where(s => (user == null && s.UserName == null) ||
(user != null && s.UserName == user.Name))
.Include(s => s.User)
.Where(s => s.UserId == userId)
.ToListAsync()
.ConfigureAwait(false);
@@ -402,11 +426,11 @@ public class PostgreSqlTradingRepository : ITradingRepository
public async Task<Signal> GetSignalByIdentifierAsync(string identifier, User user = null)
{
var userId = user?.Id ?? 0;
var signal = await _context.Signals
.AsNoTracking()
.FirstOrDefaultAsync(s => s.Identifier == identifier &&
((user == null && s.UserName == null) ||
(user != null && s.UserName == user.Name)))
.Include(s => s.User)
.FirstOrDefaultAsync(s => s.Identifier == identifier && s.UserId == userId)
.ConfigureAwait(false);
return PostgreSqlMappers.Map(signal);
@@ -414,13 +438,13 @@ public class PostgreSqlTradingRepository : ITradingRepository
public async Task InsertSignalAsync(Signal signal)
{
var signalUserId = signal.User?.Id ?? 0;
// Check if signal already exists with the same identifier, date, and user
var existingSignal = _context.Signals
.AsNoTracking()
.FirstOrDefault(s => s.Identifier == signal.Identifier &&
s.Date == signal.Date &&
((s.UserName == null && signal.User == null) ||
(s.UserName != null && signal.User != null && s.UserName == signal.User.Name)));
s.UserId == signalUserId);
if (existingSignal != null)
{
@@ -435,21 +459,21 @@ public class PostgreSqlTradingRepository : ITradingRepository
public async Task<IndicatorBase> GetStrategyByNameUserAsync(string name, User user)
{
var userId = user?.Id ?? 0;
var indicator = await _context.Indicators
.AsNoTracking()
.FirstOrDefaultAsync(i => i.Name == name &&
((user == null && i.UserName == null) ||
(user != null && i.UserName == user.Name)));
.Include(i => i.User)
.FirstOrDefaultAsync(i => i.Name == name && i.UserId == userId);
return PostgreSqlMappers.Map(indicator);
}
public async Task<Scenario> GetScenarioByNameUserAsync(string scenarioName, User user)
{
var userId = user?.Id ?? 0;
var scenario = await _context.Scenarios
.AsNoTracking()
.FirstOrDefaultAsync(s => s.Name == scenarioName &&
((user == null && s.UserName == null) ||
(user != null && s.UserName == user.Name)));
.Include(s => s.User)
.FirstOrDefaultAsync(s => s.Name == scenarioName && s.UserId == userId);
return PostgreSqlMappers.Map(scenario);
}