Add Genetic workers

This commit is contained in:
2025-07-10 19:15:57 +07:00
parent c2c181e417
commit 0b4f2173e0
20 changed files with 1752 additions and 3 deletions

View File

@@ -0,0 +1,90 @@
using Managing.Application.Abstractions.Repositories;
using Managing.Domain.Backtests;
using Managing.Domain.Users;
using Managing.Infrastructure.Databases.MongoDb;
using Managing.Infrastructure.Databases.MongoDb.Abstractions;
using Managing.Infrastructure.Databases.MongoDb.Collections;
namespace Managing.Infrastructure.Databases;
public class GeneticRepository : IGeneticRepository
{
private readonly IMongoRepository<GeneticRequestDto> _geneticRequestRepository;
public GeneticRepository(IMongoRepository<GeneticRequestDto> geneticRequestRepository)
{
_geneticRequestRepository = geneticRequestRepository;
}
public void InsertGeneticRequestForUser(User user, GeneticRequest geneticRequest)
{
geneticRequest.User = user;
_geneticRequestRepository.InsertOne(MongoMappers.Map(geneticRequest));
}
public IEnumerable<GeneticRequest> GetGeneticRequestsByUser(User user)
{
var geneticRequests = _geneticRequestRepository.AsQueryable()
.Where(gr => gr.User.Name == user.Name)
.OrderByDescending(gr => gr.CreatedAt)
.ToList();
return geneticRequests.Select(gr => MongoMappers.Map(gr));
}
public GeneticRequest GetGeneticRequestByIdForUser(User user, string id)
{
var geneticRequest = _geneticRequestRepository.FindById(id);
// Check if genetic request exists and belongs to the user
if (geneticRequest != null && geneticRequest.User != null && geneticRequest.User.Name == user.Name)
{
return MongoMappers.Map(geneticRequest);
}
return null;
}
public void UpdateGeneticRequest(GeneticRequest geneticRequest)
{
var existingRequest = _geneticRequestRepository.FindOne(gr => gr.RequestId == geneticRequest.RequestId);
if (existingRequest != null)
{
var updatedDto = MongoMappers.Map(geneticRequest);
updatedDto.Id = existingRequest.Id; // Preserve the MongoDB ObjectId
_geneticRequestRepository.ReplaceOne(updatedDto);
}
}
public void DeleteGeneticRequestByIdForUser(User user, string id)
{
var geneticRequest = _geneticRequestRepository.FindOne(gr => gr.RequestId == id);
if (geneticRequest != null && geneticRequest.User != null && geneticRequest.User.Name == user.Name)
{
_geneticRequestRepository.DeleteById(geneticRequest.Id.ToString());
}
}
public void DeleteAllGeneticRequestsForUser(User user)
{
var geneticRequests = _geneticRequestRepository.AsQueryable()
.Where(gr => gr.User != null && gr.User.Name == user.Name)
.ToList();
foreach (var geneticRequest in geneticRequests)
{
_geneticRequestRepository.DeleteById(geneticRequest.Id.ToString());
}
}
public IEnumerable<GeneticRequest> GetPendingGeneticRequests()
{
var pendingRequests = _geneticRequestRepository.AsQueryable()
.Where(gr => gr.Status == "Pending")
.OrderBy(gr => gr.CreatedAt)
.ToList();
return pendingRequests.Select(gr => MongoMappers.Map(gr));
}
}

View File

@@ -0,0 +1,31 @@
using Managing.Infrastructure.Databases.MongoDb.Attributes;
using Managing.Infrastructure.Databases.MongoDb.Configurations;
using static Managing.Common.Enums;
namespace Managing.Infrastructure.Databases.MongoDb.Collections
{
[BsonCollection("GeneticRequests")]
public class GeneticRequestDto : Document
{
public string RequestId { get; set; }
public UserDto User { get; set; }
public DateTime? CompletedAt { get; set; }
public string Status { get; set; }
public Ticker Ticker { get; set; }
public Timeframe Timeframe { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public decimal Balance { get; set; }
public int PopulationSize { get; set; }
public int Generations { get; set; }
public double MutationRate { get; set; }
public string SelectionMethod { get; set; }
public int ElitismPercentage { get; set; }
public double MaxTakeProfit { get; set; }
public List<IndicatorType> EligibleIndicators { get; set; } = new();
public double? BestFitness { get; set; }
public string? BestIndividual { get; set; }
public string? ErrorMessage { get; set; }
public string? ProgressInfo { get; set; }
}
}

View File

@@ -182,6 +182,71 @@ public static class MongoMappers
#endregion
#region Genetic Requests
internal static GeneticRequest Map(GeneticRequestDto dto)
{
if (dto == null)
return null;
return new GeneticRequest
{
RequestId = dto.RequestId,
User = Map(dto.User),
CreatedAt = dto.CreatedAt,
CompletedAt = dto.CompletedAt,
Status = Enum.Parse<GeneticRequestStatus>(dto.Status),
Ticker = dto.Ticker,
Timeframe = dto.Timeframe,
StartDate = dto.StartDate,
EndDate = dto.EndDate,
Balance = dto.Balance,
PopulationSize = dto.PopulationSize,
Generations = dto.Generations,
MutationRate = dto.MutationRate,
SelectionMethod = dto.SelectionMethod,
ElitismPercentage = dto.ElitismPercentage,
MaxTakeProfit = dto.MaxTakeProfit,
EligibleIndicators = dto.EligibleIndicators,
BestFitness = dto.BestFitness,
BestIndividual = dto.BestIndividual,
ErrorMessage = dto.ErrorMessage,
ProgressInfo = dto.ProgressInfo
};
}
internal static GeneticRequestDto Map(GeneticRequest geneticRequest)
{
if (geneticRequest == null)
return null;
return new GeneticRequestDto
{
RequestId = geneticRequest.RequestId,
User = Map(geneticRequest.User),
CompletedAt = geneticRequest.CompletedAt,
Status = geneticRequest.Status.ToString(),
Ticker = geneticRequest.Ticker,
Timeframe = geneticRequest.Timeframe,
StartDate = geneticRequest.StartDate,
EndDate = geneticRequest.EndDate,
Balance = geneticRequest.Balance,
PopulationSize = geneticRequest.PopulationSize,
Generations = geneticRequest.Generations,
MutationRate = geneticRequest.MutationRate,
SelectionMethod = geneticRequest.SelectionMethod,
ElitismPercentage = geneticRequest.ElitismPercentage,
MaxTakeProfit = geneticRequest.MaxTakeProfit,
EligibleIndicators = geneticRequest.EligibleIndicators,
BestFitness = geneticRequest.BestFitness,
BestIndividual = geneticRequest.BestIndividual,
ErrorMessage = geneticRequest.ErrorMessage,
ProgressInfo = geneticRequest.ProgressInfo
};
}
#endregion
#region Candles
public static Candle Map(CandleDto candle)