diff --git a/src/Robware.Data/BlogRepository.cs b/src/Robware.Data/BlogRepository.cs index 24191b6..5696a20 100644 --- a/src/Robware.Data/BlogRepository.cs +++ b/src/Robware.Data/BlogRepository.cs @@ -33,15 +33,20 @@ namespace Robware.Data { await _collection.UpdateOneAsync(post => post.Id == id, update); } - public async Task> GetAllPostsAsync() => MapStateToPost((await _collection.FindAsync(post => true)).ToEnumerable()); + public async Task> GetAllPostsAsync() => MapStateToPost((await _collection.FindAsync(post => !post.Deleted)).ToEnumerable()); - public async Task GetCountAsync() => (int)await _collection.CountDocumentsAsync(post => !post.Deleted); + private async Task GetCountAsync(bool includeAll) => (int)await _collection.CountDocumentsAsync(post => includeAll || (!post.Deleted && string.IsNullOrEmpty(post.Content))); + + public async Task GetCountAsync() => await GetCountAsync(false); public async Task GetLatestPostAsync() => (await GetLatestPostsAsync(1)).FirstOrDefault(); public async Task> GetLatestPostsAsync(int limit, int offset = 0) { - var filter = Builders.Filter.Eq(nameof(BlogPostState.Deleted), false); - var sort = Builders.Sort.Descending(nameof(BlogPostState.Timestamp)); + var filter = Builders.Filter.And( + Builders.Filter.Eq(post => post.Deleted, false), + Builders.Filter.Ne(post => post.Content, null) + ); + var sort = Builders.Sort.Descending(post => post.Timestamp); var options = new FindOptions { Sort = sort, Limit = limit, @@ -64,12 +69,16 @@ namespace Robware.Data { public async Task SavePost(BlogPost post) { if (post.Id == 0) { - post.Id = (await GetCountAsync()) + 1; + post.Id = (await GetCountAsync(true)) + 1; post.Timestamp = DateTime.Now; } var mongoPost = new BlogPostState(post); - await _collection.InsertOneAsync(mongoPost); + var filter = Builders.Filter.Eq(p => p.Id, post.Id); + var options = new ReplaceOptions { + IsUpsert = true + }; + await _collection.ReplaceOneAsync(filter, mongoPost, options); return post; }