// -------------------------- private async Task <ICommandResult <TenantSetUpContext> > InstallInternalAsync(TenantSetUpContext context) { var result = new CommandResult <TenantSetUpContext>(); var shellSettings = BuildShellSettings(context); using (var shellContext = _shellContextFactory.CreateMinimalShellContext(shellSettings)) { using (var scope = shellContext.ServiceProvider.CreateScope()) { var hasErrors = false; void ReportError(string key, string message) { hasErrors = true; context.Errors[key] = message; } // Invoke set-up event handlers var logger = scope.ServiceProvider.GetRequiredService <ILogger <TenantSetUpService> >(); var setupEventHandlers = scope.ServiceProvider.GetServices <ISetUpEventHandler>(); await setupEventHandlers.InvokeAsync(x => x.SetUp(context, ReportError), logger); // Return early if we encountered any errors if (hasErrors) { return(result.Failed(context.Errors.Select(e => e.Value).ToArray())); } // Activate message broker subscriptions for tenant var subscribers = scope.ServiceProvider.GetServices <IBrokerSubscriber>(); foreach (var subscriber in subscribers) { subscriber.Subscribe(); } // Update tenant email settings var emailSettingsManager = scope.ServiceProvider.GetService <IEmailSettingsManager>(); await emailSettingsManager.SaveAsync(context.EmailSettings); } } // Report any errors if (context.Errors.Count > 0) { return(result.Failed(context.Errors.Select(e => e.Value).ToArray())); } // Set shell defaults shellSettings.CreatedDate = DateTimeOffset.Now; shellSettings.ModifiedDate = DateTimeOffset.Now; shellSettings.State = TenantState.Running; // Update & recycle shell _platoHost .UpdateShell(shellSettings) .RecycleShell(shellSettings); return(result.Success(context)); }
// ------------ async Task <string> SetUpInternalAsync(ISetUpContext context) { // Set state to "Initializing" so that subsequent HTTP requests are responded to with "Service Unavailable" while setting up. _shellSettings.State = TenantState.Initializing; var executionId = Guid.NewGuid().ToString("n"); var shellSettings = new ShellSettings(_shellSettings.Configuration) { Location = context.SiteName.ToSafeFileName() }; if (string.IsNullOrEmpty(shellSettings.DatabaseProvider)) { var tablePrefix = context.DatabaseTablePrefix; if (!tablePrefix.EndsWith(ShellHelper.TablePrefixSeparator)) { tablePrefix += ShellHelper.TablePrefixSeparator; } shellSettings.DatabaseProvider = context.DatabaseProvider; shellSettings.ConnectionString = context.DatabaseConnectionString; shellSettings.TablePrefix = tablePrefix; } using (var shellContext = _shellContextFactory.CreateMinimalShellContext(shellSettings)) { using (var scope = shellContext.ServiceProvider.CreateScope()) { using (var dbContext = scope.ServiceProvider.GetRequiredService <IDbContext>()) { // update dbContext confirmation dbContext.Configure(options => { options.ConnectionString = shellSettings.ConnectionString; options.DatabaseProvider = shellSettings.DatabaseProvider; options.TablePrefix = shellSettings.TablePrefix; }); var hasErrors = false; void ReportError(string key, string message) { hasErrors = true; context.Errors[key] = message; } // Invoke modules to react to the setup event var setupEventHandlers = scope.ServiceProvider.GetServices <ISetUpEventHandler>(); var logger = scope.ServiceProvider.GetRequiredService <ILogger <SetUpService> >(); await setupEventHandlers.InvokeAsync(x => x.SetUp(context, ReportError), logger); if (hasErrors) { return(executionId); } } } } // Report errors if (context.Errors.Count > 0) { return(executionId); } // Set defaults shellSettings.CreatedDate = DateTimeOffset.Now; shellSettings.ModifiedDate = DateTimeOffset.Now; shellSettings.State = TenantState.Running; // Update & recycle shell _platoHost .UpdateShell(shellSettings) .RecycleShell(shellSettings); return(executionId); }