public override void Given() { HttpContextAccessor = Substitute.For <IHttpContextAccessor>(); HttpContextAccessor.HttpContext.Returns(new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.GivenName, _givename), new Claim(ClaimTypes.Surname, _surname), new Claim(ClaimTypes.Email, _email) })) }); CreateMapper(); BulkAssessmentRequest = new BulkProcessRequest { AoUkprn = Ukprn }; BulkAssessmentResponse = new BulkAssessmentResponse { IsSuccess = true, Stats = new BulkUploadStats { TotalRecordsCount = 10 } }; UploadAssessmentsRequestViewModel = new UploadAssessmentsRequestViewModel { AoUkprn = Ukprn, File = FormFile }; InternalApiClient.ProcessBulkAssessmentsAsync(BulkAssessmentRequest).Returns(BulkAssessmentResponse); Loader = new AssessmentLoader(Mapper, Logger, InternalApiClient, BlobStorageService); }
public override void Given() { HttpContextAccessor = Substitute.For <IHttpContextAccessor>(); HttpContextAccessor.HttpContext.Returns(new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.GivenName, _givename), new Claim(ClaimTypes.Surname, _surname), new Claim(ClaimTypes.Email, _email) })) }); CreateMapper(); BulkAssessmentRequest = new BulkProcessRequest { AoUkprn = Ukprn }; BulkAssessmentResponse = new BulkAssessmentResponse { IsSuccess = false, BlobUniqueReference = Guid.NewGuid(), ErrorFileSize = 1.5 }; UploadAssessmentsRequestViewModel = new UploadAssessmentsRequestViewModel { AoUkprn = Ukprn, File = FormFile }; InternalApiClient.ProcessBulkAssessmentsAsync(BulkAssessmentRequest).Returns(BulkAssessmentResponse); Loader = new AssessmentLoader(Mapper, Logger, InternalApiClient, BlobStorageService); }
public override void Given() { BulkAssessmentResponse = new BulkAssessmentResponse { IsSuccess = false, BlobUniqueReference = BlobUniqueReference, ErrorFileSize = 1.5 }; UploadAssessmentsRequestViewModel = new UploadAssessmentsRequestViewModel { AoUkprn = Ukprn, File = FormFile }; UploadAssessmentsResponseViewModel = new UploadAssessmentsResponseViewModel { IsSuccess = false, BlobUniqueReference = BlobUniqueReference, ErrorFileSize = 1.5 }; Mapper.Map <BulkProcessRequest>(UploadAssessmentsRequestViewModel).Returns(BulkAssessmentRequest); Mapper.Map <UploadAssessmentsResponseViewModel>(BulkAssessmentResponse).Returns(UploadAssessmentsResponseViewModel); InternalApiClient.ProcessBulkAssessmentsAsync(BulkAssessmentRequest).Returns(BulkAssessmentResponse); Loader = new AssessmentLoader(Mapper, Logger, InternalApiClient, BlobStorageService); }
public async Task <BulkAssessmentResponse> ProcessAsync(BulkProcessRequest request) { var response = new BulkAssessmentResponse(); try { CsvResponseModel <AssessmentCsvRecordResponse> 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 assessments. 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 AssessmentCsvRecordRequest { 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 _assessmentService.ValidateAssessmentsAsync(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 assessments = _assessmentService.TransformAssessmentsModel(stage3Response, request.PerformedBy); // Step: DB operation var assessmentsProcessResult = await _assessmentService.CompareAndProcessAssessmentsAsync(assessments.Item1, assessments.Item2); // update total assessment records stats assessmentsProcessResult.BulkUploadStats = new BulkUploadStats { TotalRecordsCount = stage3Response.Count }; return(await ProcessAssessmentsResponse(request, response, assessmentsProcessResult)); } catch (Exception ex) { var errorMessage = $"Something went wrong while processing bluk assessments. Method: ProcessBulkAssessmentsAsync(BulkProcessRequest : {JsonConvert.SerializeObject(request)}), User: {request.PerformedBy}"; _logger.LogError(LogEvent.BulkAssessmentProcessFailed, ex, errorMessage); await DeleteFileFromProcessingFolderAsync(request); } return(response); }
private async Task <BulkAssessmentResponse> ProcessAssessmentsResponse(BulkProcessRequest request, BulkAssessmentResponse response, AssessmentProcessResponse assessmentsProcessResult) { _ = assessmentsProcessResult.IsSuccess ? await MoveFileFromProcessingToProcessedAsync(request) : await MoveFileFromProcessingToFailedAsync(request); await CreateDocumentUploadHistory(request, assessmentsProcessResult.IsSuccess?DocumentUploadStatus.Processed : DocumentUploadStatus.Failed); response.IsSuccess = assessmentsProcessResult.IsSuccess; response.Stats = assessmentsProcessResult.BulkUploadStats; return(response); }
private async Task <BulkAssessmentResponse> SaveErrorsAndUpdateResponse(BulkProcessRequest request, BulkAssessmentResponse response, IList <BulkProcessValidationError> validationErrors) { var errorFile = await CreateErrorFileAsync(validationErrors); await UploadErrorsFileToBlobStorage(request, errorFile); await MoveFileFromProcessingToFailedAsync(request); await CreateDocumentUploadHistory(request, DocumentUploadStatus.Failed); response.IsSuccess = false; response.BlobUniqueReference = request.BlobUniqueReference; response.ErrorFileSize = Math.Round((errorFile.Length / 1024D), 2); return(response); }