using System; using System.Collections.Generic; using Serilog; using Newtonsoft.Json; using LCU.Api.Internal.MaidBotLib.Models; using LCU.Library.Internal.ApiResponse.Models; using LCU.Library.Internal.ApiResponse.Services; using LCU.Library.Internal.ArchiverApiModel.Models; namespace LCU.Api.Internal.ArchiverApi.Services; public class ArchiveCompletionService : IArchiveCompletionService { private readonly IFileOperationsService _fileOperationsService; private readonly INotificationService _notificationService; public ArchiveCompletionService(IFileOperationsService fileOperationsService, INotificationService notificationService) { _fileOperationsService = fileOperationsService; _notificationService = notificationService; } public void HandleReportArchiveCompletedRequest(Response response) { try { var payLoadString = response.ResponsePayload; var archiveResponsePayload = JsonConvert.DeserializeObject(payLoadString); var archiveRequestResponse = archiveResponsePayload.ArchiveRequestResponse; archiveRequestResponse.IsSuccessful = response.Successful; archiveRequestResponse.MessageStack.AddRange(response.ResponseStack); var requestResult = PopulateErrorDetailsAndRequestResponse(archiveResponsePayload, archiveRequestResponse); QueueReturnResponse.QueueResponse(archiveResponsePayload.ArchiveRequest, requestResult.archiveRequestResponse.IsSuccessful, requestResult.archiveRequestResponse.MessageStack); var errorsSent = _notificationService.SendErrorEmailAsync(requestResult.errorDetails).Result; if (!errorsSent) { Log.ForContext(nameof(PropertyEnum.Group), nameof(GroupEnum.ITDevelopment)) .Error($"Failure to send error details for {requestResult.errorDetails.Count} errors."); throw new Exception($"Failure to send error details for {requestResult.errorDetails.Count} errors."); } } catch (Exception exception) { Log.Error(exception, $"Error while archiving reports. " + $"Message:{exception.Message}"); } } public (List errorDetails, ArchiveRequestResponse archiveRequestResponse) PopulateErrorDetailsAndRequestResponse(ArchiveResponsePayload archiveResponsePayload, ArchiveRequestResponse archiveRequestResponse) { var errorDetails = new List(); foreach (var request in archiveResponsePayload.BulkOperationRequest.OperationRequests) { var errorMessage = ""; try { //If file still exist move did not occur. var fileExists = _fileOperationsService.ValidateFileExists(request.Source).Result; if (fileExists) { errorMessage = $"File {request.SourceFile} was not archived to the path of {request.Destination} "; archiveRequestResponse.IsSuccessful = false; archiveRequestResponse.MessageStack.Add(errorMessage); } } catch (Exception exception) { var loggingMessage = $"Exception thrown while looking for the file at path {request.Source}."; errorMessage = $"{loggingMessage}. Message: {exception.Message}"; Log.Error(exception, loggingMessage); } if (!string.IsNullOrEmpty(errorMessage)) { var newErrorDetail = new ErrorDetail() { FileLocation = request.SourcePath, Filename = request.FinalSourceFile, Destination = request.Destination, Description = errorMessage }; errorDetails.Add(newErrorDetail); } } return (errorDetails, archiveRequestResponse); } }