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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }