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

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

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

            _model = new BulkProcessRequest
            {
                AoUkprn             = _ukprn,
                BlobFileName        = "assessmenttfile.csv",
                BlobUniqueReference = Guid.NewGuid()
            };
        }
        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();

            BulkResultRequest = new BulkProcessRequest {
                AoUkprn = Ukprn
            };

            BulkResultResponse = new BulkResultResponse
            {
                IsSuccess = true,
                Stats     = new BulkUploadStats
                {
                    TotalRecordsCount = 10
                }
            };

            UploadResultsRequestViewModel = new UploadResultsRequestViewModel {
                AoUkprn = Ukprn, File = FormFile
            };
            InternalApiClient.ProcessBulkResultsAsync(BulkResultRequest).Returns(BulkResultResponse);
            Loader = new ResultLoader(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();

            BulkResultRequest = new BulkProcessRequest {
                AoUkprn = Ukprn
            };

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

            UploadResultsRequestViewModel = new UploadResultsRequestViewModel {
                AoUkprn = Ukprn, File = FormFile
            };
            InternalApiClient.ProcessBulkResultsAsync(BulkResultRequest).Returns(BulkResultResponse);
            Loader = new ResultLoader(Mapper, Logger, InternalApiClient, BlobStorageService);
        }
        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 override void Setup()
 {
     Mapper              = Substitute.For <IMapper>();
     Logger              = Substitute.For <ILogger <ResultLoader> >();
     InternalApiClient   = Substitute.For <IResultsAndCertificationInternalApiClient>();
     BlobStorageService  = Substitute.For <IBlobStorageService>();
     FormFile            = Substitute.For <IFormFile>();
     BlobUniqueReference = Guid.NewGuid();
     BulkResultRequest   = new BulkProcessRequest {
         AoUkprn = Ukprn
     };
 }
        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);
        }
        public async Task <bool> DeleteFileFromProcessingFolderAsync(BulkProcessRequest request)
        {
            if (request == null)
            {
                return(false);
            }

            await _blobStorageService.DeleteFileAsync(new BlobStorageData
            {
                ContainerName  = request.DocumentType.ToString(),
                SourceFilePath = $"{request.AoUkprn}/{BulkProcessStatus.Processing}",
                BlobFileName   = request.BlobFileName
            });

            return(true);
        }
        public async Task <bool> MoveFileFromProcessingToProcessedAsync(BulkProcessRequest request)
        {
            if (request == null)
            {
                return(false);
            }

            await _blobStorageService.MoveFileAsync(new BlobStorageData
            {
                ContainerName       = request.DocumentType.ToString(),
                BlobFileName        = request.BlobFileName,
                SourceFilePath      = $"{request.AoUkprn}/{BulkProcessStatus.Processing}",
                DestinationFilePath = $"{request.AoUkprn}/{BulkProcessStatus.Processed}"
            });

            return(true);
        }
        public async Task <bool> UploadErrorsFileToBlobStorage(BulkProcessRequest request, byte[] errorFile)
        {
            if (errorFile == null || errorFile.Length == 0)
            {
                return(false);
            }
            await _blobStorageService.UploadFromByteArrayAsync(new BlobStorageData
            {
                ContainerName  = request.DocumentType.ToString(),
                SourceFilePath = $"{request.AoUkprn}/{BulkProcessStatus.ValidationErrors}",
                BlobFileName   = request.BlobFileName,
                UserName       = request.PerformedBy,
                FileData       = errorFile
            });

            return(true);
        }
        public override void Setup()
        {
            CsvService    = Substitute.For <ICsvHelperService <ResultCsvRecordRequest, CsvResponseModel <ResultCsvRecordResponse>, ResultCsvRecordResponse> >();
            ResultService = Substitute.For <IResultService>();
            BlobService   = Substitute.For <IBlobStorageService>();
            Logger        = Substitute.For <ILogger <BulkResultLoader> >();
            DocumentUploadHistoryService = Substitute.For <IDocumentUploadHistoryService>();

            BlobUniqueRef = Guid.NewGuid();

            Request = new BulkProcessRequest
            {
                AoUkprn             = 1234567891,
                BlobFileName        = "Results.csv",
                BlobUniqueReference = BlobUniqueRef,
                DocumentType        = DocumentType.Results,
                FileType            = FileType.Csv,
                PerformedBy         = "TestUser",
            };
        }
        public async Task <bool> CreateDocumentUploadHistory(BulkProcessRequest request, DocumentUploadStatus status = DocumentUploadStatus.Processed)
        {
            if (request == null)
            {
                return(false);
            }

            var model = new DocumentUploadHistoryDetails
            {
                AoUkprn             = request.AoUkprn,
                BlobFileName        = request.BlobFileName,
                BlobUniqueReference = request.BlobUniqueReference,
                DocumentType        = (int)request.DocumentType,
                FileType            = (int)request.FileType,
                Status    = (int)status,
                CreatedBy = request.PerformedBy
            };

            return(await _documentUploadHistoryService.CreateDocumentUploadHistory(model));
        }
        // Results endpoints
        public async Task <BulkResultResponse> ProcessBulkResultsAsync(BulkProcessRequest model)
        {
            var requestUri = ApiConstants.ProcessBulkResultsUri;

            return(await PostAsync <BulkProcessRequest, BulkResultResponse>(requestUri, model));
        }
 public async Task <BulkAssessmentResponse> ProcessBulkAssessmentsAsync(BulkProcessRequest request)
 {
     return(await _bulkAssementProcess.ProcessAsync(request));
 }
        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);
        }
 public async Task <BulkResultResponse> ProcessBulkResultsAsync(BulkProcessRequest request)
 {
     return(await _bulkResultProcess.ProcessAsync(request));
 }
 public async Task <BulkProcessResponse> ProcessBulkRegistrationsAsync(BulkProcessRequest request)
 {
     return(await _bulkRegistrationProcess.ProcessAsync(request));
 }