public void DeleteFoldersInternal(UserAccount userAccount,
                                          int[] ids)
        {
            var folders = dataContext.SubscriptionFolders.AsQueryable()
                          .Where(x => x.UserId == userAccount.Id)
                          .Where(x => ids.Contains(x.Id))
                          .ToArray();

            foreach (var folder in folders)
            {
                var subsToDelete = dataContext.GetSubscriptionsRecursive(folder);
                DeleteInternal(userAccount, subsToDelete);
            }

            var foldersToDelete = folders.SelectMany(dataContext.GetFoldersRecursive).ToArray();

            dataContext.SubscriptionFolders.RemoveRange(foldersToDelete);
            dataContext.SaveChanges();

            FoldersDeleted?.Invoke(this, new SubscriptionFoldersDeletedEventArgs()
            {
                User      = userAccount,
                FolderIds = foldersToDelete.Select(x => x.Id).ToArray()
            });
        }
        public async Task DeleteFolders(UserAccount userAccount,
                                        int[] ids,
                                        bool recursive,
                                        bool deleteFiles)
        {
            if (recursive)
            {
                if (deleteFiles)
                {
                    await DeleteSubscriptionFolderFilesJob.Schedule(scheduler, ids, true);
                }
                else
                {
                    DeleteFoldersInternal(userAccount, ids);
                }
            }
            else
            {
                // Reparent subscriptions and folders (move them to the parent)
                var folders = dataContext.SubscriptionFolders.AsQueryable()
                              .Where(x => x.UserId == userAccount.Id)
                              .Where(x => ids.Contains(x.Id))
                              .ToArray();

                foreach (var folder in folders)
                {
                    dataContext.SubscriptionFolders.AsQueryable()
                    .Where(x => x.ParentId.HasValue && x.ParentId.Value == folder.Id)
                    .ForEach(x =>
                    {
                        x.ParentId = folder.ParentId;
                        FolderUpdated?.Invoke(this, new SubscriptionFolderUpdatedEventArgs()
                        {
                            User = userAccount, Folder = x
                        });
                    });

                    dataContext.Subscriptions.AsQueryable()
                    .Where(x => x.ParentFolderId.HasValue && x.ParentFolderId.Value == folder.Id)
                    .ForEach(x =>
                    {
                        x.ParentFolderId = folder.ParentId;
                        SubscriptionUpdated?.Invoke(this, new SubscriptionUpdatedEventArgs()
                        {
                            User = userAccount, Subscription = x
                        });
                    });
                }

                // Delete folders
                var foldersToDelete = dataContext.SubscriptionFolders.AsQueryable()
                                      .Where(x => ids.Contains(x.Id));

                dataContext.SubscriptionFolders.RemoveRange(foldersToDelete);
                dataContext.SaveChanges();

                FoldersDeleted?.Invoke(this, new SubscriptionFoldersDeletedEventArgs()
                {
                    User = userAccount, FolderIds = ids
                });
            }
        }