From f8e8774d8cf0e626b7ee1cacab8d39ac602af497 Mon Sep 17 00:00:00 2001 From: Robert Marshall Date: Wed, 15 Jul 2020 18:32:38 +0100 Subject: [PATCH] Find the latest ID to set the new ID against instead of assuming count is good --- src/Robware.Data.Tests/BlogRepositoryTests.cs | 7 ++++++- src/Robware.Data/BlogRepository.cs | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Robware.Data.Tests/BlogRepositoryTests.cs b/src/Robware.Data.Tests/BlogRepositoryTests.cs index b928982..cea8120 100644 --- a/src/Robware.Data.Tests/BlogRepositoryTests.cs +++ b/src/Robware.Data.Tests/BlogRepositoryTests.cs @@ -4,6 +4,7 @@ using NSubstitute; using Robware.Blog; using Robware.Blog.Data.State; using System; +using System.Threading; using System.Threading.Tasks; using Xunit; @@ -11,8 +12,12 @@ namespace Robware.Data.Tests { public class BlogRepositoryTests { [Fact] public async Task SavePost_WithNewPost_GetsNewIdAndSetsTimestampAndSavesAsync() { + var findResult = Substitute.For>(); + findResult.Current.Returns(new[] { new BlogPostState { Id = 10 } }); + findResult.MoveNext(Arg.Any()).Returns(true, false); + findResult.MoveNextAsync(Arg.Any()).Returns(true, false); var collection = Substitute.For>(); - collection.CountDocumentsAsync(Arg.Any>()).Returns(10); + collection.FindAsync(Arg.Any>(), Arg.Any>()).Returns(findResult); var database = Substitute.For(); database.GetCollection("blog").Returns(collection); diff --git a/src/Robware.Data/BlogRepository.cs b/src/Robware.Data/BlogRepository.cs index 5696a20..00cb597 100644 --- a/src/Robware.Data/BlogRepository.cs +++ b/src/Robware.Data/BlogRepository.cs @@ -67,9 +67,19 @@ namespace Robware.Data { public async Task GetPostByUrlAsync(string url) => await GetPostAsync(post => post.Url == url && !post.Deleted); + private async Task GetLastPostId() { + var sort = Builders.Sort.Descending(post => post.Id); + var options = new FindOptions { + Sort = sort, + Limit = 1 + }; + var states = (await _collection.FindAsync(_ => true, options)).ToEnumerable(); + return states.First().Id; + } + public async Task SavePost(BlogPost post) { if (post.Id == 0) { - post.Id = (await GetCountAsync(true)) + 1; + post.Id = (await GetLastPostId()) + 1; post.Timestamp = DateTime.Now; }