public OperationResult UpdateConnectionString(InitialSettingsModel initialSettingsModel)
        {
            if (!ModelState.IsValid)
            {
                return(new OperationResult(false, "Required fields are not filled"));
            }

            var        inputPath = System.Web.Hosting.HostingEnvironment.MapPath("~/bin/Input.txt");
            AdminTools adminTools;
            var        sdkConnectionString = "Data Source="
                                             + initialSettingsModel.ConnectionStringSdk.Source + ";Initial Catalog="
                                             + initialSettingsModel.ConnectionStringSdk.Catalogue + ";"
                                             + initialSettingsModel.ConnectionStringSdk.Auth;

            var mainConnectionString = "Data Source="
                                       + initialSettingsModel.ConnectionStringMain.Source + ";Initial Catalog="
                                       + initialSettingsModel.ConnectionStringMain.Catalogue + ";"
                                       + initialSettingsModel.ConnectionStringMain.Auth;

            try
            {
                if (File.Exists(inputPath))
                {
                    //File.Delete(inputPath);
                    //var fileStream = File.Create(inputPath);
                    //fileStream.Dispose();
                    return(new OperationResult(false, "Connection string already exist"));
                }

                var fileStream = File.Create(inputPath);
                fileStream.Dispose();

                File.WriteAllText(inputPath, sdkConnectionString);
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message);
                return(new OperationResult(false, "Could not write connection string in /bin/Input.txt"));
            }
            try
            {
                adminTools = new AdminTools(sdkConnectionString);
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message);
                return(new OperationResult(false, "SDK connection string is invalid"));
            }

            var configuration = WebConfigurationManager.OpenWebConfiguration("~");
            var section       = (ConnectionStringsSection)configuration.GetSection("connectionStrings");

            section.ConnectionStrings["eFormMainConnection"].ConnectionString = mainConnectionString;
            try
            {
                configuration.Save();
                ConfigurationManager.RefreshSection("connectionStrings");
                var migrationConfiguration = new EformMigrationsConfiguration(mainConnectionString)
                {
                    TargetDatabase = new DbConnectionInfo(mainConnectionString, "System.Data.SqlClient")
                };
                var migrator = new DbMigrator(migrationConfiguration);
                migrator.Update();
                var settingsHelper = new SettingsHelper(mainConnectionString);
                settingsHelper.CreateAdminUser(initialSettingsModel.AdminSetupModel);
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message);
                return(new OperationResult(false, "Main connection string is invalid"));
            }

            adminTools.DbSetup(initialSettingsModel.ConnectionStringSdk.Token);
            return(new OperationResult(true));
        }
