Skip to content

Commit

Permalink
feat: Extremly reduced runtime of service (and db load)
Browse files Browse the repository at this point in the history
  • Loading branch information
linkdotnet committed Mar 28, 2024
1 parent b8258d0 commit d9ddb0f
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@

private void RunVisitTransformer()
{
InstantJobRegistry.AddInstantJob<TransformBlogPostRecordsService>();
InstantJobRegistry.AddInstantJob<TransformBlogPostRecordsJob>();
ToastService.ShowInfo("Transformer was started.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@

namespace LinkDotNet.Blog.Web.Features;

public sealed partial class TransformBlogPostRecordsService : IJob
public sealed partial class TransformBlogPostRecordsJob : IJob
{
private static readonly SemaphoreSlim Semaphore = new(1, 1);
private readonly IRepository<BlogPost> blogPostRepository;
private readonly IRepository<UserRecord> userRecordRepository;
private readonly IRepository<BlogPostRecord> blogPostRecordRepository;
private readonly ILogger<TransformBlogPostRecordsService> logger;
private readonly ILogger<TransformBlogPostRecordsJob> logger;

public TransformBlogPostRecordsService(
public TransformBlogPostRecordsJob(
IRepository<BlogPost> blogPostRepository,
IRepository<UserRecord> userRecordRepository,
IRepository<BlogPostRecord> blogPostRecordRepository,
ILogger<TransformBlogPostRecordsService> logger)
ILogger<TransformBlogPostRecordsJob> logger)
{
this.blogPostRepository = blogPostRepository;
this.userRecordRepository = userRecordRepository;
Expand Down Expand Up @@ -110,8 +110,14 @@ private async Task TransformRecordsAsync()
var userRecords = await userRecordRepository.GetAllAsync(
filter: r => r.UrlClicked.StartsWith("blogPost/"));

var newBlogPostRecords = GetBlogPostRecords(blogPosts, userRecords);
var oldBlogPostRecords = await blogPostRecordRepository.GetAllAsync();
var newBlogPostRecords = GetBlogPostRecords(blogPosts, userRecords).ToArray();
if (newBlogPostRecords.Length == 0)
{
return;
}

var earliestDate = newBlogPostRecords.MinBy(r => r.DateClicked).DateClicked;
var oldBlogPostRecords = await blogPostRecordRepository.GetAllAsync(f => f.DateClicked >= earliestDate);

var mergedRecords = MergeRecords(newBlogPostRecords, oldBlogPostRecords);

Expand All @@ -123,10 +129,10 @@ private async Task TransformRecordsAsync()
LogDeletedUserRecords();
}

[LoggerMessage(Level = LogLevel.Information, Message = $"{nameof(TransformBlogPostRecordsService)} is starting")]
[LoggerMessage(Level = LogLevel.Information, Message = $"{nameof(TransformBlogPostRecordsJob)} is starting")]
private partial void LogTransformStarted();

[LoggerMessage(Level = LogLevel.Information, Message = $"{nameof(TransformBlogPostRecordsService)} is stopping")]
[LoggerMessage(Level = LogLevel.Information, Message = $"{nameof(TransformBlogPostRecordsJob)} is stopping")]
private partial void LogTransformStopped();

[LoggerMessage(Level = LogLevel.Information, Message = "Deleting {RecordCount} records from UserRecord-Table")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ public static void AddBackgroundServices(this IServiceCollection services)

services.AddNCronJob(p => p.TimerInterval = TimeSpan.FromSeconds(30));
services.AddCronJob<BlogPostPublisher>(p => p.CronExpression = "* * * * *");
services.AddCronJob<TransformBlogPostRecordsService>(p => p.CronExpression = "0 * * * *");
services.AddCronJob<TransformBlogPostRecordsJob>(p => p.CronExpression = "0 * * * *");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,24 @@

namespace LinkDotNet.Blog.IntegrationTests.Web.Features;

public class TransformBlogPostRecordsServiceTests : SqlDatabaseTestBase<BlogPost>
public class TransformBlogPostRecordsJobTests : SqlDatabaseTestBase<BlogPost>
{
private readonly TransformBlogPostRecordsService sut;
private readonly TransformBlogPostRecordsJob sut;
private readonly IRepository<BlogPostRecord> blogPostRecordRepository;
private readonly IRepository<UserRecord> userRecordRepository;

public TransformBlogPostRecordsServiceTests()
public TransformBlogPostRecordsJobTests()
{
blogPostRecordRepository =
new Repository<BlogPostRecord>(DbContextFactory, Substitute.For<ILogger<Repository<BlogPostRecord>>>());
userRecordRepository =
new Repository<UserRecord>(DbContextFactory, Substitute.For<ILogger<Repository<UserRecord>>>());

sut = new TransformBlogPostRecordsService(
sut = new TransformBlogPostRecordsJob(
Repository,
userRecordRepository,
blogPostRecordRepository,
Substitute.For<ILogger<TransformBlogPostRecordsService>>());
Substitute.For<ILogger<TransformBlogPostRecordsJob>>());
}

[Fact]
Expand Down Expand Up @@ -78,4 +78,38 @@ public async Task ShouldTransformRecords()
post3Record.Should().NotBeNull();
post3Record.Clicks.Should().Be(1);
}

[Fact]
public async Task ShouldMergeRecordsWhenThereAreAlreadyEntries()
{
// Arrange
var someDate = new DateOnly(2023, 08, 13);
var blogPost = new BlogPostBuilder().WithUpdatedDate(someDate.ToDateTime(default)).Build();

await Repository.StoreAsync(blogPost);
List<UserRecord> userRecords =
[
new() { Id = "A", DateClicked = someDate, UrlClicked = $"blogPost/{blogPost.Id}" },
new() { Id = "B", DateClicked = someDate, UrlClicked = $"blogPost/{blogPost.Id}" },
new() { Id = "C", DateClicked = someDate.AddDays(1), UrlClicked = $"blogPost/{blogPost.Id}" },
];
await userRecordRepository.StoreBulkAsync(userRecords);

List<BlogPostRecord> blogPostRecords =
[
new() { BlogPostId = blogPost.Id, DateClicked = someDate.AddDays(-1), Clicks = 1 },
new() { BlogPostId = blogPost.Id, DateClicked = someDate, Clicks = 1 },
];
await blogPostRecordRepository.StoreBulkAsync(blogPostRecords);

// Act
await sut.RunAsync(new(null), default);

// Assert
var records = await blogPostRecordRepository.GetAllAsync();
records.Count.Should().Be(3);
records[0].Clicks.Should().Be(1);
records[1].Clicks.Should().Be(3);
records[2].Clicks.Should().Be(1);
}
}

0 comments on commit d9ddb0f

Please sign in to comment.