Ejemplo n.º 1
0
        private async Task <ICommandResultBase> UninstallInternalAsync(IShellSettings shellSettings)
        {
            // Our result
            var result = new CommandResultBase();

            var errors = new List <CommandError>();

            // ----------------------
            // 1. Attempt to delete App_Data/{SiteName} folder
            // ----------------------

            var deleted = true;

            try
            {
                deleted = _shellSettingsManager.DeleteSettings(shellSettings);
            }
            catch (Exception e)
            {
                errors.Add(new CommandError(e.Message));
            }

            // Report any errors
            if (errors.Count > 0)
            {
                return(result.Failed(errors.ToArray()));
            }

            // Ensure we could delete the directory
            if (deleted == false)
            {
                return(result.Failed($"Cannot delete tenant folder with the name \"{shellSettings.Location}\"!"));
            }

            // ----------------------
            // 2. Attempt to drop all tables and stored procedures with our table prefix
            // ----------------------

            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 logger   = scope.ServiceProvider.GetRequiredService <ILogger <TenantSetUpService> >();
                        var dbHelper = scope.ServiceProvider.GetRequiredService <IDbHelper>();

                        try
                        {
                            await dbHelper.ExecuteScalarAsync <int>(UninstallSql, new Dictionary <string, string>()
                            {
                                ["{prefix}"] = shellSettings.TablePrefix
                            });
                        }
                        catch (Exception e)
                        {
                            errors.Add(new CommandError(e.Message));
                        }
                    }
                }
            }

            // ----------------------
            // 3. Dispose the tenant
            // ----------------------

            // Ensure no errors occurred
            if (errors.Count == 0)
            {
                _platoHost.DisposeShell(shellSettings);
            }

            return(errors.Count > 0
                ? result.Failed(errors.ToArray())
                : result.Success());
        }