public async Task <IActionResult> Upsert([FromBody] SubscriptionView subscription) { ScampSubscription tmpSub = new ScampSubscription(); string tmpPassword = string.Empty; // only system admins can access this functionality if (!await _securityHelper.IsSysAdmin()) { return(new HttpStatusCodeResult(403)); // Forbidden } //validate request // if doing update, subscription must already exist if (!string.IsNullOrEmpty(subscription.Id)) { tmpSub = await _settingsRepository.GetSubscription(subscription.Id); if (tmpSub == null) { return new ObjectResult("specified subscription does not exist") { StatusCode = 400 } } ; } // TODO: additional validation // https://github.com/SimpleCloudManagerProject/SCAMP/issues/192 // error returned should indicate all fields with issues // map request to database object tmpSub.Name = subscription.Name; tmpSub.AzureSubscriptionID = subscription.AzureSubscriptionId; tmpSub.AzureAdminUser = subscription.AzureAdminUser; bool doingAdd = string.IsNullOrEmpty(subscription.Id); // if doing add, use password provided if (doingAdd) { tmpPassword = subscription.AzureAdminPassword; } else // else, doing update, only change password if it was provided { if (!string.IsNullOrEmpty(subscription.AzureAdminPassword)) // if a password was specified { tmpPassword = subscription.AzureAdminPassword; // update it } } // save insert/update subscription await _settingsRepository.UpsertSubscription(tmpSub); // If we have a new/updated password, save it to keyvault try { if (!string.IsNullOrEmpty(tmpPassword)) { await _keyRepository.UpsertSecret(tmpSub.Id, "password", tmpPassword); } } catch (Exception ex) { if (doingAdd) { await _settingsRepository.DeleteSubscription(tmpSub); // key vault failed, remove added subscription } else { throw new Exception("Failed to update password", ex); } } // return list return(new ObjectResult(null) { StatusCode = 200 }); }