/// <summary> /// Отправить окончательный ответ /// </summary> private async Task SendResponse(IPackageServer packageServer) { switch (packageServer.StatusProcessingProject) { case StatusProcessingProject.ConvertingComplete: case StatusProcessingProject.Error: { _messagingService.ShowMessage("Отправка данных пакета в базу..."); var packageDataShortResponse = _converterServerPackageDataToDto.FilesDataToShortResponse(packageServer); var result = await _convertingServerServiceFactory.UsingServiceRetry(service => service.Operations.UpdateFromResponse(packageDataShortResponse)); if (result.OkStatus) { _messagingService.ShowMessage("Конвертация пакета закончена"); } else { _loggerService.ErrorsLog(result.Errors); _messagingService.ShowErrors(result.Errors); } _loggerService.LogByObject(LoggerLevel.Info, LoggerAction.Upload, ReflectionInfo.GetMethodBase(this), packageServer.Id.ToString()); break; } case StatusProcessingProject.Abort: _messagingService.ShowMessage("Конвертация пакета прервана"); _loggerService.InfoLog("Abort converting by user"); break; } _idPackage = null; }
/// <summary> /// Отправить промежуточный отчет /// </summary> private async Task <IResultValue <IPackageServer> > SendIntermediateResponse(IPackageServer packageServer, IFileDataServer fileDataServer) => await _converterServerPackageDataToDto.FileDataToResponse(fileDataServer). Void(_ => _messagingService.ShowMessage("Отправка данных в базу...")). MapBindAsync(fileDataRequest => _convertingServerServiceFactory. UsingServiceRetry(service => service.Operations.UpdateFromIntermediateResponse(packageServer.Id, fileDataRequest))). ResultVoidBadAsync(errors => _loggerService.ErrorsLog(errors)). ResultVoidBadAsync(errors => _messagingService.ShowErrors(errors)). ResultValueOkAsync(packageServer.SetStatusProcessingProject);
/// <summary> /// Сообщить о пустом/некорректном пакете /// </summary> private IPackageServer ReplyPackageIsInvalid(IPackageServer packageServer) { var error = packageServer switch { _ when !packageServer.IsFilesDataValid => new ErrorCommon(ErrorConvertingType.FileNotFound, "Файлы для конвертации не обнаружены"), _ when !packageServer.IsValidByAttemptingCount => new ErrorCommon(ErrorConvertingType.AttemptingCount, "Превышено количество попыток конвертирования пакета"), _ => throw new ArgumentOutOfRangeException(nameof(packageServer)) }; _messagingService.ShowAndLogError(error); return(packageServer.SetErrorToAllFiles(error).SetStatusProcessingProject(StatusProcessingProject.Error)); }
/// <summary> /// Конвертировать пакет /// </summary> private async Task <IPackageServer> ConvertingFilesData(IPackageServer packageServer) => await packageServer.FilesDataServer. FirstOrDefault(fileData => !packageServer.IsCompleted && !fileData.IsCompleted). Map(fileData => new ResultValue <IFileDataServer>(fileData, new ErrorCommon(ErrorConvertingType.ArgumentNullReference, nameof(IFileDataServer)))). ResultOkBad( okFunc: fileData => ConvertingByCountLimit(fileData, new ConvertingSettings(packageServer.ConvertingPackageSettings, _projectSettings.PrintersInformation)). Map(fileDataConvert => packageServer.ChangeFileDataServer(fileDataConvert). Map(packageChanged => SendIntermediateResponse(packageChanged, fileDataConvert))). ResultValueOkAsync(ConvertingFilesData). MapAsync(result => result.OkStatus ? result.Value : packageServer), badFunc: _ => Task.FromResult(packageServer)). Value;
/// <summary> /// Конвертировать пакет /// </summary> private async Task ConvertingPackage(IPackageServer packageServer) => await packageServer. WhereContinueAsyncBind(package => package.IsValid, okFunc : package => package. Void(_ => _messagingService.ShowMessage($"Конвертация пакета {package.Id}")). Void(_ => _loggerService.LogByObject(LoggerLevel.Info, LoggerAction.Operation, ReflectionInfo.GetMethodBase(this), packageServer.Id.ToString())). Void(_ => ConvertingTimeActions.KillPreviousRunProcesses()). Map(_ => ConvertingFilesData(package)). MapAsync(ReplyPackageIsComplete), badFunc : package => Task.FromResult(ReplyPackageIsInvalid(package))). VoidAsync(_ => _convertingFileData.CloseApplication()). VoidBindAsync(SendResponse);
/// <summary> /// Конвертировать серверную модель в окончательный ответ /// </summary> public async Task <PackageDataResponseServer> FilesDataToResponse(IPackageServer packageServer) => new PackageDataResponseServer(packageServer.Id, packageServer.StatusProcessingProject, await packageServer.FilesDataServer.Select(FileDataToResponse). Map(Task.WhenAll));
/// <summary> /// Конвертировать серверную модель в промежуточную /// </summary> public PackageDataShortResponseServer FilesDataToShortResponse(IPackageServer packageServer) => new PackageDataShortResponseServer(packageServer.Id, packageServer.StatusProcessingProject, packageServer.FilesDataServer.Select(FileDataToIntermediateResponse).ToList());
/// <summary> /// Сообщить об обработанном пакете, если процесс не был прерван /// </summary> private IPackageServer ReplyPackageIsComplete(IPackageServer packageServer) => packageServer.SetStatusProcessingProject(StatusProcessingProject.ConvertingComplete). Void(_ => _loggerService.LogByObject(LoggerLevel.Info, LoggerAction.Reply, ReflectionInfo.GetMethodBase(this), packageServer.Id.ToString()));
public PackageServer(IPackageServer packageServer, IEnumerable <IFileDataServer> filesDataServer) : this(packageServer.NonNull().Id, packageServer.NonNull().AttemptingConvertCount, packageServer.NonNull().StatusProcessingProject, packageServer.NonNull().ConvertingPackageSettings, filesDataServer) { }