diff --git a/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs b/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs new file mode 100644 index 000000000..deda3b046 --- /dev/null +++ b/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs @@ -0,0 +1,39 @@ +using System.Threading; +using System.Threading.Tasks; +using FilterLists.SharedKernel.Apis.Clients; +using MediatR; + +namespace FilterLists.Archival.Application.Commands +{ + public static class ArchiveList + { + public class Command : IRequest + { + public Command(int listId) + { + ListId = listId; + } + + public int ListId { get; } + } + + public class Handler : IRequestHandler + { + private readonly IDirectoryApi _directory; + + public Handler(IDirectoryApi directory) + { + _directory = directory; + } + + public async Task Handle(Command request, CancellationToken cancellationToken) + { + var listDetails = await _directory.GetListDetailsAsync(5, cancellationToken); + + // TODO: archive + + return Unit.Value; + } + } + } +} diff --git a/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs b/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs new file mode 100644 index 000000000..728c5e66c --- /dev/null +++ b/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs @@ -0,0 +1,38 @@ +using System.Threading; +using System.Threading.Tasks; +using FilterLists.Archival.Infrastructure.Scheduling; +using FilterLists.SharedKernel.Apis.Clients; +using MediatR; + +namespace FilterLists.Archival.Application.Commands +{ + public static class EnqueueArchiveAllLists + { + public class Command : IRequest + { + } + + public class Handler : IRequestHandler + { + private readonly IDirectoryApi _directory; + private readonly IMediator _mediator; + + public Handler(IDirectoryApi directory, IMediator mediator) + { + _directory = directory; + _mediator = mediator; + } + + public async Task Handle(Command request, CancellationToken cancellationToken) + { + var lists = await _directory.GetListsAsync(cancellationToken); + foreach (var list in lists) + { + _mediator.Enqueue(new ArchiveList.Command(list.Id)); + } + + return Unit.Value; + } + } + } +} diff --git a/services/Archival/FilterLists.Archival.Application/FilterLists.Archival.Application.csproj b/services/Archival/FilterLists.Archival.Application/FilterLists.Archival.Application.csproj index ac6281922..7b1deb630 100644 --- a/services/Archival/FilterLists.Archival.Application/FilterLists.Archival.Application.csproj +++ b/services/Archival/FilterLists.Archival.Application/FilterLists.Archival.Application.csproj @@ -17,7 +17,6 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj b/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj index 08d536c58..c05d1a26a 100644 --- a/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj +++ b/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj @@ -20,6 +20,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ConfigurationExtensions.cs b/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ConfigurationExtensions.cs index 2381be9bd..e5fff0973 100644 --- a/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ConfigurationExtensions.cs +++ b/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ConfigurationExtensions.cs @@ -1,4 +1,5 @@ using Hangfire; +using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -13,7 +14,11 @@ internal static class ConfigurationExtensions public static void AddSchedulingServices(this IServiceCollection services, IConfiguration configuration) { _redis = ConnectionMultiplexer.Connect(configuration.GetConnectionString("SchedulingConnection")); - services.AddHangfire(c => c.UseRedisStorage(_redis)); + services.AddHangfire((provider, globalConfiguration) => + { + var mediator = provider.GetService(); + globalConfiguration.UseRedisStorage(_redis).UseMediatR(mediator); + }); } public static void UseScheduling(this IApplicationBuilder app) diff --git a/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/EnqueueMediatR.cs b/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/EnqueueMediatR.cs new file mode 100644 index 000000000..f645ade5c --- /dev/null +++ b/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/EnqueueMediatR.cs @@ -0,0 +1,57 @@ +using System; +using Hangfire; +using MediatR; +using Newtonsoft.Json; + +namespace FilterLists.Archival.Infrastructure.Scheduling +{ + /// https://codeopinion.com/background-commands-mediatr-hangfire/ + internal static class HangfireExtension + { + public static IGlobalConfiguration UseMediatR(this IGlobalConfiguration config, IMediator mediator) + { + config.UseActivator(new MediatRJobActivator(mediator)); + GlobalConfiguration.Configuration.UseSerializerSettings( + new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.Objects}); + return config; + } + } + + internal class MediatRJobActivator : JobActivator + { + private readonly IMediator _mediator; + + public MediatRJobActivator(IMediator mediator) + { + _mediator = mediator; + } + + public override object ActivateJob(Type type) + { + return new HangfireMediator(_mediator); + } + } + + internal class HangfireMediator + { + private readonly IMediator _mediator; + + public HangfireMediator(IMediator mediator) + { + _mediator = mediator; + } + + public void SendCommand(IRequest request) + { + _mediator.Send(request); + } + } + + public static class MediatRExtension + { + public static void Enqueue(this IMediator mediator, IRequest request) + { + BackgroundJob.Enqueue(m => m.SendCommand(request)); + } + } +}