public override void Setup()
        {
            _tokenServiceClient = Substitute.For <ITokenServiceClient>();

            _configuration = new ResultsAndCertificationConfiguration
            {
                ResultsAndCertificationInternalApiSettings = new ResultsAndCertificationInternalApiSettings {
                    Uri = "http://tlevel.api.com"
                }
            };

            _mockHttpResult = new BulkProcessResponse
            {
                IsSuccess           = false,
                BlobUniqueReference = Guid.NewGuid(),
                ErrorFileSize       = 1.5
            };

            _model = new BulkProcessRequest
            {
                AoUkprn             = _ukprn,
                BlobFileName        = "inputfile_1.csv",
                BlobUniqueReference = Guid.NewGuid()
            };
        }
        public override void Given()
        {
            BulkRegistrationResponse = new BulkProcessResponse
            {
                IsSuccess           = false,
                BlobUniqueReference = BlobUniqueReference,
                ErrorFileSize       = 1.5
            };

            UploadRegistrationsRequestViewModel = new UploadRegistrationsRequestViewModel {
                AoUkprn = Ukprn, File = FormFile
            };

            UploadRegistrationsResponseViewModel = new UploadRegistrationsResponseViewModel
            {
                IsSuccess           = false,
                BlobUniqueReference = BlobUniqueReference,
                ErrorFileSize       = 1.5
            };

            Mapper.Map <BulkProcessRequest>(UploadRegistrationsRequestViewModel).Returns(BulkRegistrationRequest);
            Mapper.Map <UploadRegistrationsResponseViewModel>(BulkRegistrationResponse).Returns(UploadRegistrationsResponseViewModel);
            InternalApiClient.ProcessBulkRegistrationsAsync(BulkRegistrationRequest).Returns(BulkRegistrationResponse);
            Loader = new RegistrationLoader(Mapper, Logger, InternalApiClient, BlobStorageService);
        }
示例#3
0
        public override void Given()
        {
            BulkRegistrationResponse = new BulkProcessResponse
            {
                IsSuccess = true,
                Stats     = new BulkUploadStats
                {
                    TotalRecordsCount     = 10,
                    NewRecordsCount       = 5,
                    AmendedRecordsCount   = 3,
                    UnchangedRecordsCount = 2
                }
            };

            UploadRegistrationsRequestViewModel = new UploadRegistrationsRequestViewModel {
                AoUkprn = Ukprn, File = FormFile
            };

            UploadRegistrationsResponseViewModel = new UploadRegistrationsResponseViewModel
            {
                IsSuccess = true,
                Stats     = new BulkUploadStatsViewModel
                {
                    TotalRecordsCount     = 10,
                    NewRecordsCount       = 5,
                    AmendedRecordsCount   = 3,
                    UnchangedRecordsCount = 2
                }
            };

            Mapper.Map <BulkProcessRequest>(UploadRegistrationsRequestViewModel).Returns(BulkRegistrationRequest);
            Mapper.Map <UploadRegistrationsResponseViewModel>(BulkRegistrationResponse).Returns(UploadRegistrationsResponseViewModel);
            InternalApiClient.ProcessBulkRegistrationsAsync(BulkRegistrationRequest).Returns(BulkRegistrationResponse);
            Loader = new RegistrationLoader(Mapper, Logger, InternalApiClient, BlobStorageService);
        }
示例#4
0
        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();

            BulkRegistrationRequest = new BulkProcessRequest {
                AoUkprn = Ukprn
            };

            BulkRegistrationResponse = new BulkProcessResponse
            {
                IsSuccess           = false,
                BlobUniqueReference = Guid.NewGuid(),
                ErrorFileSize       = 1.5
            };

            UploadRegistrationsRequestViewModel = new UploadRegistrationsRequestViewModel {
                AoUkprn = Ukprn, File = FormFile
            };
            InternalApiClient.ProcessBulkRegistrationsAsync(BulkRegistrationRequest).Returns(BulkRegistrationResponse);
            Loader = new RegistrationLoader(Mapper, Logger, InternalApiClient, BlobStorageService);
        }
