Пример #1
0
 public RequestHandler(SubscriptionsContext dbContext, UserContext userContext, IStripeService stripeService, ILogger <RequestHandler> logger)
 {
     _dbContext     = dbContext;
     _userContext   = userContext;
     _stripeService = stripeService;
     _logger        = logger;
 }
Пример #2
0
        public void ShouldSubscribeForTopics()
        {
            //Arrange
            const string user = "******";
            const int    expectedSubscriptions = 2;
            const int    expectedUsers         = 1;
            Guid         resultToken;

            //Act
            using (var context = new SubscriptionsContext(options))
            {
                var service = new SubscriptionService(context);
                resultToken = service.SubscribeAsync(user, new [] { 1, 3 }).Result;
            }

            //Assert
            using (var context = new SubscriptionsContext(options))
            {
                Assert.AreEqual(expectedSubscriptions, context.Subscriptions.Count());
                Assert.AreEqual(expectedUsers, context.Users.Count());
                Assert.AreNotEqual(Guid.Empty, resultToken);
            }

            //TODO: Values of the records should be checked as well
        }
Пример #3
0
 public SubscriptionChangedEventHandler(SubscriptionsContext dbContext, IStripeService stripeService, IOptions <StripeSettings> settings, ILogger <SubscriptionChangedEventHandler> logger)
 {
     _dbContext      = dbContext;
     _stripeService  = stripeService;
     _stripeSettings = settings.Value;
     _logger         = logger;
 }
Пример #4
0
 public RequestHandler(SubscriptionsContext dbContext, UserContext userContext, IStripeService stripeService, IOptions <StripeSettings> settings, ILogger <RequestHandler> logger)
 {
     _dbContext     = dbContext;
     _userContext   = userContext;
     _stripeService = stripeService;
     _logger        = logger;
     _settings      = settings.Value;
 }
Пример #5
0
        public UserContext(SubscriptionsContext dbContext)
        {
            var user = dbContext.ApplicationUser.SingleOrDefault(e => e.Id == Guid.Parse("07b742cc-8c82-43b6-8615-de54635db929"));

            if (user != null)
            {
                Id           = user.Id;
                EmailAddress = user.EmailAddress;
                CustomerId   = user.CustomerId;
            }
        }
Пример #6
0
        public static async Task <bool> UserHasPlanAsync(SubscriptionsContext subscriptionsContext, string userId)
        {
            if (userId is null)
            {
                throw new System.ArgumentNullException(nameof(userId));
            }

            var hasActiveSubscription = await subscriptionsContext.Subscription
                                        .AnyAsync(x => x.Customer.IdentityKey == userId && x.Status.Id == SubscriptionStatus.Active.Id);

            return(hasActiveSubscription);
        }
Пример #7
0
        public void TestInitialize()
        {
            this.options = new DbContextOptionsBuilder <SubscriptionsContext>()
                           .UseInMemoryDatabase(databaseName: "SubscriptionsTest").Options;

            using (var context = new SubscriptionsContext(options))
            {
                context.Topics.AddRange(new List <Topic>
                {
                    new Topic {
                        TopicId = 1, DisplayName = "topic one"
                    },
                    new Topic {
                        TopicId = 2, DisplayName = "topic two"
                    },
                    new Topic {
                        TopicId = 3, DisplayName = "topic three"
                    }
                });
                context.SaveChanges();
            }
        }
Пример #8
0
 public TopicsService(SubscriptionsContext dbContext)
 {
     this.dbContext = dbContext;
 }
Пример #9
0
 public RequestHandler(SubscriptionsContext dbContext, UserContext userContext, ILogger <RequestHandler> logger)
 {
     _dbContext   = dbContext;
     _userContext = userContext;
     _logger      = logger;
 }
Пример #10
0
 public TopicsController(SubscriptionsContext dbContext, ITopicsService topicsService)
 {
     this.topicsService = topicsService;
 }
Пример #11
0
 public RequestHandler(SubscriptionsContext dbContext, UserContext userContext)
 {
     _dbContext   = dbContext;
     _userContext = userContext;
 }
