public async Task <BulkResultResponse> ProcessAsync(BulkProcessRequest request) { var response = new BulkResultResponse(); try { CsvResponseModel <ResultCsvRecordResponse> stage2Response = null; // Step 1: Read file from Blob using (var fileStream = await _blobStorageService.DownloadFileAsync(new BlobStorageData { ContainerName = request.DocumentType.ToString(), BlobFileName = request.BlobFileName, SourceFilePath = $"{request.AoUkprn}/{BulkProcessStatus.Processing}", UserName = request.PerformedBy })) { if (fileStream == null) { var blobReadError = $"No FileStream found to process bluk results. Method: DownloadFileAsync(ContainerName: {request.DocumentType}, BlobFileName = {request.BlobFileName}, SourceFilePath = {request.AoUkprn}/{BulkProcessStatus.Processing}, UserName = {request.PerformedBy}), User: {request.PerformedBy}"; _logger.LogInformation(LogEvent.FileStreamNotFound, blobReadError); throw new Exception(blobReadError); } // Stage 2 validation stage2Response = await _csvService.ReadAndParseFileAsync(new ResultCsvRecordRequest { FileStream = fileStream }); if (!stage2Response.IsDirty) { CheckUlnDuplicates(stage2Response.Rows); } } // Step 2: Stage 2 validations if (stage2Response.IsDirty || !stage2Response.Rows.Any(x => x.IsValid)) { var validationErrors = ExtractAllValidationErrors(stage2Response); return(await SaveErrorsAndUpdateResponse(request, response, validationErrors)); } // Stage 3 valiation. var stage3Response = await _resultService.ValidateResultsAsync(request.AoUkprn, stage2Response.Rows.Where(x => x.IsValid)); if (stage2Response.Rows.Any(x => !x.IsValid) || stage3Response.Any(x => !x.IsValid)) { var validationErrors = ExtractAllValidationErrors(stage2Response, stage3Response); return(await SaveErrorsAndUpdateResponse(request, response, validationErrors)); } // Step: Map data to DB model type. var results = _resultService.TransformResultsModel(stage3Response, request.PerformedBy); // Step: DB operation var resultsProcessResult = await _resultService.CompareAndProcessResultsAsync(results); // update total assessment records stats resultsProcessResult.BulkUploadStats = new BulkUploadStats { TotalRecordsCount = stage3Response.Count }; return(await ProcessResultsResponse(request, response, resultsProcessResult)); } catch (Exception ex) { var errorMessage = $"Something went wrong while processing bluk results. Method: ProcessBulkResultsAsync(BulkProcessRequest : {JsonConvert.SerializeObject(request)}), User: {request.PerformedBy}"; _logger.LogError(LogEvent.BulkResultProcessFailed, ex, errorMessage); await DeleteFileFromProcessingFolderAsync(request); } return(response); }