public void Update(Guid applicationGuid) { var application = _vacancyApplicationsRepository.GetVacancyApplication(applicationGuid); if (application == null) { var message = $"Application {applicationGuid} could not be found. It has likely been deleted since this update"; _logService.Warn(message); return; } var candidateGuid = application.CandidateId; var candidateIds = _candidateRepository.GetCandidateIdsByGuid(new[] { candidateGuid }); if (!candidateIds.ContainsKey(candidateGuid)) { var message = $"Candidate {candidateGuid} for application {applicationGuid} could not be found"; _logService.Warn(message); throw new CustomException(message); } var destinationCandidateId = candidateIds[candidateGuid]; var destinationApplicationIds = _destinationApplicationRepository.GetApplicationIdsByGuid(new[] { applicationGuid }); var candidateApplicationIds = _destinationApplicationRepository.GetApplicationIdsByCandidateIds(new[] { destinationCandidateId }); var applicationIds = _applicationMappers.GetApplicationIds(destinationApplicationIds, candidateApplicationIds, new[] { application }, candidateIds); var applicationHistoryIds = _destinationApplicationHistoryRepository.GetApplicationHistoryIdsByApplicationIds(applicationIds.Values); var schoolAttendedIds = _schoolAttendedRepository.GetSchoolAttendedIdsByApplicationIds(applicationIds.Values); var applicationWithHistory = _applicationMappers.MapApplicationWithHistory(application, destinationCandidateId, applicationIds, new Dictionary <int, ApplicationSummary>(), schoolAttendedIds, new Dictionary <int, SubVacancy>(), applicationHistoryIds, new Dictionary <int, List <ApplicationHistorySummary> >()); Update(applicationWithHistory); }
private void ProcessApplications(IAsyncCursor <VacancyApplication> cursor, long expectedCount, HashSet <int> vacancyIds, IDictionary <Guid, int> candidateIds, SyncType syncType, CancellationToken cancellationToken) { var count = 0; while (cursor.MoveNextAsync(cancellationToken).Result&& !cancellationToken.IsCancellationRequested) { var batch = cursor.Current.ToList(); if (batch.Count == 0) { continue; } _logService.Info($"Processing {batch.Count} {_vacancyApplicationsUpdater.CollectionName}"); var maxDateCreated = batch.Max(a => a.DateCreated); var maxDateUpdated = batch.Max(a => a.DateUpdated) ?? DateTime.MinValue; LoadCandidates(candidateIds, batch); var destinationCandidateIds = batch.Where(a => candidateIds.ContainsKey(a.CandidateId)).Select(a => candidateIds[a.CandidateId]).ToArray(); batch = batch.Where(a => a.Vacancy != null && vacancyIds.Contains(a.Vacancy.Id) && candidateIds.ContainsKey(a.CandidateId)).ToList(); var destinationApplicationIds = _destinationApplicationRepository.GetApplicationIdsByGuid(batch.Select(a => a.Id)); var candidateApplicationIds = _destinationApplicationRepository.GetApplicationIdsByCandidateIds(destinationCandidateIds); var applicationIds = _applicationMappers.GetApplicationIds(destinationApplicationIds, candidateApplicationIds, batch, candidateIds); var legacyApplicationIds = batch.Where(a => a.LegacyApplicationId != 0).Select(a => a.LegacyApplicationId).ToArray(); var sourceApplicationSummaries = _sourceApplicationRepository.GetApplicationSummariesByIds(legacyApplicationIds); var applicationHistoryIds = _destinationApplicationHistoryRepository.GetApplicationHistoryIdsByApplicationIds(applicationIds.Values); var sourceApplicationHistorySummaries = _sourceApplicationHistoryRepository.GetApplicationHistorySummariesByApplicationIds(legacyApplicationIds); var schoolAttendedIds = _schoolAttendedRepository.GetSchoolAttendedIdsByApplicationIds(applicationIds.Values); var subVacancies = _sourceSubVacancyRepository.GetApplicationSummariesByIds(legacyApplicationIds); var applicationsWithHistory = batch.Select(a => _applicationMappers.MapApplicationWithHistory(a, candidateIds[a.CandidateId], applicationIds, sourceApplicationSummaries, schoolAttendedIds, subVacancies, applicationHistoryIds, sourceApplicationHistorySummaries)).ToList(); count += applicationsWithHistory.Count; _logService.Info($"Processing {applicationsWithHistory.Count} {_vacancyApplicationsUpdater.CollectionName}"); BulkUpsert(applicationsWithHistory, applicationIds); if (syncType == SyncType.Full) { _vacancyApplicationsUpdater.UpdateLastCreatedSyncDate(maxDateCreated); //Deliberate as date updated could skip some updates post full sync _vacancyApplicationsUpdater.UpdateLastUpdatedSyncDate(maxDateCreated); } if (syncType == SyncType.PartialByDateCreated) { _vacancyApplicationsUpdater.UpdateLastCreatedSyncDate(maxDateCreated); } if (syncType == SyncType.PartialByDateUpdated) { _vacancyApplicationsUpdater.UpdateLastUpdatedSyncDate(maxDateUpdated); } var percentage = ((double)count / expectedCount) * 100; _logService.Info($"Processed batch of {applicationsWithHistory.Count} {_vacancyApplicationsUpdater.CollectionName} and {count} {_vacancyApplicationsUpdater.CollectionName} out of {expectedCount} in total. {Math.Round(percentage, 2)}% complete. LastCreatedDate: {_vacancyApplicationsUpdater.VacancyApplicationLastCreatedDate} LastUpdatedDate: {_vacancyApplicationsUpdater.VacancyApplicationLastUpdatedDate}"); } }