public virtual async Task <IActionResult> Index(InstallModel model) { if (DataSettingsManager.DatabaseIsInstalled()) { return(RedirectToRoute("HomePage")); } var locService = _serviceProvider.GetRequiredService <IInstallationLocalizedService>(); if (model.DatabaseConnectionString != null) { model.DatabaseConnectionString = model.DatabaseConnectionString.Trim(); } string connectionString = ""; if (model.ConnectionInfo) { if (String.IsNullOrEmpty(model.DatabaseConnectionString)) { ModelState.AddModelError("", locService.GetResource("ConnectionStringRequired")); } else { connectionString = model.DatabaseConnectionString; } } else { if (String.IsNullOrEmpty(model.MongoDBDatabaseName)) { ModelState.AddModelError("", locService.GetResource("DatabaseNameRequired")); } if (String.IsNullOrEmpty(model.MongoDBServerName)) { ModelState.AddModelError("", locService.GetResource("MongoDBServerNameRequired")); } string userNameandPassword = ""; if (!(String.IsNullOrEmpty(model.MongoDBUsername))) { userNameandPassword = model.MongoDBUsername + ":" + model.MongoDBPassword + "@"; } connectionString = "mongodb://" + userNameandPassword + model.MongoDBServerName + "/" + model.MongoDBDatabaseName; } if (!string.IsNullOrEmpty(connectionString)) { try { var mdb = new MongoDBContext(); if (await mdb.DatabaseExist(connectionString)) { ModelState.AddModelError("", locService.GetResource("AlreadyInstalled")); } } catch (Exception ex) { ModelState.AddModelError("", ex.InnerException != null ? ex.InnerException.Message : ex.Message); } } else { ModelState.AddModelError("", locService.GetResource("ConnectionStringRequired")); } if (ModelState.IsValid) { try { //save settings var settings = new DataSettings { ConnectionString = connectionString, DbProvider = model.DataProvider }; await DataSettingsManager.SaveSettings(settings); var installationService = _serviceProvider.GetRequiredService <IInstallationService>(); await installationService.InstallData(model.AdminEmail, model.AdminPassword, model.Collation, model.InstallSampleData, model.CompanyName, model.CompanyAddress, model.CompanyPhoneNumber, model.CompanyEmail); //reset cache DataSettingsManager.ResetCache(); PluginManager.ClearPlugins(); var pluginsInfo = PluginManager.ReferencedPlugins.ToList(); foreach (var pluginInfo in pluginsInfo) { try { var plugin = pluginInfo.Instance <IPlugin>(_serviceProvider); await plugin.Install(); } catch (Exception ex) { var _logger = _serviceProvider.GetRequiredService <ILogger>(); await _logger.InsertLog(Domain.Logging.LogLevel.Error, "Error during installing plugin " + pluginInfo.SystemName, ex.Message + " " + ex.InnerException?.Message); } } //register default permissions var permissionProviders = new List <Type>(); permissionProviders.Add(typeof(PermissionProvider)); foreach (var providerType in permissionProviders) { var provider = (IPermissionProvider)Activator.CreateInstance(providerType); await _mediator.Send(new InstallPermissionsCommand() { PermissionProvider = provider }); } //restart application await _cacheBase.SetAsync("Installed", true, 120); return(View(new InstallModel() { Installed = true })); } catch (Exception exception) { //reset cache DataSettingsManager.ResetCache(); await _cacheBase.Clear(); System.IO.File.Delete(CommonPath.SettingsPath); ModelState.AddModelError("", string.Format(locService.GetResource("SetupFailed"), exception.Message + " " + exception.InnerException?.Message)); } } //prepare db providers model.AvailableProviders = Enum.GetValues(typeof(DbProvider)).Cast <DbProvider>().Select(v => new SelectListItem { Text = v.ToString(), Value = ((int)v).ToString() }).ToList(); //prepare language list foreach (var lang in locService.GetAvailableLanguages()) { model.AvailableLanguages.Add(new SelectListItem { Value = Url.RouteUrl("InstallChangeLanguage", new { language = lang.Code }), Text = lang.Name, Selected = locService.GetCurrentLanguage().Code == lang.Code, }); } //prepare collation list foreach (var col in locService.GetAvailableCollations()) { model.AvailableCollation.Add(new SelectListItem { Value = col.Value, Text = col.Name, Selected = locService.GetCurrentLanguage().Code == col.Value, }); } return(View(model)); }