public TableauMigrationService(
            IOptionsMonitor <TableauMigrationSettings> settingsMonitor,
            ITableauApiServiceSource tableauApiServiceSource,
            ITableauApiServiceDestination tableauApiServiceDestination,
            IVizDatasourceService vizDatasourceService,
            ILogger logger = null
            )
        {
            _settingsMonitor              = settingsMonitor ?? throw new ArgumentNullException("Missing Tableau Migration settings");
            _tableauApiServiceSource      = tableauApiServiceSource;
            _tableauApiServiceDestination = tableauApiServiceDestination;
            _vizDatasourceService         = vizDatasourceService;
            _logger = logger;

            _settingsMonitor.CurrentValue.DefaultOwnerUsername =
                _settingsMonitor.CurrentValue.DefaultOwnerUsername ?? "";

            _tableauServiceFactorySource = new TableauServiceFactory(_tableauApiServiceSource, _logger);
            _tableauServiceFactoryDest   = new TableauServiceFactory(_tableauApiServiceDestination, _logger);

            _tableauApiServiceSource.SignInAsync().Wait();
            _tableauApiServiceDestination.SignInAsync().Wait();

            // ensure case-insensitive connection credential lookup
            _settingsMonitor.CurrentValue.EmbeddedConnectionCredentials = new Dictionary <string, string>(
                _settingsMonitor.CurrentValue.EmbeddedConnectionCredentials,
                StringComparer.OrdinalIgnoreCase
                );
        }
        public VizDatasourceService(
            IOptionsMonitor <VizDatasourceSettings> settingsMonitor,
            ITableauApiServiceSource tableauApiServiceSource,
            ILogger logger
            )
        {
            _settingsMonitor         = settingsMonitor;
            _tableauApiServiceSource = tableauApiServiceSource;
            _logger = logger;

            if (String.IsNullOrWhiteSpace(_settingsMonitor.CurrentValue.ReportOutputPath))
            {
                throw new ArgumentNullException("Viz datasource report path required");
            }

            // populate the viz datasources - a list of datasources stored in Tableau used by the web UI
            // having a different format/schema from the datasource managed through the REST API
            LoadVizDatasourceJson();
        }