Files
monorepo/LCU.API.Internal.Dispatcher/LCU.Api.Internal.Dispatcher/Services/DispatcherOperationServices/CompletionService.cs
T
2026-03-24 15:26:03 -05:00

84 lines
3.7 KiB
C#

using Newtonsoft.Json;
using LCU.Library.Internal.ApiResponse.Models;
using LCU.Api.Internal.Dispatcher.Services.QueueServices;
using LCU.Library.Internal.DispatcherModels.Models.Requests;
using LCU.Library.Internal.DispatcherModels.Enums;
using System.Collections.Generic;
using RabbitMQ.Client;
using LCU.Api.Internal.MaidBotLib.Models;
namespace LCU.Api.Internal.Dispatcher.Services.DispatcherOperationServices;
public class CompletionService : ICompletionService
{
private readonly IJobService _jobService;
private readonly IWorkItemService _workItemService;
private readonly IExecutionMessageService _executionMessageService;
private readonly IQueueJobFailureService _queueJobFailureService;
private readonly IQueueDetermineOperationService _queueDetermineOperationService;
public CompletionService(IJobService jobService,
IWorkItemService workItemService,
IExecutionMessageService executionMessageService,
IQueueJobFailureService queueJobFailureService,
IQueueDetermineOperationService queueDetermineOperationService)
{
_jobService = jobService;
_workItemService = workItemService;
_executionMessageService = executionMessageService;
_queueJobFailureService = queueJobFailureService;
_queueDetermineOperationService = queueDetermineOperationService;
}
public async Task HandleCompletionRequest(Response response)
{
var dispatcherReturnResponse = JsonConvert.DeserializeObject<DispatcherReturnResponse>(response.ResponsePayload);
try
{
ArgumentNullException.ThrowIfNull(dispatcherReturnResponse);
var job = await _jobService.GetByWorkItemIdExcludingWorkItemsAsync(dispatcherReturnResponse.WorkItemId);
if (!response.Successful)
{
await _queueJobFailureService.QueueJobFailure(job.JobId,
dispatcherReturnResponse.WorkItemId,
response.ResponseStack == null || response.ResponseStack.Any() ? response.ResponseStack : new List<string>());
return;
}
var workItem = await _workItemService.GetByIdAsync(dispatcherReturnResponse.WorkItemId);
if (workItem.CurrentWorkItemExecution == null)
{
Log.Warning($"CurrentWorkitemExecution was null for WorkItemId:{dispatcherReturnResponse.WorkItemId}");
return;
}
await _executionMessageService.SaveExecutionMessages(workItem.CurrentWorkItemExecution.WorkItemExecutionId, response.ResponseStack);
if (workItem.CanceledJobCounter > 0)
{
workItem = await _workItemService.ResetCanceledJobCounter(workItem);
}
job.JobStatus = JobStatus.DeterminingOperation;
var updatedJob = await _jobService.UpdateAsync(job);
await _queueDetermineOperationService.QueueDetermineOperation(updatedJob, workItem, SetDetermineOperationType(dispatcherReturnResponse.Skipped));
}
catch (Exception exception)
{
var exceptionMessage = $"Failed to perform completion. Job may be stuck in an inoperable status. WorkItemId: {dispatcherReturnResponse.WorkItemId}";
Log.Error(exception, exceptionMessage);
throw new ServiceException(exceptionMessage);
}
}
public DetermineOperationType SetDetermineOperationType(bool isSkipped)
{
if(isSkipped)
{
return DetermineOperationType.Skipped;
}
return DetermineOperationType.Completed;
}
}