Exemplo n.º 1
0
        public ContactSyncLogic(IOrganizationService organizationService, ITracingService trace)
        {
            orgService = organizationService;
            tracer     = trace;

            // Retrieve the Campaign Monitor Configuration record.
            ConfigurationService configService = new ConfigurationService(orgService, tracer);

            campaignMonitorConfig = configService.VerifyAndLoadConfig();
        }
Exemplo n.º 2
0
        public SyncHandler(IOrganizationService organizationService, ITracingService tracingService, Stopwatch executionTimer)
        {
            orgService = organizationService;
            trace      = tracingService;
            timer      = executionTimer;

            configService = new ConfigurationService(orgService, trace);
            trace.Trace("Loading configuration.");
            config = configService.VerifyAndLoadConfig();
        }
Exemplo n.º 3
0
        public SendMessageLogic(IOrganizationService organizationService, ITracingService trace)
        {
            orgService = organizationService;
            tracer     = trace;

            ConfigurationService configService = new ConfigurationService(orgService, tracer);

            campaignMonitorConfig = configService.VerifyAndLoadConfig();
            authDetails           = Authenticator.GetAuthentication(campaignMonitorConfig, orgService);
        }
Exemplo n.º 4
0
        private QueryExpression GetBulkSyncFilter(CampaignMonitorConfiguration config, BulkSyncData syncData, string primaryEmail)
        {
            // retrieve contacts based on the filter, grabbing the columns specified either
            // in the fields to sync (on config entity) or fields specified in the bulkdata sync fields
            QueryExpression viewFilter;

            if (config.SyncViewId != null && config.SyncViewId != Guid.Empty)
            {
                viewFilter = SharedLogic.GetConfigFilterQuery(orgService, config.SyncViewId);
            }
            else
            {
                // if no view filter, sync all active contacts
                viewFilter = new QueryExpression("contact");
                viewFilter.Criteria.AddCondition(
                    new ConditionExpression("statecode", ConditionOperator.Equal, 0));
            }

            viewFilter.ColumnSet.Columns.Clear();
            foreach (var link in viewFilter.LinkEntities)
            {
                link.Columns.Columns.Clear();
            }

            if (syncData.UpdatedFields != null && syncData.UpdatedFields.Length > 0)
            {
                viewFilter.ColumnSet.Columns.AddRange(syncData.UpdatedFields);
            }
            else
            {
                viewFilter.ColumnSet.Columns.AddRange(config.SyncFields);
            }

            // add required fields for syncing if they are not a part of the filter
            if (!viewFilter.ColumnSet.Columns.Contains(primaryEmail))
            {
                viewFilter.ColumnSet.Columns.Add(primaryEmail);
            }

            if (!viewFilter.ColumnSet.Columns.Contains("fullname"))
            {
                viewFilter.ColumnSet.Columns.Add("fullname");
            }

            viewFilter.AddOrder("modifiedon", OrderType.Ascending);
            viewFilter.PageInfo.Count = BATCH_AMOUNT;
            viewFilter.PageInfo.ReturnTotalRecordCount = true;

            return(viewFilter);
        }
        private IEnumerable <SyncView> GetContactViews(CampaignMonitorConfiguration config)
        {
            trace.Trace("Getting contact views.");
            var query = new QueryExpression("savedquery"); // system views

            query.ColumnSet = new ColumnSet("savedqueryid", "name");
            query.Criteria.AddCondition("returnedtypecode", ConditionOperator.Equal, 2); // contacts
            query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);        // active state
            query.Criteria.AddCondition("querytype", ConditionOperator.Equal, 0);        // application views

            var result = orgService.RetrieveMultiple(query);

            return(result.Entities.Select(e => new SyncView
            {
                ViewId = e.Id,
                ViewName = e.GetAttributeValue <string>("name"),
                IsSelected = (e.Id == config.SyncViewId)
            }).OrderBy(v => v.ViewName));
        }
        private IEnumerable <SyncField> GetContactFields(CampaignMonitorConfiguration config)
        {
            trace.Trace("Getting contact fields.");
            var metadataHelper = new MetadataHelper(orgService, trace);
            var attributes     = metadataHelper.GetEntityAttributes("contact");

            return(attributes
                   .Where(a => a.DisplayName != null)
                   .Where(a => a.IsValidForAdvancedFind.Value == true)
                   .Select(a => new SyncField
            {
                DisplayName = a.DisplayName?.UserLocalizedLabel?.Label,
                LogicalName = a.LogicalName,
                IsChecked = config.SyncFields.Contains(a.LogicalName) ||
                            (!config.SyncFields.Any() && RecommendedFields.Contains(a.LogicalName)),
                IsRecommended = RecommendedFields.Contains(a.LogicalName)
            })
                   .OrderBy(f => f.DisplayName));
        }
