using ECMJobRunner.Application.ProfileHistories.Commands; using ECMJobRunner.Domain.Entities; using ECMJobRunner.Domain.Interfaces; using ECMJobRunner.Domain.ValueObjects; using MediatR; using ReC.Client.Api; using System.Threading; using System.Threading.Tasks; namespace ECMJobRunner.Application.Profiles.Commands { /// /// Command to trigger a single DEX job execution /// Execution logic is handled by pipeline behaviors: /// 1. MainQueryExecutionBehavior - executes main SQL query /// 2. CheckQueryExecutionBehavior - validates with check SQL query /// 3. ReCRequestExecutionBehavior - invokes ReC HTTP request /// public class TriggeringProfileJobCommand : IRequest { /// /// The SQL job to execute /// public ProfileSqlJob Job { get; set; } = null!; /// /// Unique batch identifier for this execution /// public string BatchId { get; set; } = null!; internal BatchRecActionViewResponse? RecActionResult { get; set; } } /// /// Handler for TriggeringDEXJobCommand /// All execution logic is delegated to pipeline behaviors /// This handler simply returns completion after behaviors execute /// public class TriggeringDEXJobCommandHandler(ISender Sender) : IRequestHandler { /// /// Handles the TriggeringDEXJobCommand /// Returns immediately as behaviors perform all work /// /// The command containing job and batch ID /// Cancellation token /// Unit value indicating completion public async Task Handle(TriggeringProfileJobCommand request, CancellationToken cancellationToken) { // All execution logic is handled by pipeline behaviors: // - MainQueryExecutionBehavior // - CheckQueryExecutionBehavior // - ReCRequestExecutionBehavior var cmd = new CreateProfileHistoryCommand { Result = ResultType.Ok, ResultText = $"Job '{request.Job.Name}' erfolgreich abgeschlossen. | Batch-ID: {request.BatchId} | Verarbeitete Aktionen: {request.RecActionResult?.TotalActionCount ?? 0} | Fehlgeschlagene Aktionen: {request.RecActionResult?.ActionExceptionCount ?? 0}", ProfileId = request.Job.ProfileId, AddedWho = "ECMJobRunner" }; await Sender.Send(cmd, cancellationToken); return Unit.Value; } } }