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()); }