private static int UpdateSendGridAliasHistory(IEnumerable <PersonAlias> personAliases)
        {
            var personAliasesEnumerated = personAliases as IList <PersonAlias> ?? personAliases.ToList();

            if (!personAliasesEnumerated.Any())
            {
                return(0);
            }
            var now         = RockDateTime.Now;
            var rockContext = new RockContext();
            var personAliasHistoryService = new PersonAliasHistoryService(rockContext);
            int updated = 0;

            foreach (var personalias in personAliasesEnumerated)
            {
                var personAliasHistory = personAliasHistoryService.GetByPersonAliasId(personalias.Id);
                if (personAliasHistory != null)
                {
                    personAliasHistory.LastUpdated = now;
                }
                else
                {
                    personAliasHistory = new PersonAliasHistory
                    {
                        PersonAliasId = personalias.Id,
                        LastUpdated   = now
                    };
                    personAliasHistoryService.Add(personAliasHistory);
                }
                updated++;
            }
            rockContext.SaveChanges();
            return(updated);
        }
        public static IQueryable <PersonAlias> FindResyncCandidates(RockContext rockContext, DateTime historicSyncMarker)
        {
            historicSyncMarker = historicSyncMarker.AddSeconds(60);
            var syncedPersonAliases = new PersonAliasHistoryService(rockContext)
                                      .Queryable()
                                      .Where(a => a.LastUpdated <=
                                             historicSyncMarker && a.PersonAlias.Person.EmailPreference == EmailPreference.EmailAllowed &&
                                             a.PersonAlias.Person.Email != null && a.PersonAlias.Person.Email != "")
                                      .Select(a => a.PersonAlias);

            return(syncedPersonAliases);
        }
        private static int AddToSendGridAliasHistory(IEnumerable <PersonAlias> personAliases)
        {
            var now         = RockDateTime.Now;
            var rockContext = new RockContext();
            var personAliasHistoryService = new PersonAliasHistoryService(rockContext);
            int synced = 0;

            foreach (var aliasId in personAliases)
            {
                var personAliasHistory = new PersonAliasHistory
                {
                    PersonAliasId = aliasId.Id,
                    LastUpdated   = now
                };
                personAliasHistoryService.Add(personAliasHistory);
                synced++;
            }
            rockContext.SaveChanges();
            return(synced);
        }
        public void Execute(IJobExecutionContext context)
        {
            var    dataMap     = context.JobDetail.JobDataMap;
            string apiKey      = dataMap.GetString("APIKey");
            int    dayInterval = dataMap.GetIntValue("dayInterval");

            //Check API Key exists
            if (string.IsNullOrWhiteSpace(apiKey))
            {
                return;
            }

            //Check all the custom fields have been created for the SendGrid marketing campaign.
            bool fieldsExist = SyncHelper.CheckCustomFields(apiKey);

            if (!fieldsExist)
            {
                return;
            }

            var rockContext = new RockContext();
            var previouslySyncedPersonAliasIds = new PersonAliasHistoryService(rockContext).Queryable().AsNoTracking().Select(a => a.PersonAliasId);
            var notYetSynced = SyncHelper.FindNotYetSyncedPersonAlises(rockContext, previouslySyncedPersonAliasIds);

            var historicSyncMarker      = RockDateTime.Now.AddDays(-dayInterval);
            var needReSyncPersonAliases = SyncHelper.FindResyncCandidates(rockContext, historicSyncMarker);

            int synCount    = SyncHelper.SyncContacts(notYetSynced, apiKey);
            int reSyncCount = 0;

            if (needReSyncPersonAliases.Any())
            {
                reSyncCount = SyncHelper.SyncContacts(needReSyncPersonAliases, apiKey, true);
            }

            context.Result = string.Format("{0} people synced for the first time, {1} people updated", synCount, reSyncCount);
        }
Example #5
0
        public void Execute(IJobExecutionContext context)
        {
            var    dataMap    = context.JobDetail.JobDataMap;
            string apiKey     = dataMap.GetString("APIKey");
            string listName   = dataMap.GetString("ListName");
            string campusGuid = dataMap.GetString("campus");
            int    timeout    = dataMap.GetIntFromString("Timeout");

            var campus = campusGuid.AsGuidOrNull();

            //Check API Key exists and group guid is not null
            if (string.IsNullOrWhiteSpace(apiKey) || !campus.HasValue || string.IsNullOrWhiteSpace(listName))
            {
                return;
            }

            //Check all the custom fields have been created for the SendGrid marketing campaign.
            bool fieldsExist = SyncHelper.CheckCustomFields(apiKey);

            if (!fieldsExist)
            {
                return;
            }

            var listId = SyncHelper.EnsureListExists(apiKey, listName);

            if (!listId.HasValue)
            {
                throw new Exception("Unable to identify list identifier");
            }

            var familyGuid = Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid();


            int activeRecordStatusValueId = DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.PERSON_RECORD_STATUS_ACTIVE).Id;

            var rockContext = new RockContext();

            rockContext.Database.CommandTimeout = timeout;

            var campusAttendeesPersonAlias = new GroupService(rockContext)
                                             .Queryable()
                                             .AsNoTracking()
                                             .Where(g => g.GroupType.Guid == familyGuid && g.Campus.Guid == campus.Value)
                                             .SelectMany(g => g.Members)
                                             .Select(gm => gm.Person)
                                             .Where(p => !p.IsDeceased && p.RecordStatusValueId == activeRecordStatusValueId && p.IsEmailActive && p.Email != null && p.Email != string.Empty && p.EmailPreference == EmailPreference.EmailAllowed)
                                             .Select(p => p.Aliases.FirstOrDefault());
            var campusAttendeesPersonAliasIds = campusAttendeesPersonAlias.Select(a => a.Id);

            var previouslySyncedPersonAliasIds = new PersonAliasHistoryService(rockContext).GetPreviouslySyncedPersonAliasIds(campusAttendeesPersonAliasIds);
            var notYetSynced = SyncHelper.FindNotYetSyncedPersonAlises(rockContext, campusAttendeesPersonAliasIds, previouslySyncedPersonAliasIds);

            if (notYetSynced.Any())
            {
                SyncHelper.SyncContacts(notYetSynced, apiKey);
            }

            if (campusAttendeesPersonAlias.Any())
            {
                SyncHelper.EnsureValidPeopleOnly(campusAttendeesPersonAliasIds, listId.Value, apiKey);
                SyncHelper.AddPeopleToList(campusAttendeesPersonAlias, listId.Value, apiKey);
            }


            context.Result = "Campus synced successfully";
        }