Exemplo n.º 2
0
        public OperationResult UpdateConnectionString(InitialSettingsModel initialSettingsModel)
        {
            if (!ModelState.IsValid)
            {
                return(new OperationResult(false, LocaleHelper.GetString("RequestFieldsAreNotFilled")));
            }
            var sdkConnectionString = initialSettingsModel.ConnectionStringSdk.Source + ";Initial Catalog="
                                      + initialSettingsModel.ConnectionStringSdk.Catalogue + ";"
                                      + initialSettingsModel.ConnectionStringSdk.Auth;

            var mainConnectionString = initialSettingsModel.ConnectionStringMain.Source + ";Initial Catalog="
                                       + initialSettingsModel.ConnectionStringMain.Catalogue + ";"
                                       + initialSettingsModel.ConnectionStringMain.Auth;
            // Save SDK connection string
            var inputPath = System.Web.Hosting.HostingEnvironment.MapPath("~/bin/Input.txt");

            if (inputPath == null)
            {
                return(new OperationResult(false, LocaleHelper.GetString("ErrorWhileCreatingFileForSDK")));
            }
            AdminTools adminTools;

            try
            {
                if (File.Exists(inputPath))
                {
                    return(new OperationResult(false, LocaleHelper.GetString("ConnectionStringAlreadyExist")));
                }

                var fileStream = File.Create(inputPath);
                fileStream.Dispose();

                File.WriteAllText(inputPath, sdkConnectionString);
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message);
                return(new OperationResult(false, LocaleHelper.GetString("CouldNotWriteConnectionString")));
            }
            try
            {
                adminTools = new AdminTools(sdkConnectionString);
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message);
                return(new OperationResult(false, LocaleHelper.GetString("SDKConnectionStringIsInvalid")));
            }
            // Save Main connection string
            var configuration      = WebConfigurationManager.OpenWebConfiguration("~");
            var connStringsSection = (ConnectionStringsSection)configuration.GetSection("connectionStrings");

            connStringsSection.ConnectionStrings["eFormMainConnection"].ConnectionString = mainConnectionString;
            // Save general app settings
            var section = (AppSettingsSection)configuration.GetSection("appSettings");

            section.Settings["general:defaultLocale"].Value =
                initialSettingsModel.GeneralAppSetupSettingsModel.DefaultLocale;
            // Save settings and migrate DB
            try
            {
                configuration.Save();
                ConfigurationManager.RefreshSection("connectionStrings");
                var migrationConfiguration = new EformMigrationsConfiguration(mainConnectionString)
                {
                    TargetDatabase = new DbConnectionInfo(mainConnectionString, "System.Data.SqlClient")
                };
                var migrator = new DbMigrator(migrationConfiguration);
                migrator.Update();
                var settingsHelper = new SettingsHelper(mainConnectionString);
                settingsHelper.CreateAdminUser(initialSettingsModel.AdminSetupModel);
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message);
                return(new OperationResult(false, LocaleHelper.GetString("MainConnectionStringIsInvalid")));
            }
            // Setup SDK DB
            adminTools.DbSetup(initialSettingsModel.ConnectionStringSdk.Token);
            return(new OperationResult(true));
        }
 public async Task <OperationResult> UpdateConnectionString([FromBody] InitialSettingsModel initialSettingsModel)
 {
     return(await _settingsService.UpdateConnectionString(initialSettingsModel));
 }
        public async Task <OperationResult> UpdateConnectionString(InitialSettingsModel initialSettingsModel)
        {
            var customerNo   = initialSettingsModel.GeneralAppSetupSettingsModel.CustomerNo.ToString();
            var dbNamePrefix = "";

            if (initialSettingsModel.ConnectionStringSdk.PrefixAllDatabases)
            {
                dbNamePrefix = "Microting_";
            }

            var sdkDbName     = $"{dbNamePrefix}{customerNo}_SDK";
            var angularDbName = $"{dbNamePrefix}{customerNo}_Angular";

            var sdkConnectionString =
                $"host= {initialSettingsModel.ConnectionStringSdk.Host};" +
                $"Database={sdkDbName};{initialSettingsModel.ConnectionStringSdk.Auth}" +
                $"port={initialSettingsModel.ConnectionStringSdk.Port};" +
                "Convert Zero Datetime = true;SslMode=none;";

            var angularConnectionString =
                $"host= {initialSettingsModel.ConnectionStringSdk.Host};" +
                $"Database={angularDbName};{initialSettingsModel.ConnectionStringSdk.Auth}" +
                $"port={initialSettingsModel.ConnectionStringSdk.Port};" +
                "Convert Zero Datetime = true;SslMode=none;";


            if (!string.IsNullOrEmpty(_connectionStringsSdk.Value.SdkConnection))
            {
                return(new OperationResult(false,
                                           _localizationService.GetString("ConnectionStringAlreadyExist")));
            }

            try
            {
                Log.LogEvent($"SettingsService.ConnectionStringExist: connection string is {sdkConnectionString}");
                var adminTools = new AdminTools(sdkConnectionString);
                //                 Setup SDK DB
                await adminTools.DbSetup(initialSettingsModel.ConnectionStringSdk.Token);

                //                var core = await _coreHelper.GetCore();
                Core core = new Core();
                await core.StartSqlOnly(sdkConnectionString);

                await core.SetSdkSetting(Settings.customerNo, customerNo);
            }
            catch (Exception exception)
            {
                _logger.LogError(exception.Message);
                _logger.LogError(exception.StackTrace);
                if (exception.InnerException != null)
                {
                    return(new OperationResult(false, exception.Message + " - " + exception.InnerException.Message));
                }

                return(new OperationResult(false, exception.Message));

                //return new OperationResult(false,
                //    _localizationService.GetString("SDKConnectionStringIsInvalid"));
            }

            // Migrate DB
            var dbContextOptionsBuilder = new DbContextOptionsBuilder <BaseDbContext>();

            try
            {
                dbContextOptionsBuilder.UseMySql(angularConnectionString,
                                                 new MariaDbServerVersion(
                                                     new Version(10, 4, 0)),
                                                 b =>
                                                 b.EnableRetryOnFailure());


                await using var dbContext = new BaseDbContext(dbContextOptionsBuilder.Options);
                await dbContext.Database.MigrateAsync();

                if (initialSettingsModel.AdminSetupModel != null)
                {
                    // Seed admin and demo users
                    await SeedAdminHelper.SeedAdmin(initialSettingsModel.AdminSetupModel,
                                                    initialSettingsModel.GeneralAppSetupSettingsModel.DefaultLocale, dbContext);
                }
            }
            catch (Exception exception)
            {
                _logger.LogError(exception.Message);
                _logger.LogError(exception.StackTrace);
                //return new OperationResult(false,
                //    _localizationService.GetString("MainConnectionStringIsInvalid"));
                if (exception.Message == "Could not create the user")
                {
                    return(new OperationResult(false,
                                               _localizationService.GetString(exception.Message)));
                }

                if (exception.InnerException != null)
                {
                    return(new OperationResult(false, exception.Message + " - " + exception.InnerException.Message));
                }

                return(new OperationResult(false, exception.Message));
            }

            try
            {
                // Generate SigningKey
                var key = new byte[32];
                RandomNumberGenerator.Create().GetBytes(key);
                var signingKey = Convert.ToBase64String(key);

                // Update Database settings
                await using var dbContext = new BaseDbContext(dbContextOptionsBuilder.Options);
                await _tokenOptions.UpdateDb((options) => { options.SigningKey = signingKey; }, dbContext);

                await _applicationSettings.UpdateDb(
                    options =>
                {
                    options.DefaultLocale = initialSettingsModel.GeneralAppSetupSettingsModel.DefaultLocale;
                }, dbContext);

                await _connectionStringsSdk.UpdateDb((options) =>
                {
                    options.SdkConnection = sdkConnectionString;
                }, dbContext);

                // Update connection string
                _connectionStrings.UpdateFile((options) =>
                {
                    options.DefaultConnection = angularConnectionString;
                });
            }

            catch (Exception exception)
            {
                _logger.LogError(exception.Message);
                _logger.LogError(exception.StackTrace);
                return(exception.InnerException != null
                    ? new OperationResult(false, exception.Message + " - " + exception.InnerException.Message)
                    : new OperationResult(false, exception.Message));

                //return new OperationResult(false,
                //    _localizationService.GetString("CouldNotWriteConnectionString"));
            }

            Program.Restart();
            return(new OperationResult(true));
        }