Ejemplo n.º 1
0
 public SubscriptionService(IUserManager <GearUser> userManager, ISubscriptionDbContext subscriptionDbContext, IOrderProductService <Order> orderService, IPaymentService paymentService, INotify <GearRole> notify)
 {
     _userManager           = userManager;
     _subscriptionDbContext = subscriptionDbContext;
     _orderService          = orderService;
     _paymentService        = paymentService;
     _notify = notify;
 }
        public void Unsubscribe(Address client, IEnumerable <MessageType> messageTypes)
        {
            Logger.Debug("Unsubscribe called");

            if (client == null)
            {
                Logger.Debug("Client is null!  Throwing");
                throw new ArgumentNullException("client");
            }

            if (messageTypes == null)
            {
                Logger.Debug("MessageTypes is null!  Throwing");
                throw new ArgumentNullException("messageTypes");
            }

            using (ISubscriptionDbContext dbc = _dbContextFactory.CreateSubscriptionDbContext())
                using (DbContextTransaction transaction = dbc.Database.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    try
                    {
                        string        clientAddress      = client.ToString();
                        List <string> messageTypeStrings = messageTypes.Select(mt => mt.ToString()).ToList();

                        Logger.DebugFormat("Finding existing subscriptions for message types requested of {0}", clientAddress);
                        List <SubscriptionEntity> existing = dbc.Subscriptions.Where(
                            s => s.SubscriberEndpoint == clientAddress &&
                            messageTypeStrings.Contains(s.MessageType))
                                                             .ToList();

                        Logger.DebugFormat("{0} subscription(s) found, removing them.", existing.Count);
                        dbc.Subscriptions.RemoveRange(existing);

                        Logger.Debug("Saving changes and committing transaction.");
                        dbc.SaveChanges();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("Some error happened while removing subscriptions", ex);
                        transaction.Rollback();
                        throw;
                    }
                }
        }
        public IEnumerable <Address> GetSubscriberAddressesForMessage(IEnumerable <MessageType> messageTypes)
        {
            Logger.Debug("Getting subscriber addresses for message types");

            if (messageTypes == null)
            {
                Logger.Debug("Message types are null! Throwing argument null exception.");
                throw new ArgumentNullException("messageTypes");
            }

            MessageType[] mtArray = messageTypes as MessageType[] ?? messageTypes.ToArray();
            if (!mtArray.Any())
            {
                Logger.Debug("Message types list is empty, returning empty address list.");
                return(new List <Address>());
            }

            List <string> messageTypeStrings = mtArray.Select(mt => mt.ToString()).ToList();

            Logger.DebugFormat(
                "Message types are {0}.",
                string.Join(",", messageTypeStrings));

            using (ISubscriptionDbContext dbc = _dbContextFactory.CreateSubscriptionDbContext())
                using (DbContextTransaction transaction = dbc.Database.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    Logger.Debug("Querying for subscriptions with message types.");
                    var subscriptions = dbc.Subscriptions
                                        .Where(s => messageTypeStrings.Contains(s.MessageType))
                                        .ToList();
                    Logger.DebugFormat("{0} subscription(s) found.", subscriptions.Count);

                    Logger.Debug("Getting addresses for found subscriptions.");
                    List <Address> results = subscriptions
                                             .Select(s => Address.Parse(s.SubscriberEndpoint))
                                             .Distinct()
                                             .ToList();

                    Logger.Debug("Committing transaction and returning addresses.");
                    transaction.Commit();
                    return(results);
                }
        }
        public void Subscribe(Address client, IEnumerable <MessageType> messageTypes)
        {
            Logger.Debug("Subscribe called");

            if (client == null)
            {
                Logger.Debug("Client is null!  Throwing");
                throw new ArgumentNullException("client");
            }

            if (messageTypes == null)
            {
                Logger.Debug("Message types is null!  Throwing");
                throw new ArgumentNullException("messageTypes");
            }

            string                    clientAddress      = client.ToString();
            List <string>             messageTypeStrings = new List <string>();
            List <SubscriptionEntity> subscriptions      = new List <SubscriptionEntity>();

            foreach (MessageType mt in messageTypes.Distinct())
            {
                string messageTypeString = mt.ToString();

                Logger.DebugFormat("Adding message type {0} to {1}.", messageTypeString, clientAddress);

                messageTypeStrings.Add(messageTypeString);
                subscriptions.Add(
                    new SubscriptionEntity
                {
                    SubscriberEndpoint = clientAddress,
                    MessageType        = messageTypeString
                });
            }

            using (ISubscriptionDbContext dbc = _dbContextFactory.CreateSubscriptionDbContext())
                using (DbContextTransaction transaction = dbc.Database.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    try
                    {
                        Logger.DebugFormat("Gathering subscriptions for {0} and any of the requested message types.", clientAddress);
                        var existing = dbc.Subscriptions.Where(
                            s => s.SubscriberEndpoint == clientAddress &&
                            messageTypeStrings.Contains(s.MessageType));

                        foreach (var subscription in subscriptions)
                        {
                            if (existing.Any(s => s.MessageType == subscription.MessageType))
                            {
                                Logger.DebugFormat("{0} already is subscribed to {1}", clientAddress, subscription.MessageType);
                                continue;
                            }

                            Logger.DebugFormat(
                                "{0} doesn't yet have {1}.  Subscribing...",
                                clientAddress,
                                subscription.MessageType);
                            dbc.Subscriptions.Add(subscription);
                        }

                        Logger.Debug("Saving changes and committing transaction.");
                        dbc.SaveChanges();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("Some error happened while saving subscriptions", ex);
                        transaction.Rollback();
                        throw;
                    }
                }
        }