示例#5
0
        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();

            BulkRegistrationRequest = new BulkProcessRequest {
                AoUkprn = Ukprn
            };

            BulkRegistrationResponse = new BulkProcessResponse
            {
                IsSuccess = true,
                Stats     = new BulkUploadStats
                {
                    TotalRecordsCount     = 10,
                    NewRecordsCount       = 5,
                    AmendedRecordsCount   = 3,
                    UnchangedRecordsCount = 2
                }
            };

            UploadRegistrationsRequestViewModel = new UploadRegistrationsRequestViewModel {
                AoUkprn = Ukprn, File = FormFile
            };
            InternalApiClient.ProcessBulkRegistrationsAsync(BulkRegistrationRequest).Returns(BulkRegistrationResponse);
            Loader = new RegistrationLoader(Mapper, Logger, InternalApiClient, BlobStorageService);
        }
        public async Task <BulkProcessResponse> ProcessAsync(BulkProcessRequest request)
        {
            var response = new BulkProcessResponse();

            try
            {
                CsvResponseModel <RegistrationCsvRecordResponse> stage2RegistrationsResponse = 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 registrations. 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
                    stage2RegistrationsResponse = await _csvService.ReadAndParseFileAsync(new RegistrationCsvRecordRequest { FileStream = fileStream });

                    if (!stage2RegistrationsResponse.IsDirty)
                    {
                        CheckUlnDuplicates(stage2RegistrationsResponse.Rows);
                    }
                }

                if (stage2RegistrationsResponse.IsDirty || !stage2RegistrationsResponse.Rows.Any(x => x.IsValid))
                {
                    var validationErrors = ExtractAllValidationErrors(stage2RegistrationsResponse);
                    return(await SaveErrorsAndUpdateResponse(request, response, validationErrors));
                }

                // Stage 3 valiation.
                var stage3RegistrationsResponse = await _registrationService.ValidateRegistrationTlevelsAsync(request.AoUkprn, stage2RegistrationsResponse.Rows.Where(x => x.IsValid));

                if (stage2RegistrationsResponse.Rows.Any(x => !x.IsValid) || stage3RegistrationsResponse.Any(x => !x.IsValid))
                {
                    var validationErrors = ExtractAllValidationErrors(stage2RegistrationsResponse, stage3RegistrationsResponse);
                    return(await SaveErrorsAndUpdateResponse(request, response, validationErrors));
                }

                // Step: Map data to DB model type.
                var tqRegistrationProfiles = _registrationService.TransformRegistrationModel(stage3RegistrationsResponse, request.PerformedBy);

                // Step: Process Stage 4 validation and DB operation
                var registrationProcessResult = await _registrationService.CompareAndProcessRegistrationsAsync(tqRegistrationProfiles);

                return(registrationProcessResult.IsValid ?
                       await ProcessRegistrationResponse(request, response, registrationProcessResult) :
                       await SaveErrorsAndUpdateResponse(request, response, registrationProcessResult.ValidationErrors));
            }
            catch (Exception ex)
            {
                var errorMessage = $"Something went wrong while processing bluk registrations. Method: ProcessBulkRegistrationsAsync(BulkRegistrationRequest : {JsonConvert.SerializeObject(request)}), User: {request.PerformedBy}";
                _logger.LogError(LogEvent.BulkRegistrationProcessFailed, ex, errorMessage);
                await DeleteFileFromProcessingFolderAsync(request);
            }
            return(response);
        }
        private async Task <BulkProcessResponse> SaveErrorsAndUpdateResponse(BulkProcessRequest request, BulkProcessResponse response, IList <BulkProcessValidationError> registrationValidationErrors)
        {
            var errorFile = await CreateErrorFileAsync(registrationValidationErrors);

            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);
        }
        private async Task <BulkProcessResponse> ProcessRegistrationResponse(BulkProcessRequest request, BulkProcessResponse response, RegistrationProcessResponse registrationProcessResult)
        {
            _ = registrationProcessResult.IsSuccess ? await MoveFileFromProcessingToProcessedAsync(request) : await MoveFileFromProcessingToFailedAsync(request);
            await CreateDocumentUploadHistory(request, registrationProcessResult.IsSuccess?DocumentUploadStatus.Processed : DocumentUploadStatus.Failed);

            response.IsSuccess = registrationProcessResult.IsSuccess;
            response.Stats     = registrationProcessResult.BulkUploadStats;
            return(response);
        }
 public async override Task When()
 {
     _loader  = new BulkResultLoader(CsvService, ResultService, BlobService, DocumentUploadHistoryService, Logger);
     Response = await _loader.ProcessAsync(Request);
 }
 public async override Task When()
 {
     _result = await _apiClient.ProcessBulkRegistrationsAsync(_model);
 }