in src/CustomerSite/Controllers/HomeController.cs [675:745]
public async Task<IActionResult> ChangeSubscriptionPlan(SubscriptionResult subscriptionDetail)
{
this.logger.Info(HttpUtility.HtmlEncode($"Home Controller / ChangeSubscriptionPlan subscriptionDetail:{ JsonSerializer.Serialize(subscriptionDetail)}"));
if (this.User.Identity.IsAuthenticated)
{
try
{
if (subscriptionDetail.Id != default && !string.IsNullOrEmpty(subscriptionDetail.PlanId))
{
try
{
//initiate change plan
var currentUserId = this.userService.GetUserIdFromEmailAddress(this.CurrentUserEmailAddress);
var jsonResult = await this.apiService.ChangePlanForSubscriptionAsync(subscriptionDetail.Id, subscriptionDetail.PlanId).ConfigureAwait(false);
var changePlanOperationStatus = OperationStatusEnum.InProgress;
if (jsonResult != null && jsonResult.OperationId != default)
{
int _counter = 0;
//loop untill the operation status has moved away from inprogress or notstarted, generally this will be the result of webhooks' action aganist this operation
while (OperationStatusEnum.InProgress.Equals(changePlanOperationStatus) || OperationStatusEnum.NotStarted.Equals(changePlanOperationStatus))
{
var changePlanOperationResult = await this.apiService.GetOperationStatusResultAsync(subscriptionDetail.Id, jsonResult.OperationId).ConfigureAwait(false);
changePlanOperationStatus = changePlanOperationResult.Status;
this.logger.Info(HttpUtility.HtmlEncode($"Plan Change Progress. SubscriptionId: {subscriptionDetail.Id} ToPlan: {subscriptionDetail.PlanId} UserId: ***** OperationId: {jsonResult.OperationId} Operationstatus: { changePlanOperationStatus }."));
await this.applicationLogService.AddApplicationLog($"Plan Change Progress. SubscriptionId: {subscriptionDetail.Id} ToPlan: {subscriptionDetail.PlanId} UserId: {currentUserId} OperationId: {jsonResult.OperationId} Operationstatus: { changePlanOperationStatus }.").ConfigureAwait(false);
//wait and check every 5secs
await Task.Delay(5000);
_counter++;
if (_counter > 100)
{
//if loop has been executed for more than 100 times then break, to avoid infinite loop just in case
break;
}
}
if (changePlanOperationStatus == OperationStatusEnum.Succeeded)
{
this.logger.Info(HttpUtility.HtmlEncode($"Plan Change Success. SubscriptionId: {subscriptionDetail.Id} ToPlan : {subscriptionDetail.PlanId} UserId: ***** OperationId: {jsonResult.OperationId}."));
await this.applicationLogService.AddApplicationLog($"Plan Change Success. SubscriptionId: {subscriptionDetail.Id} ToPlan: {subscriptionDetail.PlanId} UserId: {currentUserId} OperationId: {jsonResult.OperationId}.").ConfigureAwait(false);
}
else
{
this.logger.Info(HttpUtility.HtmlEncode($"Plan Change Failed. SubscriptionId: {subscriptionDetail.Id} ToPlan : {subscriptionDetail.PlanId} UserId: ****** OperationId: {jsonResult.OperationId} Operation status { changePlanOperationStatus }."));
await this.applicationLogService.AddApplicationLog($"Plan Change Failed. SubscriptionId: {subscriptionDetail.Id} ToPlan: {subscriptionDetail.PlanId} UserId: {currentUserId} OperationId: {jsonResult.OperationId} Operation status { changePlanOperationStatus }.").ConfigureAwait(false);
throw new MarketplaceException($"Plan change operation failed with operation status {changePlanOperationStatus}.");
}
}
}
catch (MarketplaceException fex)
{
this.TempData["ErrorMsg"] = fex.Message;
}
}
return this.RedirectToAction(nameof(this.Subscriptions));
}
catch (Exception ex)
{
this.logger.LogError($"Message:{ex.Message} :: {ex.InnerException} ");
return this.View("Error", ex);
}
}
return this.RedirectToAction(nameof(this.Index));
}