public async Task SaveAsync(string tenant, IDictionary <string, string> data)
        {
            using var context = await _shellContextFactory.GetDatabaseContextAsync(_options);

            await context.CreateScope().UsingServiceScopeAsync(async scope =>
            {
                var session = scope.ServiceProvider.GetRequiredService <ISession>();

                var document = await session.Query <DatabaseShellConfigurations>().FirstOrDefaultAsync();

                JObject configurations;
                if (document != null)
                {
                    configurations = document.ShellConfigurations;
                }
                else
                {
                    document       = new DatabaseShellConfigurations();
                    configurations = new JObject();
                }

                var config = configurations.GetValue(tenant) as JObject ?? new JObject();

                foreach (var key in data.Keys)
                {
                    if (data[key] != null)
                    {
                        config[key] = data[key];
                    }
                    else
                    {
                        config.Remove(key);
                    }
                }

                configurations[tenant] = config;

                document.ShellConfigurations = configurations;

                session.Save(document, checkConcurrency: true);
            });
        }
        public async Task AddSourcesAsync(string tenant, IConfigurationBuilder builder)
        {
            JObject configurations = null;

            using var context = await _shellContextFactory.GetDatabaseContextAsync(_options);

            await context.CreateScope().UsingServiceScopeAsync(async scope =>
            {
                var session = scope.ServiceProvider.GetRequiredService <ISession>();

                var document = await session.Query <DatabaseShellConfigurations>().FirstOrDefaultAsync();

                if (document != null)
                {
                    configurations = document.ShellConfigurations;
                }
                else
                {
                    document       = new DatabaseShellConfigurations();
                    configurations = new JObject();
                }

                if (!configurations.ContainsKey(tenant))
                {
                    if (!_options.MigrateFromFiles || !await TryMigrateFromFileAsync(tenant, configurations))
                    {
                        return;
                    }

                    document.ShellConfigurations = configurations;

                    session.Save(document, checkConcurrency: true);
                }
            });

            var configuration = configurations.GetValue(tenant) as JObject;

            if (configuration != null)
            {
                builder.AddJsonStream(new MemoryStream(Encoding.UTF8.GetBytes(configuration.ToString(Formatting.None))));
            }
        }