Exemplo n.º 1
0
        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}");
            }
        }