/// <summary> /// Capable of accommodating email address (unique identifier in HubSpot) change and other core contact attribute/property updates. /// Can also create a contact if it does not exist. /// </summary> private ActivitySyncOperation SyncCoreUpdates(DateTime lastSuccessfulSyncDate, ActivityProgress activityProgress) { var activity = new ActivitySyncOperation(_clock.UtcNow) { PreviousSyncDate = lastSuccessfulSyncDate }; try { _logger.LogInformation("Starting MP contact core updates to HubSpot one-way sync operation..."); var updates = _dataPrep.Prep(_ministryPlatformContactRepository.GetAuditedContactUpdates(lastSuccessfulSyncDate)); PersistActivityProgress(activityProgress, OperationName.CoreContactAttributeUpdateSync, operationContactCount: updates.Length); activity.SerialUpdateResult = _contactSyncer.SerialUpdate(updates); activity.SerialCreateResult = _contactSyncer.SerialCreate(activity.SerialUpdateResult.EmailAddressesDoNotExist.ToArray()); activity.SerialReconciliationResult = _contactSyncer.ReconcileConflicts(activity.SerialUpdateResult.EmailAddressesAlreadyExist.ToArray()); return(activity); } catch (Exception exc) { _logger.LogError(CoreEvent.Exception, exc, "An exception occurred while syncing MP contact core updates to HubSpot."); throw; } finally // *** ALWAYS *** capture the HubSpot API request count, even if an exception occurs { activity.Execution.FinishUtc = _clock.UtcNow; _jobRepository.PersistHubSpotApiDailyRequestCount(activity.HubSpotApiRequestCount, activity.Execution.StartUtc); } }
/// <summary> /// Handles create, update and reconciliation scenarios for MP CRM contacts identified as new registrants that ought to exist /// in the HubSpot CRM. /// </summary> private ActivitySyncOperation SyncNewRegistrations(DateTime lastSuccessfulSyncDate, ActivityProgress activityProgress) { var activity = new ActivitySyncOperation(_clock.UtcNow) { PreviousSyncDate = lastSuccessfulSyncDate }; try { _logger.LogInformation("Starting new MP registrations to HubSpot one-way sync operation..."); var newContacts = _ministryPlatformContactRepository.GetNewlyRegisteredContacts(lastSuccessfulSyncDate); // talk to MP PersistActivityProgress(activityProgress, OperationName.NewContactRegistrationSync, operationContactCount: newContacts.Count); activity.SerialCreateResult = _contactSyncer.SerialCreate(_dataPrep.Prep(newContacts)); // create in HubSpot activity.SerialUpdateResult = _contactSyncer.SerialUpdate(activity.SerialCreateResult.EmailAddressesAlreadyExist.ToArray()); // update in HubSpot activity.SerialReconciliationResult = _contactSyncer.ReconcileConflicts(activity.SerialUpdateResult.EmailAddressesAlreadyExist.ToArray()); return(activity); } catch (Exception exc) { _logger.LogError(CoreEvent.Exception, exc, "An exception occurred while syncing new MP contacts to HubSpot."); throw; } finally // *** ALWAYS *** capture the HubSpot API request count, even if an exception occurs { activity.Execution.FinishUtc = _clock.UtcNow; _jobRepository.PersistHubSpotApiDailyRequestCount(activity.HubSpotApiRequestCount, activity.Execution.StartUtc); } }