public GetAllLearnersResult(GetAllLearnersResponse response)
 {
     Learners             = response.Learners;
     BatchNumber          = response.BatchNumber;
     BatchSize            = response.BatchSize;
     TotalNumberOfBatches = response.TotalNumberOfBatches;
 }
Example #2
0
        public async Task Then_Gets_Learners_From_CommitmentsV2_Api(
            GetAllLearnersQuery query,
            GetAllLearnersResponse apiResponse,
            [Frozen] Mock <ICommitmentsV2ApiClient <CommitmentsV2ApiConfiguration> > mockApiClient,
            GetAllLearnersQueryHandler handler)
        {
            mockApiClient
            .Setup(client => client.Get <GetAllLearnersResponse>(It.IsAny <GetAllLearnersRequest>()))
            .ReturnsAsync(apiResponse);

            var result = await handler.Handle(query, CancellationToken.None);

            result.Learners.Should().BeEquivalentTo(apiResponse.Learners);
        }
Example #3
0
        public async Task <Unit> Handle(ImportApprovalsRequest request, CancellationToken cancellationToken)
        {
            try
            {
                _logger.LogInformation("Commencing approvals import.");

                // 1. Figure out extract start time.

                DateTime?extractStartTime = null;
                _logger.LogInformation($"Calculating Approvals changed date, initially set to null.");
                DateTime?latestApprovalsExtractTimestamp = await _approvalsExtractRepository.GetLatestExtractTimestamp();

                if (null != latestApprovalsExtractTimestamp && latestApprovalsExtractTimestamp.HasValue)
                {
                    extractStartTime = latestApprovalsExtractTimestamp.Value.AddSeconds(-await GetSettingAsInt(TOLERANCE_SETTING_NAME));
                    _logger.LogInformation($"Pulling Approvals changed since: {extractStartTime}");
                }

                // 2. Request the extract in batches.

                int batchSize = await GetSettingAsInt(BATCHSIZE_SETTING_NAME);

                int batchNumber = 0;
                int count       = 0;
                GetAllLearnersResponse learnersBatch = null;

                // 3. Reset Staging Table
                await _approvalsExtractRepository.ClearApprovalsExtractStaging();

                do
                {
                    batchNumber++;
                    learnersBatch = await _outerApiService.GetAllLearners(extractStartTime, batchNumber, batchSize);

                    if (null == learnersBatch || null == learnersBatch.Learners)
                    {
                        throw new Exception($"Failed to get learners batch: sinceTime={extractStartTime?.ToString("o", System.Globalization.CultureInfo.InvariantCulture)} batchNumber={batchNumber} batchSize={batchSize}");
                    }

                    // 4. Upsert Batch to ApprovalsExtract_Staging.
                    _logger.LogInformation($"Approvals batch import loop. Starting batch {batchNumber} of {learnersBatch.TotalNumberOfBatches}");

                    await UpsertApprovalsExtractToStaging(learnersBatch.Learners);

                    count += learnersBatch.Learners.Count;
                    _logger.LogInformation($"Approvals batch import loop. Batch Completed {batchNumber} of {learnersBatch.TotalNumberOfBatches}. Total Inserted: {count}");
                } while (batchNumber < learnersBatch.TotalNumberOfBatches);

                // 5. Run Populate ApprovalsExtract From Staging
                _logger.LogInformation($"Begin Populating Approvals Extract");
                await _approvalsExtractRepository.PopulateApprovalsExtract();

                _logger.LogInformation($"Finished Populating Approvals Extract");

                // 6. Run Populate Learner
                _logger.LogInformation($"Begin Running Populate Learner");
                var learnerCount = await _approvalsExtractRepository.PopulateLearner();

                _logger.LogInformation($"Finished Running Populate Learner");

                // 7. Update providers cache

                await _approvalsExtractRepository.InsertProvidersFromApprovalsExtract();

                _logger.LogInformation($"Approvals import completed successfully. {count} record(s) read from outer api, {learnerCount} records inserted to Learner table.");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Approvals import failed to complete successfully.");
                throw;
            }

            return(Unit.Value);
        }