Пример #12
0
        public static async Task <Subscription> ExecAsync(SubscriptionsContext dbContext, IStripeService stripeService, string subscriptionId, StripeSettings settings, ILogger logger)
        {
            logger.LogInformation("Processing EnsureSubscriptionCommand for {StripeSubscriptionId}", subscriptionId);

            var subscription = await dbContext.Subscription.FirstOrDefaultAsync(e => e.ExternalKey == subscriptionId);

            var stripeSubscription = await stripeService.GetSubscriptionAsync(subscriptionId);

            await semaphoreSlim.WaitAsync();

            try
            {
                hasSubscription = subscription != null;

                if (!hasSubscription)
                {
                    subscription = await dbContext.Subscription.FirstOrDefaultAsync(e => e.ExternalKey == subscriptionId);

                    hasSubscription = subscription != null;

                    if (!hasSubscription)
                    {
                        logger.LogWarning("Creating subscription while processing EnsureSubscriptionCommand for {StripeSubscriptionId}", subscriptionId);

                        var customer = await dbContext.Customer.FirstOrDefaultAsync(e => e.ExternalKey == stripeSubscription.CustomerId);

                        var plan = await dbContext.Plan.FirstOrDefaultAsync(x => x.ExternalKey == settings.DefaultPlanKey);

                        subscription = new Subscription(subscriptionId, plan);

                        customer.AddSubscription(subscription);

                        dbContext.Subscription.Add(subscription);

                        hasSubscription = true;
                    }
                }

                var status = SubscriptionStatus.FindByName(stripeSubscription.Status);
                dbContext.Entry(status).State = EntityState.Unchanged;

                subscription.CurrentPeriodStart   = stripeSubscription.CurrentPeriodStart;
                subscription.CurrentPeriodEnd     = stripeSubscription.CurrentPeriodEnd;
                subscription.CancelAtPeriodEnd    = stripeSubscription.CancelAtPeriodEnd;
                subscription.Status               = status;
                subscription.LastModifiedDateTime = DateTime.Now;

                await dbContext.SaveChangesAsync();

                logger.LogInformation("Finished processing EnsureSubscriptionCommand for {StripeSubscriptionId} with {ApplicationSubscriptionId}", subscriptionId, subscription.Id);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "Error while processing EnsureSubscriptionCommand for {StripeSubscriptionId}", subscriptionId);
            }
            finally
            {
                semaphoreSlim.Release();
            }

            return(subscription);
        }
Пример #13
0
        public static async Task <Invoice> ExecAsync(SubscriptionsContext dbContext, IStripeService stripeService, string invoiceId, ILogger logger)
        {
            logger.LogInformation("Processing EnsureInvoiceCommand for {StripeInvoiceId}", invoiceId);

            var invoice = await dbContext.Invoice.FirstOrDefaultAsync(e => e.ExternalKey == invoiceId);

            var stripeInvoice = await stripeService.GetInvoiceAsync(invoiceId);

            await semaphoreSlim.WaitAsync();

            try
            {
                hasInvoice = invoice != null;

                if (!hasInvoice)
                {
                    logger.LogWarning("Creating invoice while processing EnsureInvoiceCommand for {StripeInvoiceId}", invoiceId);

                    invoice = await dbContext.Invoice.FirstOrDefaultAsync(e => e.ExternalKey == invoiceId);

                    hasInvoice = invoice != null;

                    if (!hasInvoice)
                    {
                        logger.LogInformation("Creating invoice for {StripeInvoiceId}", invoiceId);

                        var subscription = await dbContext.Subscription
                                           .Include(x => x.Customer)
                                           .FirstOrDefaultAsync(e => e.ExternalKey == stripeInvoice.SubscriptionId);

                        invoice = subscription.AddInvoice(invoiceId, subscription.Customer.Id, stripeInvoice.Number);

                        dbContext.Invoice.Add(invoice);

                        hasInvoice = true;
                    }
                }

                var status = InvoiceStatus.FindByName(stripeInvoice.Status);
                dbContext.Entry(status).State = EntityState.Unchanged;

                invoice.AmountRemainingInCents = (int)stripeInvoice.AmountRemaining;
                invoice.AmountDueInCents       = (int)stripeInvoice.AmountDue;
                invoice.AmountPaidInCents      = (int)stripeInvoice.AmountPaid;
                invoice.CurrencyCode           = stripeInvoice.Currency;
                invoice.HostedInvoiceUrl       = stripeInvoice.HostedInvoiceUrl;
                invoice.InvoicePdfUrl          = stripeInvoice.InvoicePdf;
                invoice.IsPaid        = stripeInvoice.Paid;
                invoice.ReceiptNumber = stripeInvoice.ReceiptNumber;
                invoice.PeriodStart   = stripeInvoice.PeriodStart;
                invoice.PeriodEnd     = stripeInvoice.PeriodEnd;
                invoice.Total         = (int)stripeInvoice.Total;

                invoice.Status = status;
                invoice.LastModifiedDateTime = DateTime.Now;

                await dbContext.SaveChangesAsync();

                logger.LogInformation("Finished processing EnsureInvoiceCommand for {StripeInvoiceId} with {ApplicationInvoiceId} and {StripeSubscriptionId}", invoiceId, invoice.Id, stripeInvoice.SubscriptionId);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "Error while processing EnsureInvoiceCommand for {StripeInvoiceId}", invoiceId);
            }
            finally
            {
                semaphoreSlim.Release();
            }

            return(invoice);
        }
Пример #14
0
 public CheckoutSessionCompletedEventHandler(SubscriptionsContext dbContext, ILogger <CheckoutSessionCompletedEventHandler> logger)
 {
     _dbContext = dbContext;
     _logger    = logger;
 }
Пример #15
0
 public SubscriptionController(SubscriptionsContext context, ILogger <SubscriptionController> logger)
 {
     _context = context;
     _logger  = logger;
 }