public async Task <IEnumerable <Category> > GetAllCategoriesAsync(string[] roles)
    {
        var categories = await GetCachedValueAsync(
            () => _cache.GetCategoriesAsync(roles),
            () => _repo.GetAllCategoriesAsync(roles)
            );

        return(categories ?? new List <Category>());
    }
    // TODO: support removing categories and permissions from cache
    async Task UpdateCategoryCache(CancellationToken stoppingToken)
    {
        if (stoppingToken.IsCancellationRequested)
        {
            return;
        }

        if (await _cache.GetStatusAsync() != CacheStatus.InitializationSucceeded)
        {
            await _cache.SetStatusAsync(CacheStatus.Initializing);
        }

        var dbCategoriesAndRoles = await _repo.GetCategoriesAndRolesAsync();

        var allRoles     = dbCategoriesAndRoles.SelectMany(x => x.Roles).Distinct().ToArray();
        var dbCategories = await _repo.GetAllCategoriesAsync(allRoles);

        var cacheCategories = await _cache.GetCategoriesAsync(allRoles);

        var updatedCategories = dbCategories.Except(cacheCategories.Item ?? new List <Category>());

        if (updatedCategories.Count() > 0)
        {
            var securedCategories = updatedCategories
                                    .Select(category => new SecuredResource <Category>(
                                                category,
                                                dbCategoriesAndRoles
                                                .First(x => x.Id == category.Id)
                                                .Roles
                                                ));

            await _cache.AddCategoriesAsync(securedCategories);

            _logger.LogInformation("{service} updated {count} video categories", nameof(VideoCacheProcessingService), updatedCategories.Count());
        }

        await UpdateVideoCache(dbCategories, dbCategoriesAndRoles, stoppingToken);

        if (stoppingToken.IsCancellationRequested)
        {
            return;
        }

        await _cache.SetStatusAsync(CacheStatus.InitializationSucceeded);
    }