public async Task <IActionResult> UpdateSubscription(
            UpdateSubscriptionViewModel model,
            CancellationToken cancellationToken)
        {
            var requestId     = Guid.NewGuid();
            var correlationId = Guid.NewGuid();

            if ((await this.fulfillmentClient.GetSubscriptionOperationsAsync(
                     model.SubscriptionId,
                     requestId,
                     correlationId,
                     cancellationToken))
                .Any(o => o.Status == OperationStatusEnum.InProgress))
            {
                return(this.RedirectToAction("Index"));
            }
            var updateResult = await this.fulfillmentClient.UpdateSubscriptionPlanAsync(
                model.SubscriptionId,
                model.NewPlan,
                requestId,
                correlationId,
                cancellationToken);

            return(updateResult.Success ? this.RedirectToAction("Index") : this.Error());
        }
Example #2
0
        public async Task <IActionResult> UpdateSubscription(
            UpdateSubscriptionViewModel model,
            CancellationToken cancellationToken)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var pendingOperations = await this.marketplaceClient.SubscriptionOperations.ListOperationsAsync(
                model.SubscriptionId,
                null,
                null,
                cancellationToken).ConfigureAwait(false);

            if (pendingOperations.Operations.Any(o => o.Status == OperationStatusEnum.InProgress))
            {
                return(this.RedirectToAction("Index"));
            }

            var updateResult = await this.marketplaceClient.FulfillmentOperations.UpdateSubscriptionAsync(
                model.SubscriptionId,
                null,
                null,
                model.NewPlan,
                null,
                cancellationToken).ConfigureAwait(false);

            await this.operationsStore.RecordAsync(model.SubscriptionId, updateResult.OperationId, cancellationToken).ConfigureAwait(false);

            return(this.RedirectToAction("Index"));
        }
Example #3
0
        /// <summary>
        /// Actions on a subscription.
        /// </summary>
        /// <param name="subscriptionId">Subscription ID.</param>
        /// <param name="subscriptionAction">Action to take.</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        /// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
        public async Task <IActionResult> SubscriptionAction(
            Guid subscriptionId,
            ActionsEnum subscriptionAction,
            CancellationToken cancellationToken)
        {
            switch (subscriptionAction)
            {
            case ActionsEnum.Activate:
                break;

            case ActionsEnum.Update:
                var availablePlans = await this.marketplaceClient.FulfillmentOperations.ListAvailablePlansAsync(
                    subscriptionId,
                    null,
                    null,
                    cancellationToken).ConfigureAwait(false);

                var subscription = await this.marketplaceClient.FulfillmentOperations.GetSubscriptionAsync(
                    subscriptionId,
                    null,
                    null,
                    cancellationToken).ConfigureAwait(false);

                var pendingOperations = await this.marketplaceClient.SubscriptionOperations.ListOperationsAsync(
                    subscriptionId,
                    null,
                    null,
                    cancellationToken).ConfigureAwait(false);

                var updateSubscriptionViewModel = new UpdateSubscriptionViewModel
                {
                    SubscriptionId    = subscriptionId,
                    SubscriptionName  = subscription.Name,
                    CurrentPlan       = subscription.PlanId,
                    AvailablePlans    = availablePlans.Plans,
                    PendingOperations = pendingOperations.Operations.Any(
                        o => o.Status == OperationStatusEnum.InProgress),
                };

                return(this.View("UpdateSubscription", updateSubscriptionViewModel));

            case ActionsEnum.Ack:
                break;

            case ActionsEnum.Unsubscribe:
                await this.marketplaceClient.FulfillmentOperations.DeleteSubscriptionAsync(
                    subscriptionId,
                    null,
                    null,
                    cancellationToken).ConfigureAwait(false);

                return(this.RedirectToAction("Index"));

            default:
                throw new ArgumentOutOfRangeException(nameof(subscriptionAction), subscriptionAction, null);
            }

            return(this.View());
        }
Example #4
0
        /// <summary>
        /// subscription editor page
        /// </summary>
        public IActionResult UpdateSubscription(Guid subscriptionId)
        {
            var viewModel = new UpdateSubscriptionViewModel()
            {
                Subscription = _dbContext.Subscriptions.Where(
                    subscription => subscription.Id == subscriptionId).Single()
            };

            return(View(viewModel));
        }
