public Task <SyncthingContext> GetContext()
        {
            return(this.cache.GetAsync(
                       ContextCacheKey,
                       async context =>
            {
                var generalSettings =
                    await
                    this.commandsFactory.Create <GetCurrentGeneralSettingsCommand>()
                    .SetupNoCache(true)
                    .GetAsync();

                var ctx =
                    await
                    SyncthingContext.CreateAsync(new SyncthingApiEndpoint(generalSettings.SyncthingApiKey,
                                                                          generalSettings.SyncthingEndpoint));

                var logger = loggerFactory.CreateLogger(typeof(SyncthingContext));
                ctx.Configuration.SetErrorCallback(message => logger.LogError(message));

                await this.SynchronizeDatabase(ctx);

                Watch(ctx);

                return ctx;
            }));
        }
        private async Task SynchronizeDatabase(SyncthingContext ctx)
        {
            var allEnumerated = await this.commandsFactory.Create <QueryAllFoldersCommand>().NoCache().ExecuteAsync();;
            var all           = allEnumerated as IList <Folder> ?? allEnumerated.ToList();

            var newFolders = ctx.Folders.Select(f => f.Id).Except(all.Select(f => f.FolderId));

            await this.commandsFactory.Create <EnsureNewFoldersCommand>().Setup(newFolders.ToArray()).ExecuteAsync();

            var toRemove = all.Select(f => f.FolderId).Except(ctx.Folders.Select(f => f.Id));

            await this.commandsFactory.Create <RemoveFolderCommand>().Setup(toRemove.ToArray()).ExecuteAsync();
        }
        private static void Watch(SyncthingContext ctx)
        {
            const string jobName = "SycnthingContextWatch";

            lock (WatchingLock)
            {
                JobManager.RemoveJob(jobName);
                JobManager.AddJob(async() =>
                {
                    var changed = await ctx.ConfigWatcher.ChangedAsync();
                    if (!changed)
                    {
                        return;
                    }

                    var cache = Startup.ApplicationContainer.Resolve <ICache>();
                    cache.Signal(ContextCacheKey);
                }, schedule => schedule.WithName(jobName).ToRunEvery(5).Minutes());
            }
        }
 public MenuViewComponentParam(SyncthingContext context, HashSet <string> allowedFolder)
 {
     Context       = context;
     AllowedFolder = allowedFolder;
 }