Ejemplo n.º 1
0
        // --------------------------

        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));
        }
Ejemplo n.º 2
0
        async Task <string> SetUpInternalAsync(SetUpContext context)
        {
            // Set shell state to "Initializing" so that subsequent HTTP requests are responded to with "Service Unavailable" while Orchard is setting up.
            _shellSettings.State = TenantState.Initializing;

            var executionId = Guid.NewGuid().ToString("n");

            var shellSettings = new ShellSettings(_shellSettings.Configuration);

            shellSettings.Name     = context.SiteName;
            shellSettings.Location = context.SiteName.ToSafeFileName();

            if (string.IsNullOrEmpty(shellSettings.DatabaseProvider))
            {
                var tablePrefix = context.DatabaseTablePrefix;
                if (!tablePrefix.EndsWith(TablePrefixSeparator))
                {
                    tablePrefix += 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);
                        }
                    }
                }
            }

            if (context.Errors.Count > 0)
            {
                return(executionId);
            }

            shellSettings.State = TenantState.Running;
            _platoHost.UpdateShellSettings(shellSettings);

            return(executionId);
        }