Exemplo n.º 7
0
        public static bool CheckEmailIsDuplicate(IOrganizationService orgService, CampaignMonitorConfiguration config, string primaryEmailField, string email)
        {
            QueryExpression query        = new QueryExpression("contact");
            QueryExpression configFilter = null;

            if (config.SyncViewId != null && config.SyncViewId != Guid.Empty)
            {
                configFilter   = GetConfigFilterQuery(orgService, config.SyncViewId);
                query.Criteria = configFilter.Criteria;
            }
            else
            {
                // if no filter on query then only select active contacts
                query.Criteria.AddCondition(new ConditionExpression("statecode", ConditionOperator.Equal, 0));
            }

            query.Criteria.AddCondition(new ConditionExpression(primaryEmailField, ConditionOperator.Equal, email));
            query.ColumnSet.AddColumn("contactid");
            query.TopCount = 2;

            return(orgService.RetrieveMultiple(query).TotalRecordCount > 1);
        }
        public string Execute(string serializedData)
        {
            trace.Trace("Deserializing input.");
            var userInput = JsonConvert.DeserializeObject <ConfigurationData>(serializedData);

            trace.Trace("Loading current configuration.");
            var oldConfig     = configService.VerifyAndLoadConfig();
            var auth          = Authenticator.GetAuthentication(oldConfig, orgService);
            var startBulkSync = false;

            var updatedConfig = new CampaignMonitorConfiguration
            {
                AccessToken        = oldConfig.AccessToken,
                RefreshToken       = oldConfig.RefreshToken,
                BulkSyncInProgress = userInput.BulkSyncInProgress,
                ClientId           = userInput.Clients.First().ClientID,
                ClientName         = userInput.Clients.First().Name,
                Id                  = string.IsNullOrWhiteSpace(userInput.Id) ? Guid.Empty : new Guid(userInput.Id),
                ListId              = userInput.Lists.First().ListID,
                ListName            = userInput.Lists.First().Name,
                SyncDuplicateEmails = userInput.SyncDuplicateEmails,
                SubscriberEmail     = (SubscriberEmailValues)userInput.SubscriberEmail,
                SyncFields          = userInput.Fields.Select(f => f.LogicalName),
                SyncViewId          = userInput.Views != null?userInput.Views.First().ViewId   : Guid.Empty,
                SyncViewName        = userInput.Views != null?userInput.Views.First().ViewName : null
            };

            if (string.IsNullOrEmpty(updatedConfig.ListId))
            {
                // create a new list
                trace.Trace("Creating new list {0}", updatedConfig.ListName);
                updatedConfig.ListId = List.Create(auth, updatedConfig.ClientId, updatedConfig.ListName, null, userInput.ConfirmedOptIn, null, UnsubscribeSetting.OnlyThisList);
            }

            configService.SaveConfig(updatedConfig);

            var metadata = new MetadataHelper(orgService, trace);

            if (oldConfig != null &&
                oldConfig.ClientId == updatedConfig.ClientId &&
                oldConfig.ListId == updatedConfig.ListId)
            {
                var cmService     = new CampaignMonitorService(updatedConfig, orgService);
                var attributes    = metadata.GetEntityAttributes("contact");
                var newFields     = updatedConfig.SyncFields.Except(oldConfig.SyncFields);
                var removedFields = oldConfig.SyncFields.Except(updatedConfig.SyncFields);

                startBulkSync = newFields.Any(); // don't need to do the bulk sync if fields have only been removed.

                // create new custom fields
                var createdKeys = new List <string>();
                foreach (var fieldName in newFields)
                {
                    var attribute = attributes
                                    .Where(a => a.LogicalName == fieldName)
                                    .First();

                    var displayName = attribute.DisplayName.UserLocalizedLabel.Label;
                    trace.Trace("Creating new field {0}", displayName);
                    var dataType = MapDynamicsTypeToCampmonType(attribute.AttributeType.Value);
                    try
                    {
                        var newKey = cmService.CreateCustomField(updatedConfig.ListId, displayName, dataType);
                        createdKeys.Add(newKey);
                    }
                    catch (CreatesendException ex)
                    {
                        createdKeys.ForEach(k => cmService.DeleteCustomField(updatedConfig.ListId, k));
                        throw;
                    }
                }
                // delete removed custom fields
                foreach (var fieldName in removedFields)
                {
                    var attribute = attributes
                                    .Where(a => a.LogicalName == fieldName)
                                    .First();

                    var displayName = attribute.DisplayName.UserLocalizedLabel.Label;
                    trace.Trace("Deleting field {0}", displayName);
                    cmService.DeleteCustomField(updatedConfig.ListId, displayName);
                }
            }
            else
            {
                startBulkSync = true;

                var cmService = new CampaignMonitorService(updatedConfig, orgService);
                // create all custom fields
                var attributes  = metadata.GetEntityAttributes("contact");
                var createdKeys = new List <string>();
                foreach (var syncField in userInput.Fields)
                {
                    var attribute = attributes
                                    .Where(a => a.LogicalName == syncField.LogicalName)
                                    .First();

                    var displayName = attribute.DisplayName.UserLocalizedLabel.Label;
                    trace.Trace("Creating new field {0}", displayName);
                    var dataType = MapDynamicsTypeToCampmonType(attribute.AttributeType.Value);
                    try
                    {
                        var newKey = cmService.CreateCustomField(updatedConfig.ListId, displayName, dataType);
                        createdKeys.Add(newKey);
                    }
                    catch (CreatesendException ex)
                    {
                        createdKeys.ForEach(k => cmService.DeleteCustomField(updatedConfig.ListId, k));
                        throw;
                    }
                }
            }


            // if updatedConfig doesn't have an Id, it was a new config.
            // it was already saved above, so reload to get the Id
            if (updatedConfig.Id == Guid.Empty)
            {
                updatedConfig = configService.VerifyAndLoadConfig();
            }

            if (startBulkSync)
            {
                ExecuteWorkflowRequest workFlowReq = new ExecuteWorkflowRequest
                {
                    WorkflowId = BULK_SYNC_WORKFLOW_ID,
                    EntityId   = updatedConfig.Id
                };

                ExecuteWorkflowResponse workflowResp = (ExecuteWorkflowResponse)orgService.Execute(workFlowReq);
                return("bulksync");
            }

            return("saved");
        }