public async Task <IActionResult> Create() { if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageTenants)) { return(Unauthorized()); } if (!IsDefaultShell()) { return(Unauthorized()); } var recipeCollections = await Task.WhenAll(_recipeHarvesters.Select(x => x.HarvestRecipesAsync())); var recipes = recipeCollections.SelectMany(x => x).Where(x => x.IsSetupRecipe).ToArray(); // Creates a default shell settings based on the configuration. var shellSettings = _shellSettingsManager.CreateDefaultSettings(); var model = new EditTenantViewModel { Recipes = recipes, RequestUrlHost = shellSettings.RequestUrlHost, RequestUrlPrefix = shellSettings.RequestUrlPrefix, DatabaseProvider = shellSettings["DatabaseProvider"], TablePrefix = shellSettings["TablePrefix"], ConnectionString = shellSettings["ConnectionString"], RecipeName = shellSettings["RecipeName"] }; model.Recipes = recipes; return(View(model)); }
public async Task <IActionResult> Create() { if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageTenants)) { return(Forbid()); } if (!_currentShellSettings.IsDefaultShell()) { return(Forbid()); } var recipeCollections = await Task.WhenAll(_recipeHarvesters.Select(x => x.HarvestRecipesAsync())); var recipes = recipeCollections.SelectMany(x => x).Where(x => x.IsSetupRecipe).OrderBy(r => r.DisplayName).ToArray(); // Creates a default shell settings based on the configuration. var shellSettings = _shellSettingsManager.CreateDefaultSettings(); var currentFeatureProfile = shellSettings["FeatureProfile"]; var featureProfiles = await GetFeatureProfilesAsync(currentFeatureProfile); var model = new EditTenantViewModel { Recipes = recipes, RequestUrlHost = shellSettings.RequestUrlHost, RequestUrlPrefix = shellSettings.RequestUrlPrefix, TablePrefix = shellSettings["TablePrefix"], RecipeName = shellSettings["RecipeName"], FeatureProfile = currentFeatureProfile, FeatureProfiles = featureProfiles }; SetConfigurationShellValues(model); model.Recipes = recipes; return(View(model)); }
public async Task <IActionResult> Create(CreateApiViewModel model) { if (!_currentShellSettings.IsDefaultShell()) { return(Forbid()); } if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageTenants)) { return(this.ChallengeOrForbid("Api")); } // Creates a default shell settings based on the configuration. var shellSettings = _shellSettingsManager.CreateDefaultSettings(); shellSettings.Name = model.Name; shellSettings.RequestUrlHost = model.RequestUrlHost; shellSettings.RequestUrlPrefix = model.RequestUrlPrefix; shellSettings.State = TenantState.Uninitialized; shellSettings["ConnectionString"] = model.ConnectionString; shellSettings["TablePrefix"] = model.TablePrefix; shellSettings["DatabaseProvider"] = model.DatabaseProvider; shellSettings["Secret"] = Guid.NewGuid().ToString(); shellSettings["RecipeName"] = model.RecipeName; shellSettings["FeatureProfile"] = model.FeatureProfile; model.IsNewTenant = true; ModelState.AddModelErrors(await _tenantValidator.ValidateAsync(model)); if (ModelState.IsValid) { if (_shellHost.TryGetSettings(model.Name, out var settings)) { // Site already exists, return 201 for indempotency purpose var token = CreateSetupToken(settings); return(StatusCode(201, GetEncodedUrl(settings, token))); } else { await _shellHost.UpdateShellSettingsAsync(shellSettings); var token = CreateSetupToken(shellSettings); return(Ok(GetEncodedUrl(shellSettings, token))); } } return(BadRequest(ModelState)); }
/// <summary> /// Creates a transient shell for the default tenant's setup. /// </summary> private Task <ShellContext> CreateSetupContextAsync(ShellSettings defaultSettings) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug("Creating shell context for root setup."); } if (defaultSettings == null) { // Creates a default shell settings based on the configuration. var shellSettings = _shellSettingsManager.CreateDefaultSettings(); shellSettings.Name = ShellHelper.DefaultShellName; shellSettings.State = TenantState.Uninitialized; defaultSettings = shellSettings; } return(_shellContextFactory.CreateSetupContextAsync(defaultSettings)); }
/// <summary> /// Creates a tenant shell settings. /// </summary> /// <param name="setupOptions">The setup options.</param> /// <returns>The <see cref="ShellSettings"/>.</returns> public async Task <ShellSettings> CreateTenantSettingsAsync(TenantSetupOptions setupOptions) { var shellSettings = _shellSettingsManager.CreateDefaultSettings(); shellSettings.Name = setupOptions.ShellName; shellSettings.RequestUrlHost = setupOptions.RequestUrlHost; shellSettings.RequestUrlPrefix = setupOptions.RequestUrlPrefix; shellSettings.State = TenantState.Uninitialized; shellSettings["ConnectionString"] = setupOptions.DatabaseConnectionString; shellSettings["TablePrefix"] = setupOptions.DatabaseTablePrefix; shellSettings["DatabaseProvider"] = setupOptions.DatabaseProvider; shellSettings["Secret"] = Guid.NewGuid().ToString(); shellSettings["RecipeName"] = setupOptions.RecipeName; await _shellHost.UpdateShellSettingsAsync(shellSettings); return(shellSettings); }
public async Task <IActionResult> Create(CreateApiViewModel model) { if (!IsDefaultShell()) { return(Forbid()); } if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageTenants)) { return(this.ChallengeOrForbid("Api")); } if (!String.IsNullOrEmpty(model.Name) && !Regex.IsMatch(model.Name, @"^\w+$")) { ModelState.AddModelError(nameof(CreateApiViewModel.Name), S["Invalid tenant name. Must contain characters only and no spaces."]); } // Creates a default shell settings based on the configuration. var shellSettings = _shellSettingsManager.CreateDefaultSettings(); shellSettings.Name = model.Name; shellSettings.RequestUrlHost = model.RequestUrlHost; shellSettings.RequestUrlPrefix = model.RequestUrlPrefix; shellSettings.State = TenantState.Uninitialized; shellSettings["ConnectionString"] = model.ConnectionString; shellSettings["TablePrefix"] = model.TablePrefix; shellSettings["DatabaseProvider"] = model.DatabaseProvider; shellSettings["Secret"] = Guid.NewGuid().ToString(); shellSettings["RecipeName"] = model.RecipeName; shellSettings["FeatureProfile"] = model.FeatureProfile; if (!String.IsNullOrWhiteSpace(model.FeatureProfile)) { var featureProfiles = await _featureProfilesService.GetFeatureProfilesAsync(); if (!featureProfiles.ContainsKey(model.FeatureProfile)) { ModelState.AddModelError(nameof(CreateApiViewModel.FeatureProfile), S["The feature profile does not exist.", model.FeatureProfile]); } } if (String.IsNullOrWhiteSpace(shellSettings.RequestUrlHost) && String.IsNullOrWhiteSpace(shellSettings.RequestUrlPrefix)) { ModelState.AddModelError(nameof(CreateApiViewModel.RequestUrlPrefix), S["Host and url prefix can not be empty at the same time."]); } if (!String.IsNullOrWhiteSpace(shellSettings.RequestUrlPrefix)) { if (shellSettings.RequestUrlPrefix.Contains('/')) { ModelState.AddModelError(nameof(CreateApiViewModel.RequestUrlPrefix), S["The url prefix can not contain more than one segment."]); } } if (ModelState.IsValid) { if (_shellHost.TryGetSettings(model.Name, out var settings)) { // Site already exists, return 201 for indempotency purpose var token = CreateSetupToken(settings); return(StatusCode(201, GetEncodedUrl(settings, token))); } else { await _shellHost.UpdateShellSettingsAsync(shellSettings); var token = CreateSetupToken(shellSettings); return(Ok(GetEncodedUrl(shellSettings, token))); } } return(BadRequest(ModelState)); }