Esempio n. 1
0
 public async Task AuditServiceFailAsync(IJobContextMessage jobContextMessage, string message)
 {
     await AuditAsync(
         jobContextMessage,
         AuditEventType.ServiceFailed,
         message);
 }
Esempio n. 2
0
 public async Task AuditServiceFailAsync(IJobContextMessage jobContextMessage, Exception ex)
 {
     await AuditAsync(
         jobContextMessage,
         AuditEventType.ServiceFailed,
         ex.ToString());
 }
Esempio n. 3
0
        public SourceFileModel GetSourceFileData(IJobContextMessage jobContextMessage)
        {
            if (!jobContextMessage.KeyValuePairs.ContainsKey(JobContextMessageKey.Filename))
            {
                throw new ArgumentException($"{nameof(JobContextMessageKey.Filename)} is required");
            }

            var fileName = jobContextMessage.KeyValuePairs[JobContextMessageKey.Filename].ToString();

            string[] fileNameParts = FileNameHelper.SplitFileName(fileName);

            if (fileNameParts.Length != 5)
            {
                throw new ArgumentException($"{nameof(JobContextMessageKey.Filename)} is invalid");
            }

            var fileNameDatePart = FileNameHelper.GetPreparedDateFromFileName(fileName);

            if (!DateTime.TryParse(fileNameDatePart, out var preparationDateTime))
            {
                throw new ArgumentException($"{nameof(JobContextMessageKey.Filename)} is invalid");
            }

            var jobId = jobContextMessage.JobId;

            return(new SourceFileModel
            {
                ConRefNumber = fileNameParts[2],
                UKPRN = fileNameParts[1],
                FileName = fileName,
                PreparationDate = preparationDateTime,
                SuppliedDate = jobContextMessage.SubmissionDateTimeUtc,
                JobId = jobId
            });
        }
        public override void AddExtraKeys(IJobContextMessage message, FileUploadJob metaData)
        {
            message.KeyValuePairs.Add(JobContextMessageKey.FileSizeInBytes, metaData.FileSize);

            if (metaData.IsFirstStage)
            {
                message.KeyValuePairs.Add(JobContextMessageKey.PauseWhenFinished, "1");
            }

            if (metaData.Ukprn == 0)
            {
                return;
            }

            message.KeyValuePairs.Add(JobContextMessageKey.InvalidLearnRefNumbers, GenerateKey(metaData.Ukprn, metaData.JobId, "ValidationInvalidLearners", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.ValidLearnRefNumbers, GenerateKey(metaData.Ukprn, metaData.JobId, "ValidationValidLearners", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.ValidationErrors, GenerateKey(metaData.Ukprn, metaData.JobId, "ValidationErrors", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.ValidationErrorLookups, GenerateKey(metaData.Ukprn, metaData.JobId, "ValidationErrorsLookup", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.FundingAlbOutput, GenerateKey(metaData.Ukprn, metaData.JobId, "FundingAlbOutput", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.FundingFm35Output, GenerateKey(metaData.Ukprn, metaData.JobId, "FundingFm35Output", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.FundingFm25Output, GenerateKey(metaData.Ukprn, metaData.JobId, "FundingFm25Output", "json"));
            message.KeyValuePairs.Add(JobContextMessageKey.FundingFm36Output, GenerateKey(metaData.Ukprn, metaData.JobId, JobContextMessageKey.FundingFm36Output, "json"));
            message.KeyValuePairs.Add("FundingFm70Output", GenerateKey(metaData.Ukprn, metaData.JobId, "FundingFm70Output", "json"));
            message.KeyValuePairs.Add("FundingFm81Output", GenerateKey(metaData.Ukprn, metaData.JobId, "FundingFm81Output", "json"));
            message.KeyValuePairs.Add("OriginalFilename", metaData.FileName);
            message.KeyValuePairs.Add("CollectionYear", metaData.CollectionYear);
        }
        public async Task RunTasks(
            IJobContextMessage jobContextMessage,
            IReadOnlyList <ITaskItem> tasks,
            CancellationToken cancellationToken)
        {
            var wrapper         = new SupplementaryDataWrapper();
            var sourceFileModel = new SourceFileModel();

            if (tasks.SelectMany(t => t.Tasks).Contains(Constants.ValidationTask))
            {
                sourceFileModel = _fileHelper.GetSourceFileData(jobContextMessage);

                wrapper = await _fileValidationService.GetFile(sourceFileModel, cancellationToken);

                if (!wrapper.ValidErrorModels.Any())
                {
                    wrapper = _fileValidationService.RunFileValidators(sourceFileModel, wrapper);
                }

                if (wrapper.ValidErrorModels.Any())
                {
                    await _storageController.StoreValidationOnly(sourceFileModel, wrapper, cancellationToken);

                    await _reportingController.FileLevelErrorReport(wrapper, sourceFileModel, cancellationToken);

                    return;
                }
            }

            await _taskHelper.ExecuteTasks(tasks, sourceFileModel, wrapper, cancellationToken);
        }
Esempio n. 6
0
 private static SubmissionEvent GetSubmissionEvent <T>(IJobContextMessage message) where T : SubmissionEvent, new()
 {
     return(new T
     {
         AcademicYear = short.Parse(message.KeyValuePairs[JobContextMessageKey.CollectionYear].ToString()),
         CollectionPeriod = byte.Parse(message.KeyValuePairs[JobContextMessageKey.ReturnPeriod].ToString()),
         IlrSubmissionDateTime = message.SubmissionDateTimeUtc,
         JobId = message.JobId,
         Ukprn = long.Parse(message.KeyValuePairs[JobContextMessageKey.UkPrn].ToString()),
         EventTime = DateTimeOffset.UtcNow
     });
 }
Esempio n. 7
0
        public async Task AuditEndAsync(IJobContextMessage jobContextMessage)
        {
            await AuditAsync(
                jobContextMessage,
                AuditEventType.ServiceFinished);

            if (jobContextMessage.TopicPointer == jobContextMessage.Topics.Count - 1)
            {
                await AuditAsync(
                    jobContextMessage,
                    AuditEventType.JobFinished);
            }
        }
Esempio n. 8
0
        public async Task AuditStartAsync(IJobContextMessage jobContextMessage)
        {
            if (jobContextMessage.TopicPointer == 0)
            {
                await AuditAsync(
                    jobContextMessage,
                    AuditEventType.JobStarted);
            }

            await AuditAsync(
                jobContextMessage,
                AuditEventType.ServiceStarted);
        }
Esempio n. 9
0
 public async Task AuditAsync(
     IJobContextMessage jobContextMessage,
     AuditEventType eventType,
     string extraInfo = null)
 {
     await AuditAsync(
         jobContextMessage.Topics[jobContextMessage.TopicPointer].SubscriptionName,
         eventType,
         (string)jobContextMessage.KeyValuePairs[JobContextMessageKey.Username],
         jobContextMessage.JobId,
         (string)jobContextMessage.KeyValuePairs[JobContextMessageKey.Filename],
         (string)jobContextMessage.KeyValuePairs[JobContextMessageKey.UkPrn],
         extraInfo);
 }
        public async Task <bool> Callback(IJobContextMessage jobContextMessage, CancellationToken cancellationToken)
        {
            _logger.LogInfo("ESF callback invoked");

            var tasks = jobContextMessage.Topics[jobContextMessage.TopicPointer].Tasks;

            if (!tasks.Any())
            {
                _logger.LogInfo("ESF. No tasks to run.");
                return(true);
            }

            if (cancellationToken.IsCancellationRequested)
            {
                return(true);
            }

            await _controller.RunTasks(jobContextMessage, tasks, cancellationToken);

            return(true);
        }
        public static IEsfJobContext MapJobContextToModel(IJobContextMessage message)
        {
            var collectionYear = message.KeyValuePairs[JobContextMessageKey.CollectionYear].ToString();

            return(new EsfJobContext
            {
                JobId = message.JobId,
                UkPrn = Convert.ToInt32(message.KeyValuePairs[JobContextMessageKey.UkPrn]),
                BlobContainerName = message.KeyValuePairs[JobContextMessageKey.Container].ToString(),
                SubmissionDateTimeUtc = message.SubmissionDateTimeUtc,
                FileName = message.KeyValuePairs[JobContextMessageKey.Filename].ToString(),
                CurrentPeriod = Convert.ToInt32(message.KeyValuePairs[JobContextMessageKey.ReturnPeriod]),
                CollectionYear = Convert.ToInt32(message.KeyValuePairs[JobContextMessageKey.CollectionYear]),
                Tasks = message.Topics[message.TopicPointer].Tasks?.SelectMany(t => t.Tasks).ToList(),
                IlrReferenceDataKey = message.KeyValuePairs.ContainsKey(JobContextMessageKey.IlrReferenceData)
                    ? message.KeyValuePairs[JobContextMessageKey.IlrReferenceData].ToString()
                    : null,
                CollectionName = message.KeyValuePairs[JobContextMessageKey.CollectionName].ToString(),
                StartCollectionYearAbbreviation = collectionYear.Substring(0, 2),
                EndCollectionYearAbbreviation = collectionYear.Substring(2)
            });
        }
Esempio n. 12
0
 public DataStoreJobContextMessageContext(IJobContextMessage jobContextMessage, PersistDataConfiguration persistDataConfiguration)
 {
     _jobContextMessage        = jobContextMessage;
     _persistDataConfiguration = persistDataConfiguration;
 }
 public DataStoreJobContextMessageContext(IJobContextMessage jobContextMessage)
 {
     _jobContextMessage = jobContextMessage;
 }
 public abstract void AddExtraKeys(IJobContextMessage message, FileUploadJob metaData);
 public override void AddExtraKeys(IJobContextMessage message, FileUploadJob metaData)
 {
 }
Esempio n. 16
0
 public ReportServiceContext(IJobContextMessage jobContextMessage)
 {
     _jobContextMessage = jobContextMessage;
 }
Esempio n. 17
0
 public JobContextMessageValidationContext(IJobContextMessage jobContextMessage)
 {
     _jobContextMessage = jobContextMessage;
 }
Esempio n. 18
0
 public ReportServiceContext(IJobContextMessage jobContextMessage, ISerializationService serializationService, DataPersistConfiguration dataPersistConfiguration)
 {
     _jobContextMessage        = jobContextMessage;
     _serializationService     = serializationService;
     _dataPersistConfiguration = dataPersistConfiguration;
 }
Esempio n. 19
0
 public async Task FinishSuccessfully(IJobContextMessage jobContextMessage)
 {
     await _auditor.AuditEndAsync(jobContextMessage);
 }
        public async Task ExecuteAsync(IJobContextMessage jobContextMessage, CancellationToken cancellationToken)
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            var stopWatchSteps = new Stopwatch();

            stopWatchSteps.Start();

            FundingServiceDto fundingServiceDto = (FundingServiceDto)_fundingServiceDto;

            fundingServiceDto.Message = await _ilrFileProviderService.Provide(jobContextMessage.KeyValuePairs[JobContextMessageKey.Filename].ToString()).ConfigureAwait(false);

            _logger.LogDebug($"Funding Service got file in: {stopWatchSteps.ElapsedMilliseconds}");
            stopWatchSteps.Restart();

            cancellationToken.ThrowIfCancellationRequested();

            // get valid and invalid learners from intermediate storage and store it in the dto for rulebases
            string validLearnerString = await _keyValuePersistenceService.GetAsync(
                jobContextMessage.KeyValuePairs[JobContextMessageKey.ValidLearnRefNumbers].ToString(), cancellationToken);

            fundingServiceDto.ValidLearners = _jsonSerializationService.Deserialize <string[]>(validLearnerString);

            fundingServiceDto.InvalidLearners = _jsonSerializationService.Deserialize <string[]>(
                await _keyValuePersistenceService.GetAsync(
                    jobContextMessage.KeyValuePairs[JobContextMessageKey.InvalidLearnRefNumbers].ToString(), cancellationToken));

            _logger.LogDebug($"Funding Service got valid learners in: {stopWatchSteps.ElapsedMilliseconds} validlearner(length): {validLearnerString.Length}");

            cancellationToken.ThrowIfCancellationRequested();

            stopWatchSteps.Restart();
            await _populationService.PopulateAsync(cancellationToken).ConfigureAwait(false);

            cancellationToken.ThrowIfCancellationRequested();

            string externalDataCache = _jsonSerializationService.Serialize(_externalDataCache);
            string internalDataCache = _jsonSerializationService.Serialize(_internalDataCache);
            string fileDataCache     = _jsonSerializationService.Serialize(_fileDataCache);

            _logger.LogDebug($"Funding Service got external data: {stopWatchSteps.ElapsedMilliseconds}");

            //List<FundingActorDto> fundingActorDtos = _learnerPagingService
            //    .BuildPages()
            //    .Select(p =>
            //        new FundingActorDto
            //        {
            //            JobId = jobContextMessage.JobId,
            //            ExternalDataCache = externalDataCache,
            //            InternalDataCache = internalDataCache,
            //            FileDataCache = fileDataCache,
            //            ValidLearners = _jsonSerializationService.Serialize(p)
            //        }).ToList();

            List <string> taskNames = jobContextMessage.Topics[jobContextMessage.TopicPointer].Tasks.SelectMany(t => t.Tasks).ToList();

            List <Task> fundingTasks = new List <Task>();

            if (taskNames.Contains(_topicAndTaskSectionConfig.TopicFunding_TaskPerformFM81Calculation))
            {
                List <FundingActorDto> fundingActorDtos = GetFundingModelPages(new List <int> {
                    81
                }, jobContextMessage, externalDataCache, internalDataCache, fileDataCache);
                _logger.LogDebug($"Funding Service FM81 {fundingActorDtos.Count} pages");
                fundingTasks.Add(_fm81ActorTask.Execute(fundingActorDtos, jobContextMessage.KeyValuePairs[JobContextMessageKey.FundingFm81Output].ToString(), cancellationToken));
            }

            if (taskNames.Contains(_topicAndTaskSectionConfig.TopicFunding_TaskPerformFM70Calculation))
            {
                List <FundingActorDto> fundingActorDtos = GetFundingModelPages(new List <int> {
                    70
                }, jobContextMessage, externalDataCache, internalDataCache, fileDataCache);
                _logger.LogDebug($"Funding Service FM70 {fundingActorDtos.Count} pages");
                fundingTasks.Add(_fm70ActorTask.Execute(fundingActorDtos, jobContextMessage.KeyValuePairs[JobContextMessageKey.FundingFm70Output].ToString(), cancellationToken));
            }

            if (taskNames.Contains(_topicAndTaskSectionConfig.TopicFunding_TaskPerformFM35Calculation))
            {
                List <FundingActorDto> fundingActorDtos = GetFundingModelPages(new List <int> {
                    35
                }, jobContextMessage, externalDataCache, internalDataCache, fileDataCache);
                _logger.LogDebug($"Funding Service FM35 {fundingActorDtos.Count} pages");
                fundingTasks.Add(_fm35ActorTask.Execute(fundingActorDtos, jobContextMessage.KeyValuePairs[JobContextMessageKey.FundingFm35Output].ToString(), cancellationToken));
            }

            if (taskNames.Contains(_topicAndTaskSectionConfig.TopicFunding_TaskPerformFM36Calculation))
            {
                List <FundingActorDto> fundingActorDtos = GetFundingModelPages(new List <int> {
                    36
                }, jobContextMessage, externalDataCache, internalDataCache, fileDataCache);
                _logger.LogDebug($"Funding Service FM36 {fundingActorDtos.Count} pages");
                fundingTasks.Add(_fm36ActorTask.Execute(fundingActorDtos, jobContextMessage.KeyValuePairs[JobContextMessageKey.FundingFm36Output].ToString(), cancellationToken));
            }

            if (taskNames.Contains(_topicAndTaskSectionConfig.TopicFunding_TaskPerformFM25Calculation))
            {
                List <FundingActorDto> fundingActorDtos = GetFundingModelPages(new List <int> {
                    25
                }, jobContextMessage, externalDataCache, internalDataCache, fileDataCache);
                _logger.LogDebug($"Funding Service FM25 {fundingActorDtos.Count} pages");
                fundingTasks.Add(_fm25ActorTask.Execute(fundingActorDtos, jobContextMessage.KeyValuePairs[JobContextMessageKey.FundingFm25Output].ToString(), cancellationToken));
            }

            if (taskNames.Contains(_topicAndTaskSectionConfig.TopicFunding_TaskPerformALBCalculation))
            {
                List <FundingActorDto> fundingActorDtos = GetFundingModelPages(new List <int> {
                    99, 81
                }, jobContextMessage, externalDataCache, internalDataCache, fileDataCache);
                _logger.LogDebug($"Funding Service FM99/81 {fundingActorDtos.Count} pages");
                fundingTasks.Add(_albActorTask.Execute(fundingActorDtos, jobContextMessage.KeyValuePairs[JobContextMessageKey.FundingAlbOutput].ToString(), cancellationToken));
            }

            await Task.WhenAll(fundingTasks).ConfigureAwait(false);

            _logger.LogDebug($"Completed Funding Service for given rule bases in: {stopWatch.ElapsedMilliseconds}");
        }
 private List <FundingActorDto> GetFundingModelPages(IEnumerable <int> filter, IJobContextMessage jobContextMessage, string externalDataCache, string internalDataCache, string fileDataCache)
 {
     return(_learnerPagingService
            .BuildPages(filter)
            .Select(p =>
                    new FundingActorDto
     {
         JobId = jobContextMessage.JobId,
         ExternalDataCache = externalDataCache,
         InternalDataCache = internalDataCache,
         FileDataCache = fileDataCache,
         ValidLearners = _jsonSerializationService.Serialize(p)
     }).ToList());
 }
Esempio n. 22
0
 public async Task AuditJobFailAsync(IJobContextMessage jobContextMessage)
 {
     await AuditAsync(
         jobContextMessage,
         AuditEventType.JobFailed);
 }
Esempio n. 23
0
 public async Task FinishError(IJobContextMessage jobContextMessage)
 {
     await _auditor.AuditJobFailAsync(jobContextMessage);
 }
Esempio n. 24
0
 public NcsJobContextMessage(IJobContextMessage jobContextMessage)
 {
     _jobContextMessage = jobContextMessage;
 }