[FA-misc] Mass transit overhaul, needs testing and review

This commit is contained in:
gamer147
2026-01-21 23:16:31 -05:00
parent 055ef33666
commit f88f340d0a
97 changed files with 1150 additions and 858 deletions

View File

@@ -0,0 +1,53 @@
using FictionArchive.Common.Enums;
using FictionArchive.Service.Shared.MassTransit.Contracts.Events;
using MassTransit;
namespace FictionArchive.Service.NovelService.Services.Consumers;
public class FileUploadCompletedEventConsumer : IConsumer<FileUploadCompletedEvent>
{
private readonly ILogger<FileUploadCompletedEventConsumer> _logger;
private readonly NovelServiceDbContext _dbContext;
private readonly NovelUpdateService _novelUpdateService;
public FileUploadCompletedEventConsumer(
ILogger<FileUploadCompletedEventConsumer> logger,
NovelServiceDbContext dbContext,
NovelUpdateService novelUpdateService)
{
_logger = logger;
_dbContext = dbContext;
_novelUpdateService = novelUpdateService;
}
public async Task Consume(ConsumeContext<FileUploadCompletedEvent> context)
{
var @event = context.Message;
var image = await _dbContext.Images.FindAsync(@event.RequestId);
if (image == null)
{
// Not a request we care about.
_logger.LogDebug(
"FileUploadCompletedEvent received for unknown image: {RequestId}",
@event.RequestId);
return;
}
if (@event.Status == RequestStatus.Failed)
{
_logger.LogError(
"Image upload failed for image with id {ImageId}: {ErrorMessage}",
image.Id, @event.ErrorMessage);
return;
}
if (@event.Status == RequestStatus.Success)
{
_logger.LogInformation(
"Image upload succeeded for image with id {ImageId}",
image.Id);
await _novelUpdateService.UpdateImage(image.Id, @event.FileAccessUrl!);
}
}
}

View File

@@ -0,0 +1,26 @@
using FictionArchive.Service.Shared.MassTransit.Contracts.Commands;
using MassTransit;
namespace FictionArchive.Service.NovelService.Services.Consumers;
public class ImportNovelCommandConsumer : IConsumer<ImportNovelCommand>
{
private readonly ILogger<ImportNovelCommandConsumer> _logger;
private readonly NovelUpdateService _novelUpdateService;
public ImportNovelCommandConsumer(
ILogger<ImportNovelCommandConsumer> logger,
NovelUpdateService novelUpdateService)
{
_logger = logger;
_novelUpdateService = novelUpdateService;
}
public async Task Consume(ConsumeContext<ImportNovelCommand> context)
{
var command = context.Message;
_logger.LogInformation("Processing ImportNovelCommand for URL: {NovelUrl}", command.NovelUrl);
await _novelUpdateService.ImportNovel(command.NovelUrl);
}
}

View File

@@ -0,0 +1,28 @@
using FictionArchive.Service.Shared.MassTransit.Contracts.Commands;
using MassTransit;
namespace FictionArchive.Service.NovelService.Services.Consumers;
public class PullChapterContentCommandConsumer : IConsumer<PullChapterContentCommand>
{
private readonly ILogger<PullChapterContentCommandConsumer> _logger;
private readonly NovelUpdateService _novelUpdateService;
public PullChapterContentCommandConsumer(
ILogger<PullChapterContentCommandConsumer> logger,
NovelUpdateService novelUpdateService)
{
_logger = logger;
_novelUpdateService = novelUpdateService;
}
public async Task Consume(ConsumeContext<PullChapterContentCommand> context)
{
var command = context.Message;
_logger.LogInformation(
"Processing PullChapterContentCommand for Novel: {NovelId}, Volume: {VolumeId}, Chapter: {ChapterOrder}",
command.NovelId, command.VolumeId, command.ChapterOrder);
await _novelUpdateService.PullChapterContents(command.NovelId, command.VolumeId, command.ChapterOrder);
}
}

View File

@@ -0,0 +1,52 @@
using FictionArchive.Service.NovelService.Models.Localization;
using FictionArchive.Service.Shared.MassTransit.Contracts.Events;
using MassTransit;
using Microsoft.EntityFrameworkCore;
namespace FictionArchive.Service.NovelService.Services.Consumers;
public class TranslationCompletedEventConsumer : IConsumer<TranslationCompletedEvent>
{
private readonly ILogger<TranslationCompletedEventConsumer> _logger;
private readonly NovelServiceDbContext _dbContext;
public TranslationCompletedEventConsumer(
ILogger<TranslationCompletedEventConsumer> logger,
NovelServiceDbContext dbContext)
{
_logger = logger;
_dbContext = dbContext;
}
public async Task Consume(ConsumeContext<TranslationCompletedEvent> context)
{
var @event = context.Message;
var localizationRequest = await _dbContext.LocalizationRequests
.Include(r => r.KeyRequestedForTranslation)
.ThenInclude(lk => lk.Texts)
.FirstOrDefaultAsync(lk => lk.Id == @event.TranslationRequestId);
if (localizationRequest == null)
{
// Not one of our requests, discard it
_logger.LogDebug(
"TranslationCompletedEvent received for unknown request: {RequestId}",
@event.TranslationRequestId);
return;
}
localizationRequest.KeyRequestedForTranslation.Texts.Add(new LocalizationText()
{
Language = localizationRequest.TranslateTo,
Text = @event.TranslatedText,
TranslationEngine = localizationRequest.Engine
});
_dbContext.LocalizationRequests.Remove(localizationRequest);
await _dbContext.SaveChangesAsync();
_logger.LogInformation(
"Completed translation for request: {RequestId}",
@event.TranslationRequestId);
}
}