public override async Task <List <Article> > GetArticles(Dictionary <string, string> query, string authedUsername = null)
        {
            List <int> articleIds = _articleRepository.GetAllArticleIds();

            if (null != query.GetValueOrDefault("tag"))
            {
                Int32 tagId = _tagsRepository.GetTagId(query.GetValueOrDefault("tag"));
                articleIds = articleIds.Intersect(_articleTagsRepository.GetArticlesWithTag(tagId)).ToList();
            }
            if (null != query.GetValueOrDefault("author"))
            {
                IdentityUser author = await _userManager.FindByNameAsync(query.GetValueOrDefault("author"));

                articleIds = articleIds.Intersect(_articleRepository.GetArticlesByAuthorId(author?.Id).Select(e => e.Id).ToList()).ToList();
            }
            if (null != query.GetValueOrDefault("favorited"))
            {
                IdentityUser favoritedUser = await _userManager.FindByNameAsync(query.GetValueOrDefault("favorited"));

                articleIds = articleIds.Intersect(_favoriteArticleRepository.GetFavoriteArticlesForUser(favoritedUser?.Id)).ToList();
            }
            List <ArticleDAO> articleDaos = _articleRepository.GetArticlesByArticleIds(articleIds);

            if (null != query.GetValueOrDefault("offset"))
            {
                articleDaos = (List <ArticleDAO>)articleDaos.Skip(Convert.ToInt32(query.GetValueOrDefault("offset")));
            }
            if (null != query.GetValueOrDefault("limit"))
            {
                articleDaos = (List <ArticleDAO>)articleDaos.Take(Convert.ToInt32(query.GetValueOrDefault("limit")));
            }
            List <Article> articles = new List <Article>();

            foreach (ArticleDAO articleDao in articleDaos)
            {
                articles.Add(await CreateArticleFromDAO(articleDao, authedUsername));
            }
            return(articles);
        }