Phase 5.3-ClosedTrade: ClosedTrade -> Modul + ICopyTradeLogRepository
- ClosedTrade (+ ClosedTradeRow) nach src/PolyTrader.Modules.CopyTrading/Models/. - Neues ICopyTradeLogRepository (+ Mongo-Impl) im Modul: EnsureIndexes, Exists, Insert, Find(predicate) auf der closed_trades-Collection. - closed_trades-Zugriffe der Modul-Services vom App-Shim auf das Repo umgestellt: TraderMonitorService, PersistenceService, PolymarketWssClient, TraderAnalyticsJob. Shim-/DB-Usings dort entfernt. - TraderMonitorService nutzt kein _db mehr (auch die uebrigen _db-Guards aus 3d entfernt, da Repos immer verfuegbar sind). Verhaltensneutral. - frm_main (UI) + Program.cs (BsonDocument-Cleanup) bleiben auf _db. - Build 0 Fehler. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
3be75c0f05
commit
88fc982089
@@ -1,8 +1,7 @@
|
||||
using System.Threading.Channels;
|
||||
using MongoDB.Driver;
|
||||
using PolyTraderSharp.Extensions;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PolyTrader.Modules.CopyTrading.Persistence;
|
||||
using PolyTraderSharp.Models;
|
||||
|
||||
namespace PolyTraderSharp.Services
|
||||
@@ -10,14 +9,14 @@ namespace PolyTraderSharp.Services
|
||||
public class PersistenceService : BackgroundService
|
||||
{
|
||||
private readonly ChannelReader<ClosedTrade> _tradeReader;
|
||||
private readonly IMongoDatabase _db;
|
||||
private readonly ICopyTradeLogRepository _tradeLog;
|
||||
private readonly TerminalLogger _logger;
|
||||
private readonly JobStatusRow _jobStatus;
|
||||
|
||||
public PersistenceService(ChannelReader<ClosedTrade> tradeReader, IMongoDatabase db, TerminalLogger logger, JobManager jobManager)
|
||||
public PersistenceService(ChannelReader<ClosedTrade> tradeReader, ICopyTradeLogRepository tradeLog, TerminalLogger logger, JobManager jobManager)
|
||||
{
|
||||
_tradeReader = tradeReader;
|
||||
_db = db;
|
||||
_tradeLog = tradeLog;
|
||||
_logger = logger;
|
||||
|
||||
_jobStatus = new JobStatusRow
|
||||
@@ -43,10 +42,7 @@ namespace PolyTraderSharp.Services
|
||||
_jobStatus.StatusText = "Listening (Channel)...";
|
||||
|
||||
// One-time index setup (moved out of hot loop)
|
||||
var col = _db.GetCollection<ClosedTrade>("closed_trades");
|
||||
col.EnsureIndex(x => x.TradeId);
|
||||
col.EnsureIndex(x => x.AccountId);
|
||||
col.EnsureIndex(x => x.TokenId);
|
||||
_tradeLog.EnsureIndexes();
|
||||
|
||||
// We do a loop waiting for items in the channel
|
||||
await foreach(var trade in _tradeReader.ReadAllAsync(stoppingToken))
|
||||
@@ -68,15 +64,14 @@ namespace PolyTraderSharp.Services
|
||||
// Trades bei jedem Sync-Zyklus oder nach einem Neustart erneut eingefügt werden.
|
||||
if (!string.IsNullOrEmpty(trade.TokenId))
|
||||
{
|
||||
var existing = col.LiteFindOne(x => x.AccountId == trade.AccountId && x.TokenId == trade.TokenId);
|
||||
if (existing != null)
|
||||
if (_tradeLog.Exists(trade.AccountId, trade.TokenId))
|
||||
{
|
||||
_logger.Debug($"Duplikat ignoriert: ClosedTrade für Account {trade.AccountId} + Token {trade.TokenId.Substring(0, Math.Min(10, trade.TokenId.Length))}... existiert bereits (DB-ID: {existing.TradeId}).");
|
||||
_logger.Debug($"Duplikat ignoriert: ClosedTrade für Account {trade.AccountId} + Token {trade.TokenId.Substring(0, Math.Min(10, trade.TokenId.Length))}... existiert bereits.");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
col.Insert(trade);
|
||||
|
||||
_tradeLog.Insert(trade);
|
||||
|
||||
_logger.Debug($"Saved ClosedTrade {trade.TradeId} to MongoDB");
|
||||
_jobStatus.LastRun = DateTime.Now;
|
||||
|
||||
Reference in New Issue
Block a user