public IActionResult DataMigrationFromRemoteServer()
        {
            if (!IsUserAllowedToImportData())
            {
                return(Unauthorized());
            }

            var viewModel = new AdminDataMigrationViewModel();

            return(View("DataMigrationFromRemoteServer", viewModel));
        }
        public IActionResult ImportAllDataFromRemoteServer(AdminDataMigrationViewModel viewModel)
        {
            if (!IsUserAllowedToImportData())
            {
                return(Unauthorized());
            }

            viewModel.ParseAndValidateParameters(Request, m => m.Hostname);
            viewModel.ParseAndValidateParameters(Request, m => m.Password);
            viewModel.ParseAndValidateParameters(Request, m => m.BasicAuthUsername);
            viewModel.ParseAndValidateParameters(Request, m => m.BasicAuthPassword);

            if (string.IsNullOrWhiteSpace(Global.DataMigrationPassword))
            {
                // Don't allow access if no password is set
                return(Unauthorized());
            }
            if (viewModel.Password != Global.DataMigrationPassword)
            {
                // Don't allow access is the user got the password wrong
                return(Unauthorized());
            }

            StartChunkedResponse();

            WriteParagraph($"Requesting data export from {viewModel.Hostname}");

            var httpClient = new HttpClient();

            if (!string.IsNullOrWhiteSpace(viewModel.BasicAuthUsername) && !string.IsNullOrWhiteSpace(viewModel.BasicAuthPassword))
            {
                httpClient.DefaultRequestHeaders.Authorization = new BasicAuthenticationHeaderValue(viewModel.BasicAuthUsername, viewModel.BasicAuthPassword);
            }
            string requestUrl     = $"https://{viewModel.Hostname}/admin/data-migration/export-all?password={viewModel.Password}";
            string responseString = httpClient.GetStringAsync(requestUrl).Result;

            WriteParagraph($"Received data export from {viewModel.Hostname}");

            ImportDataFromJsonString(responseString);

            WriteParagraph($"Data Migration Complete!");
            Thread.Sleep(TimeSpan.FromSeconds(5)); // Sleep for a few seconds to allow the output to be flushed (sometimes the last sections of output are missed, which is confusing the the user

            EndChunkedResponse();
            Thread.Sleep(TimeSpan.FromSeconds(5)); // Sleep for a few seconds to allow the output to be flushed (sometimes the last sections of output are missed, which is confusing the the user

            return(null);
        }