protected Task <Option <Article, Error> > GetArticleBySlug(string slug) =>
 slug.SomeWhen <string, Error>(s => !string.IsNullOrEmpty(s), "The slug must not be empty.")
 .Map(s => s.ToLower())
 .FlatMapAsync(async s =>
               await AllArticlesQueryable
               .OrderByDescending(a => a.CreatedAt)
               .FirstOrDefaultAsync(a => a.Slug.ToLower() == slug.ToLower())
               .SomeNotNull <Article, Error>($"No article with slug '{slug}' was found."));
        public Task <Option <ArticleModel[], Error> > GetFeed(string viewingUserId, int limit = 20, int offset = 0) =>
        GetUserByIdOrError(viewingUserId)
        .MapAsync(async viewingUser =>
        {
            var followedUserIds = viewingUser
                                  .Following
                                  .Select(f => f.FollowingId)
                                  .ToArray();

            var articles = await AllArticlesQueryable
                           .Where(a => followedUserIds.Contains(a.Author.Id))
                           .Skip(offset)
                           .Take(limit)
                           .ToArrayAsync();

            return(await ToArticleModelsAsync(viewingUserId.Some(), articles));
        });