From 29db802eba2ac23297ee041240e9b6103afeea21 Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Sun, 13 Sep 2020 20:56:34 -0500 Subject: [PATCH] =?UTF-8?q?feat(archival):=20=E2=9C=A8=20schedule=20daily?= =?UTF-8?q?=20archival?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/EnqueueArchiveAllLists.cs | 2 +- .../ConfigurationExtensions.cs | 15 ++++++++- ...{EnqueueMediatR.cs => ScheduleMediator.cs} | 32 ++++++++++++------- services/FilterLists.sln.DotSettings | 11 ++++--- 4 files changed, 41 insertions(+), 19 deletions(-) rename services/Archival/FilterLists.Archival.Infrastructure/Scheduling/{EnqueueMediatR.cs => ScheduleMediator.cs} (61%) diff --git a/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs b/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs index 728c5e66c..a020d425a 100644 --- a/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs +++ b/services/Archival/FilterLists.Archival.Application/Commands/EnqueueArchiveAllLists.cs @@ -28,7 +28,7 @@ public async Task Handle(Command request, CancellationToken cancellationTo var lists = await _directory.GetListsAsync(cancellationToken); foreach (var list in lists) { - _mediator.Enqueue(new ArchiveList.Command(list.Id)); + _mediator.EnqueueBackgroundJob(new ArchiveList.Command(list.Id)); } return Unit.Value; diff --git a/services/Archival/FilterLists.Archival.Application/ConfigurationExtensions.cs b/services/Archival/FilterLists.Archival.Application/ConfigurationExtensions.cs index 835242621..cebda2456 100644 --- a/services/Archival/FilterLists.Archival.Application/ConfigurationExtensions.cs +++ b/services/Archival/FilterLists.Archival.Application/ConfigurationExtensions.cs @@ -1,4 +1,8 @@ -using FilterLists.Archival.Infrastructure; +using System; +using FilterLists.Archival.Application.Commands; +using FilterLists.Archival.Infrastructure; +using FilterLists.Archival.Infrastructure.Scheduling; +using Hangfire; using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; @@ -23,6 +27,15 @@ public static void AddApplicationServices(this IServiceCollection services, ICon public static void UseApplication(this IApplicationBuilder app) { app.UseInfrastructure(); + app.ScheduleArchival(); + } + + private static void ScheduleArchival(this IApplicationBuilder app) + { + _ = app ?? throw new ArgumentNullException(nameof(app)); + + var mediator = (IMediator)app.ApplicationServices.GetService(typeof(IMediator)); + mediator.AddOrUpdateRecurringJob(new EnqueueArchiveAllLists.Command(), Cron.Daily); } } } diff --git a/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/EnqueueMediatR.cs b/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ScheduleMediator.cs similarity index 61% rename from services/Archival/FilterLists.Archival.Infrastructure/Scheduling/EnqueueMediatR.cs rename to services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ScheduleMediator.cs index f645ade5c..60e7deb78 100644 --- a/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/EnqueueMediatR.cs +++ b/services/Archival/FilterLists.Archival.Infrastructure/Scheduling/ScheduleMediator.cs @@ -6,22 +6,38 @@ namespace FilterLists.Archival.Infrastructure.Scheduling { /// https://codeopinion.com/background-commands-mediatr-hangfire/ + public static class MediatorExtensions + { + public static void EnqueueBackgroundJob(this IMediator _, IRequest request) + { + BackgroundJob.Enqueue(m => m.Send(request)); + } + + public static void AddOrUpdateRecurringJob( + this IMediator _, + IRequest request, + Func cronExpression) + { + RecurringJob.AddOrUpdate(m => m.Send(request), cronExpression); + } + } + internal static class HangfireExtension { public static IGlobalConfiguration UseMediatR(this IGlobalConfiguration config, IMediator mediator) { - config.UseActivator(new MediatRJobActivator(mediator)); + config.UseActivator(new MediatorJobActivator(mediator)); GlobalConfiguration.Configuration.UseSerializerSettings( new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.Objects}); return config; } } - internal class MediatRJobActivator : JobActivator + internal class MediatorJobActivator : JobActivator { private readonly IMediator _mediator; - public MediatRJobActivator(IMediator mediator) + public MediatorJobActivator(IMediator mediator) { _mediator = mediator; } @@ -41,17 +57,9 @@ public HangfireMediator(IMediator mediator) _mediator = mediator; } - public void SendCommand(IRequest request) + public void Send(IRequest request) { _mediator.Send(request); } } - - public static class MediatRExtension - { - public static void Enqueue(this IMediator mediator, IRequest request) - { - BackgroundJob.Enqueue(m => m.SendCommand(request)); - } - } } diff --git a/services/FilterLists.sln.DotSettings b/services/FilterLists.sln.DotSettings index 076a77a76..df1b253f7 100644 --- a/services/FilterLists.sln.DotSettings +++ b/services/FilterLists.sln.DotSettings @@ -1,4 +1,7 @@ - + <?xml version="1.0" encoding="utf-16"?><Profile name="FilterLists Cleanup"><CSReorderTypeMembers>True</CSReorderTypeMembers><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" /><RemoveCodeRedundanciesVB>True</RemoveCodeRedundanciesVB><Xaml.RedundantFreezeAttribute>True</Xaml.RedundantFreezeAttribute><Xaml.RemoveRedundantModifiersAttribute>True</Xaml.RemoveRedundantModifiersAttribute><Xaml.RemoveRedundantNameAttribute>True</Xaml.RemoveRedundantNameAttribute><Xaml.RemoveRedundantResource>True</Xaml.RemoveRedundantResource><Xaml.RemoveRedundantCollectionProperty>True</Xaml.RemoveRedundantCollectionProperty><Xaml.RemoveRedundantAttachedPropertySetter>True</Xaml.RemoveRedundantAttachedPropertySetter><Xaml.RemoveRedundantStyledValue>True</Xaml.RemoveRedundantStyledValue><Xaml.RemoveRedundantNamespaceAlias>True</Xaml.RemoveRedundantNamespaceAlias><Xaml.RemoveForbiddenResourceName>True</Xaml.RemoveForbiddenResourceName><Xaml.RemoveRedundantGridDefinitionsAttribute>True</Xaml.RemoveRedundantGridDefinitionsAttribute><Xaml.RemoveRedundantGridSpanAttribut>True</Xaml.RemoveRedundantGridSpanAttribut><Xaml.RemoveRedundantUpdateSourceTriggerAttribute>True</Xaml.RemoveRedundantUpdateSourceTriggerAttribute><Xaml.RemoveRedundantBindingModeAttribute>True</Xaml.RemoveRedundantBindingModeAttribute><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><VBOptimizeImports>True</VBOptimizeImports><VBShortenReferences>True</VBShortenReferences><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><VBReformatCode>True</VBReformatCode><VBFormatDocComments>True</VBFormatDocComments><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments></Profile> FilterLists Cleanup NEVER @@ -7,9 +10,7 @@ CHOP_IF_LONG CHOP_IF_LONG CHOP_IF_LONG - True - True - True - True + True + True True True \ No newline at end of file