Example #5
0
        public async Task <IActionResult> UpdateSubscription(UpdateSubscriptionViewModel model)
        {
            var subscription = _dbContext.Subscriptions.Where(
                subscription => subscription.Id == model.Subscription.Id).Single();

            OperationUpdate operation = null;

            // check if the plan is changed
            if (model.Subscription.PlanId != subscription.PlanId)
            {
                // create change plan operation
                operation = new OperationUpdate()
                {
                    Id             = Guid.NewGuid(),
                    Action         = SaaSActionEnum.ChangePlan,
                    SubscriptionId = subscription.Id,
                    Quantity       = model.Subscription.Quantity,
                    Status         = SaasStatusEnum.InProgress,
                    PlanId         = model.Subscription.PlanId
                };
            }
            else
            {
                // create change quantity operation
                operation = new OperationUpdate()
                {
                    Id             = Guid.NewGuid(),
                    Action         = SaaSActionEnum.ChangeQuantity,
                    SubscriptionId = subscription.Id,
                    Quantity       = model.Subscription.Quantity,
                    Status         = SaasStatusEnum.InProgress,
                    PlanId         = model.Subscription.PlanId
                };
            }
            model.OperationUpdateId = operation.Id;

            // save data in cache
            _cache.Set(operation.Id, operation, _cacheEntryOptions);
            // webhook trigger: send notifaction to ISV service
            await _webhookTriggerService.NotifyAsync(operation);

            return(View(model));
        }
Example #6
0
        public async Task <IActionResult> CancelSubscription(UpdateSubscriptionViewModel model)
        {
            var subscription = _dbContext.Subscriptions.Where(i => i.Id == model.Subscription.Id).Single();

            // create cancel subscription operation
            var operation = new OperationUpdate()
            {
                Id             = Guid.NewGuid(),
                Action         = SaaSActionEnum.Unsubscribe,
                SubscriptionId = subscription.Id,
                Quantity       = model.Subscription.Quantity,
                Status         = SaasStatusEnum.InProgress,
                PlanId         = model.Subscription.PlanId
            };

            model.OperationUpdateId = operation.Id;

            // save data in cache
            _cache.Set(operation.Id, operation, _cacheEntryOptions);
            // webhook trigger: send notifaction to ISV service
            await _webhookTriggerService.NotifyAsync(operation);

            return(View("UpdateSubscription", model));
        }
        public async Task <IActionResult> SubscriptionAction(
            Guid subscriptionId,
            ActionsEnum subscriptionAction,
            CancellationToken cancellationToken)
        {
            var requestId     = Guid.NewGuid();
            var correlationId = Guid.NewGuid();

            switch (subscriptionAction)
            {
            case ActionsEnum.Activate:
                break;

            case ActionsEnum.Update:
                var availablePlans = (await this.fulfillmentClient.GetSubscriptionPlansAsync(
                                          subscriptionId,
                                          requestId,
                                          correlationId,
                                          cancellationToken)).Plans.ToList();

                // remove the base plan from the model to show
                availablePlans.Remove(availablePlans.Single(p => p.PlanId == this.options.BasePlanId));

                var subscription = await this.fulfillmentClient.GetSubscriptionAsync(
                    subscriptionId,
                    requestId,
                    correlationId,
                    cancellationToken);

                var updateSubscriptionViewModel = new UpdateSubscriptionViewModel
                {
                    SubscriptionId    = subscriptionId,
                    SubscriptionName  = subscription.Name,
                    CurrentPlan       = subscription.PlanId,
                    AvailablePlans    = availablePlans,
                    PendingOperations =
                        (await this.fulfillmentClient
                         .GetSubscriptionOperationsAsync(
                             subscriptionId,
                             requestId,
                             correlationId,
                             cancellationToken)).Any(
                            o => o.Status == OperationStatusEnum.InProgress)
                };

                return(this.View("UpdateSubscription", updateSubscriptionViewModel));

            case ActionsEnum.Ack:
                break;

            case ActionsEnum.Unsubscribe:
                var unsubscribeResult = await this.fulfillmentClient.DeleteSubscriptionAsync(
                    subscriptionId,
                    requestId,
                    correlationId,
                    cancellationToken);

                return(unsubscribeResult.Success ? this.RedirectToAction("Index") : this.Error());

            default:
                throw new ArgumentOutOfRangeException(nameof(subscriptionAction), subscriptionAction, null);
            }

            return(this.View());
        }