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()); }
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")); }
/// <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()); }
/// <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)); }
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)); }
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()); }