in src/OrchardCore.Modules/OrchardCore.Tenants/Controllers/ApiController.cs [136:279]
public async Task<ActionResult> Setup(SetupApiViewModel model)
{
if (!IsDefaultShell())
{
return this.ChallengeOrForbid("Api");
}
if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageTenants))
{
return this.ChallengeOrForbid("Api");
}
if (!ModelState.IsValid)
{
return BadRequest();
}
if (!_emailAddressValidator.Validate(model.Email))
{
return BadRequest(S["Invalid email."]);
}
if (!_shellHost.TryGetSettings(model.Name, out var shellSettings))
{
ModelState.AddModelError(nameof(SetupApiViewModel.Name), S["Tenant not found: '{0}'", model.Name]);
}
if (shellSettings.State == TenantState.Running)
{
return StatusCode(201);
}
if (shellSettings.State != TenantState.Uninitialized)
{
return BadRequest(S["The tenant can't be setup."]);
}
var databaseProvider = shellSettings["DatabaseProvider"];
if (String.IsNullOrEmpty(databaseProvider))
{
databaseProvider = model.DatabaseProvider;
}
var selectedProvider = _databaseProviders.FirstOrDefault(x => String.Equals(x.Value, databaseProvider, StringComparison.OrdinalIgnoreCase));
if (selectedProvider == null)
{
return BadRequest(S["The database provider is not defined."]);
}
var tablePrefix = shellSettings["TablePrefix"];
if (String.IsNullOrEmpty(tablePrefix))
{
tablePrefix = model.TablePrefix;
}
var connectionString = shellSettings["connectionString"];
if (String.IsNullOrEmpty(connectionString))
{
connectionString = model.ConnectionString;
}
if (selectedProvider.HasConnectionString && String.IsNullOrEmpty(connectionString))
{
return BadRequest(S["The connection string is required for this database provider."]);
}
var recipeName = shellSettings["RecipeName"];
if (String.IsNullOrEmpty(recipeName))
{
recipeName = model.RecipeName;
}
RecipeDescriptor recipeDescriptor = null;
if (String.IsNullOrEmpty(recipeName))
{
if (model.Recipe == null)
{
return BadRequest(S["Either 'Recipe' or 'RecipeName' is required."]);
}
var tempFilename = Path.GetTempFileName();
using (var fs = System.IO.File.Create(tempFilename))
{
await model.Recipe.CopyToAsync(fs);
}
var fileProvider = new PhysicalFileProvider(Path.GetDirectoryName(tempFilename));
recipeDescriptor = new RecipeDescriptor
{
FileProvider = fileProvider,
BasePath = "",
RecipeFileInfo = fileProvider.GetFileInfo(Path.GetFileName(tempFilename))
};
}
else
{
var setupRecipes = await _setupService.GetSetupRecipesAsync();
recipeDescriptor = setupRecipes.FirstOrDefault(x => String.Equals(x.Name, recipeName, StringComparison.OrdinalIgnoreCase));
if (recipeDescriptor == null)
{
return BadRequest(S["Recipe '{0}' not found.", recipeName]);
}
}
var setupContext = new SetupContext
{
ShellSettings = shellSettings,
SiteName = model.SiteName,
EnabledFeatures = null, // default list,
AdminUsername = model.UserName,
AdminEmail = model.Email,
AdminPassword = model.Password,
Errors = new Dictionary<string, string>(),
Recipe = recipeDescriptor,
SiteTimeZone = model.SiteTimeZone,
DatabaseProvider = selectedProvider.Value,
DatabaseConnectionString = connectionString,
DatabaseTablePrefix = tablePrefix
};
var executionId = await _setupService.SetupAsync(setupContext);
// Check if a component in the Setup failed
if (setupContext.Errors.Any())
{
foreach (var error in setupContext.Errors)
{
ModelState.AddModelError(error.Key, error.Value);
}
return StatusCode(500, ModelState);
}
return Ok(executionId);
}