public void UpdatePersonLists_2Changes_NonInSubscription_NothingAddedInSubscription_And_NoNotificationCreated(string municipalityCode)
        {
            var dce = new DataChangeEvent[] {
                new DataChangeEvent()
                {
                    PersonRegistrationId = Guid.NewGuid(), DueDate = DateTime.Now, ReceivedDate = DateTime.Now, PersonUuid = Guid.NewGuid(), DataChangeEventId = Guid.NewGuid()
                },
                new DataChangeEvent()
                {
                    PersonRegistrationId = Guid.NewGuid(), DueDate = DateTime.Now, ReceivedDate = DateTime.Now, PersonUuid = Guid.NewGuid(), DataChangeEventId = Guid.NewGuid()
                }
            };

            var sub = Utils.CreateCriteriaSubscription(municipalityCode);

            using (var dataContext = new EventBrokerDataContext())
            {
                dataContext.DataChangeEvents.InsertAllOnSubmit(dce);
                dataContext.Subscriptions.InsertOnSubmit(sub);
                dataContext.SubmitChanges();
            }
            using (var dataContext = new EventBrokerDataContext())
            {
                int records            = dataContext.UpdatePersonLists(DateTime.Now, (int)Data.SubscriptionType.SubscriptionTypes.DataChange);
                var subscriptionPerson = dataContext.SubscriptionPersons.Where(sp => sp.SubscriptionId == sub.SubscriptionId).SingleOrDefault();
                Assert.Null(subscriptionPerson);

                var notif = dataContext.EventNotifications.Where(en => en.SubscriptionId == sub.SubscriptionId).SingleOrDefault();
                Assert.Null(notif);
            }
        }
        /// <summary>
        /// Deletes the given subscription from the database
        /// </summary>
        /// <param name="subscriptionId"></param>
        /// <param name="subscriptionType"></param>
        /// <returns></returns>
        private bool DeleteSubscription(Guid subscriptionId, CprBroker.EventBroker.Data.SubscriptionType.SubscriptionTypes subscriptionType)
        {
            // Find the Subscription object and delete it and its children
            using (EventBrokerDataContext dataContext = new EventBrokerDataContext())
            {
                System.Data.Linq.DataLoadOptions loadOptions = new System.Data.Linq.DataLoadOptions();
                Subscription.SetLoadOptionsForChildren(loadOptions);
                dataContext.LoadOptions = loadOptions;

                var subscription = (from sub in dataContext.Subscriptions
                                    where sub.SubscriptionId == subscriptionId && !sub.Deactivated.HasValue && sub.SubscriptionTypeId == (int)subscriptionType
                                    select sub
                                    ).SingleOrDefault();

                if (subscription != null)
                {
                    subscription.Deactivated = DateTime.Now;
                    dataContext.SubmitChanges();
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
        /// <summary>
        /// Adds a new Subscription object to the <paramref name="dataContext"/>
        /// This method inserts rows in Subscription, Channel (and children) and  SubscriptionPerson
        /// A later call to SubmitChanges() is required to save to the database
        /// </summary>
        /// <param name="dataContext"></param>
        /// <param name="subscriptionType"></param>
        /// <param name="applicationId"></param>
        /// <param name="PersonCivilRegistrationIdentifiers"></param>
        /// <param name="notificationChannel"></param>
        /// <returns></returns>
        private Subscription AddSubscription(EventBrokerDataContext dataContext, CprBroker.EventBroker.Data.SubscriptionType.SubscriptionTypes subscriptionType, Guid applicationId, ChannelBaseType notificationChannel, Guid[] personUuids, SoegObjektType soegObject)
        {
            List <Guid> listOfPersonsIDs = new List <Guid>();

            Subscription subscription = new Subscription();

            subscription.SubscriptionId     = Guid.NewGuid();
            subscription.SubscriptionTypeId = (int)subscriptionType;
            subscription.ApplicationId      = applicationId;
            subscription.Created            = DateTime.Now;
            if (soegObject != null)
            {
                var xml = Strings.SerializeObject(soegObject);
                subscription.Criteria        = System.Xml.Linq.XElement.Load(new StringReader(xml));
                subscription.LastCheckedUUID = Guid.Empty;
            }


            #region Set IsForAllPersons
            if (personUuids != null && personUuids.Length > 0)
            {
                subscription.IsForAllPersons = false;
            }
            else
            {
                subscription.IsForAllPersons = true;
            }
            #endregion

            #region Set the channel
            var dbChannel = Channel.FromXmlType(notificationChannel);
            subscription.Channels.Add(dbChannel);
            #endregion

            // Mark the new objects to be inserted later
            dataContext.Subscriptions.InsertOnSubmit(subscription);

            if (!subscription.IsForAllPersons && personUuids != null)
            {
                dataContext.SubscriptionPersons.InsertAllOnSubmit(
                    from PersonUuid in personUuids
                    select new SubscriptionPerson()
                {
                    SubscriptionPersonId = Guid.NewGuid(), SubscriptionId = subscription.SubscriptionId, PersonUuid = PersonUuid, Created = subscription.Created
                }
                    );
            }
            dataContext.Channels.InsertOnSubmit(dbChannel);

            return(subscription);
        }
 public static void ClearDatabase()
 {
     using (var dataContext = new EventBrokerDataContext())
     {
         dataContext.BirthdateEventNotifications.DeleteAllOnSubmit(dataContext.BirthdateEventNotifications);
         dataContext.BirthdateSubscriptions.DeleteAllOnSubmit(dataContext.BirthdateSubscriptions);
         dataContext.DataChangeEvents.DeleteAllOnSubmit(dataContext.DataChangeEvents);
         dataContext.DataSubscriptions.DeleteAllOnSubmit(dataContext.DataSubscriptions);
         dataContext.EventNotifications.DeleteAllOnSubmit(dataContext.EventNotifications);
         dataContext.SubscriptionCriteriaMatches.DeleteAllOnSubmit(dataContext.SubscriptionCriteriaMatches);
         dataContext.SubscriptionPersons.DeleteAllOnSubmit(dataContext.SubscriptionPersons);
         //dataContext.Subscriptions.DeleteAllOnSubmit(dataContext.Subscriptions);
         dataContext.SubmitChanges();
     }
 }
 /// <summary>
 /// Interface implementation
 /// </summary>
 public ChangeSubscriptionType Subscribe(ChannelBaseType notificationChannel, Guid[] personUuids)
 {
     using (EventBrokerDataContext dataContext = new EventBrokerDataContext())
     {
         Data.Subscription subscription = AddSubscription(dataContext, Data.SubscriptionType.SubscriptionTypes.DataChange, CprBroker.Engine.BrokerContext.Current.ApplicationId.Value, notificationChannel, personUuids, null);
         if (subscription != null)
         {
             subscription.DataSubscription = new DataSubscription();
         }
         dataContext.SubmitChanges();
         if (subscription != null)
         {
             // Now get the subscription from the database to make sure everything is OK
             return(GetActiveSubscriptionsList(subscription.SubscriptionId).SingleOrDefault() as ChangeSubscriptionType);
         }
     }
     return(null);
 }
 /// <summary>
 /// Interface implementation
 /// </summary>
 public ChangeSubscriptionType SubscribeOnCriteria(ChannelBaseType notificationChannel, SoegObjektType criteria)
 {
     using (EventBrokerDataContext dataContext = new EventBrokerDataContext())
     {
         /*
          * For now we assign this data type as a data change type.
          */
         Data.Subscription subscription = AddSubscription(dataContext, Data.SubscriptionType.SubscriptionTypes.DataChange /* May be changed later */, CprBroker.Engine.BrokerContext.Current.ApplicationId.Value, notificationChannel, new Guid[0], criteria);
         if (subscription != null)
         {
             subscription.DataSubscription = new DataSubscription();
         }
         dataContext.SubmitChanges();
         if (subscription != null)
         {
             // Now get the subscription from the database to make sure everything is OK
             return(GetActiveSubscriptionsList(subscription.SubscriptionId).SingleOrDefault() as ChangeSubscriptionType);
         }
     }
     return(null);
 }
        /// <summary>
        /// Interface implementation
        /// </summary>
        public BirthdateSubscriptionType SubscribeOnBirthdate(ChannelBaseType notificationChannel, Nullable <int> years, int priorDays, Guid[] personUuids)
        {
            using (EventBrokerDataContext dataContext = new EventBrokerDataContext())
            {
                Data.Subscription subscription = AddSubscription(dataContext, Data.SubscriptionType.SubscriptionTypes.Birthdate, CprBroker.Engine.BrokerContext.Current.ApplicationId.Value, notificationChannel, personUuids, null);
                if (subscription != null)
                {
                    subscription.BirthdateSubscription           = new BirthdateSubscription();
                    subscription.BirthdateSubscription.AgeYears  = years;
                    subscription.BirthdateSubscription.PriorDays = priorDays;
                }

                dataContext.SubmitChanges();
                if (subscription != null)
                {
                    // Now get the subscription from the database to make sure everything is OK
                    return(GetActiveSubscriptionsList(subscription.SubscriptionId).SingleOrDefault() as BirthdateSubscriptionType);
                }
            }
            return(null);
        }
        public void UpdatePersonLists_2Changes_1MovingIn_PersonAdded(string municipalityCode)
        {
            var dce = new DataChangeEvent[] {
                new DataChangeEvent()
                {
                    PersonRegistrationId = Guid.NewGuid(), DueDate = DateTime.Now, ReceivedDate = DateTime.Now, PersonUuid = Guid.NewGuid(), DataChangeEventId = Guid.NewGuid()
                },
                new DataChangeEvent()
                {
                    PersonRegistrationId = Guid.NewGuid(), DueDate = DateTime.Now, ReceivedDate = DateTime.Now, PersonUuid = Guid.NewGuid(), DataChangeEventId = Guid.NewGuid()
                }
            };

            var sub = Utils.CreateCriteriaSubscription(municipalityCode);

            sub.SubscriptionCriteriaMatches.Add(new SubscriptionCriteriaMatch()
            {
                SubscriptionCriteriaMatchId = Guid.NewGuid(), DataChangeEvent = dce[0]
            });

            using (var dataContext = new EventBrokerDataContext())
            {
                dataContext.DataChangeEvents.InsertAllOnSubmit(dce);
                dataContext.Subscriptions.InsertOnSubmit(sub);
                dataContext.SubmitChanges();
            }
            using (var dataContext = new EventBrokerDataContext())
            {
                int records             = dataContext.UpdatePersonLists(DateTime.Now, (int)Data.SubscriptionType.SubscriptionTypes.DataChange);
                var subscriptionPersons = dataContext.SubscriptionPersons.Where(sp => sp.SubscriptionId == sub.SubscriptionId && sp.Removed == null).ToArray();
                Assert.AreEqual(1, subscriptionPersons.Length);
                Assert.Null(subscriptionPersons[0].Removed);

                var notif = dataContext.EventNotifications.Where(en => en.SubscriptionId == sub.SubscriptionId).SingleOrDefault();
                Assert.Null(notif);
            }
        }
        public void UpdatePersonLists_2Changes_1MovingOut_PersonRemovedAndNotoficationAdded(string municipalityCode)
        {
            var dce = new DataChangeEvent[] {
                new DataChangeEvent()
                {
                    PersonRegistrationId = Guid.NewGuid(), DueDate = DateTime.Now, ReceivedDate = DateTime.Now, PersonUuid = Guid.NewGuid(), DataChangeEventId = Guid.NewGuid()
                },
                new DataChangeEvent()
                {
                    PersonRegistrationId = Guid.NewGuid(), DueDate = DateTime.Now, ReceivedDate = DateTime.Now, PersonUuid = Guid.NewGuid(), DataChangeEventId = Guid.NewGuid()
                }
            };

            var sub = Utils.CreateCriteriaSubscription(municipalityCode);

            sub.SubscriptionPersons.Add(new SubscriptionPerson()
            {
                SubscriptionPersonId = Guid.NewGuid(), PersonUuid = dce[0].PersonUuid, Created = DateTime.Now, Removed = null
            });

            using (var dataContext = new EventBrokerDataContext())
            {
                dataContext.DataChangeEvents.InsertAllOnSubmit(dce);
                dataContext.Subscriptions.InsertOnSubmit(sub);
                dataContext.SubmitChanges();
            }
            using (var dataContext = new EventBrokerDataContext())
            {
                int records            = dataContext.UpdatePersonLists(DateTime.Now, (int)Data.SubscriptionType.SubscriptionTypes.DataChange);
                var subscriptionPerson = dataContext.SubscriptionPersons.Where(sp => sp.SubscriptionId == sub.SubscriptionId).Single();
                Assert.NotNull(subscriptionPerson.Removed);

                var notif = dataContext.EventNotifications.Where(en => en.SubscriptionId == sub.SubscriptionId).Single();
                Assert.NotNull(notif.IsLastNotification);
                Assert.True(notif.IsLastNotification.Value);
            }
        }
        /// <summary>
        /// Retrieves the subscriptions that match the supplied criteria
        /// </summary>
        /// <param name="subscriptionId"></param>
        /// <returns></returns>
        private CprBroker.Schemas.Part.SubscriptionType[] GetActiveSubscriptionsList(Nullable <Guid> subscriptionId)
        {
            List <CprBroker.Schemas.Part.SubscriptionType> listType = new List <CprBroker.Schemas.Part.SubscriptionType>();

            using (EventBrokerDataContext context = new EventBrokerDataContext())
            {
                System.Data.Linq.DataLoadOptions loadOptions = new System.Data.Linq.DataLoadOptions();
                Subscription.SetLoadOptionsForChildren(loadOptions);
                context.LoadOptions = loadOptions;

                // Create basic LINQ expression
                System.Linq.Expressions.Expression <Func <IQueryable <Subscription> > > exp =
                    () =>
                    from sub in context.Subscriptions
                    where sub.ApplicationId == CprBroker.Engine.BrokerContext.Current.ApplicationId
                    select sub;

                // Add filter for subscription id (if required)
                IQueryable <Subscription> subscriptions;
                if (subscriptionId.HasValue)
                {
                    subscriptions = exp.Compile()().Where((Subscription sub) => sub.SubscriptionId == subscriptionId);
                }
                else
                {
                    subscriptions = exp.Compile()();
                }

                // Now create list of OIO subscriptions
                foreach (var sub in subscriptions)
                {
                    CprBroker.Schemas.Part.SubscriptionType subscriptionType = sub.ToOioSubscription(CprBroker.Engine.BrokerContext.Current.ApplicationToken);
                    listType.Add(subscriptionType);
                }
                return(listType.ToArray());
            }
        }