From 5f79af2e18c431d5296843499d36151af9e8b1fa Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 10 Aug 2018 11:20:04 -0400 Subject: [PATCH] move premium renewal job to hosted job service --- src/Api/Startup.cs | 3 +- src/Billing/Jobs/JobsHostedService.cs | 40 +++++++++++++++++++ .../PremiumRenewalRemindersJob.cs} | 35 +++++++--------- src/Billing/Startup.cs | 16 +++++++- 4 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 src/Billing/Jobs/JobsHostedService.cs rename src/Billing/{Controllers/JobsController.cs => Jobs/PremiumRenewalRemindersJob.cs} (74%) diff --git a/src/Api/Startup.cs b/src/Api/Startup.cs index 84a4dda613..7a760a310c 100644 --- a/src/Api/Startup.cs +++ b/src/Api/Startup.cs @@ -159,7 +159,8 @@ namespace Bit.Api } if(e.Level == LogEventLevel.Information && - (context.Contains(typeof(IpRateLimitMiddleware).FullName) || context.StartsWith("\"Bit.Api.Jobs"))) + (context.Contains(typeof(IpRateLimitMiddleware).FullName) || + context.StartsWith("\"Bit.Api.Jobs") || context.StartsWith("\"Bit.Core.Jobs"))) { return true; } diff --git a/src/Billing/Jobs/JobsHostedService.cs b/src/Billing/Jobs/JobsHostedService.cs new file mode 100644 index 0000000000..cc5a2faa16 --- /dev/null +++ b/src/Billing/Jobs/JobsHostedService.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Bit.Core.Jobs; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Quartz; + +namespace Bit.Billing.Jobs +{ + public class JobsHostedService : BaseJobsHostedService + { + public JobsHostedService( + IServiceProvider serviceProvider, + ILogger logger, + ILogger listenerLogger) + : base(serviceProvider, logger, listenerLogger) { } + + public override async Task StartAsync(CancellationToken cancellationToken) + { + var everyDayAtNinePmTrigger = TriggerBuilder.Create() + .StartNow() + .WithCronSchedule("0 0 21 * * ?") + .Build(); + + Jobs = new List> + { + new Tuple(typeof(PremiumRenewalRemindersJob), everyDayAtNinePmTrigger) + }; + + await base.StartAsync(cancellationToken); + } + + public static void AddJobsServices(IServiceCollection services) + { + services.AddTransient(); + } + } +} diff --git a/src/Billing/Controllers/JobsController.cs b/src/Billing/Jobs/PremiumRenewalRemindersJob.cs similarity index 74% rename from src/Billing/Controllers/JobsController.cs rename to src/Billing/Jobs/PremiumRenewalRemindersJob.cs index 92ee388e00..94dc35e875 100644 --- a/src/Billing/Controllers/JobsController.cs +++ b/src/Billing/Jobs/PremiumRenewalRemindersJob.cs @@ -1,27 +1,30 @@ -using Bit.Core; -using Bit.Core.Repositories; -using Bit.Core.Services; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Options; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using Bit.Core; +using Bit.Core.Jobs; +using Bit.Core.Repositories; +using Bit.Core.Services; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Quartz; -namespace Bit.Billing.Controllers +namespace Bit.Billing.Jobs { - [Route("jobs")] - public class JobsController : Controller + public class PremiumRenewalRemindersJob : BaseJob { private readonly BillingSettings _billingSettings; private readonly GlobalSettings _globalSettings; private readonly IUserRepository _userRepository; private readonly IMailService _mailService; - public JobsController( + public PremiumRenewalRemindersJob( IOptions billingSettings, GlobalSettings globalSettings, IUserRepository userRepository, - IMailService mailService) + IMailService mailService, + ILogger logger) + : base(logger) { _billingSettings = billingSettings?.Value; _globalSettings = globalSettings; @@ -29,14 +32,8 @@ namespace Bit.Billing.Controllers _mailService = mailService; } - [HttpPost("premium-renewal-reminders")] - public async Task PostPremiumRenewalReminders([FromQuery] string key) + protected async override Task ExecuteJobAsync(IJobExecutionContext context) { - if(key != _billingSettings.JobsKey) - { - return new BadRequestResult(); - } - var users = await _userRepository.GetManyByPremiumRenewalAsync(); foreach(var user in users) { @@ -50,8 +47,6 @@ namespace Bit.Billing.Controllers } await _userRepository.UpdateRenewalReminderDateAsync(user.Id, DateTime.UtcNow); } - - return new OkResult(); } } } diff --git a/src/Billing/Startup.cs b/src/Billing/Startup.cs index 87e7b936c5..fc5716916e 100644 --- a/src/Billing/Startup.cs +++ b/src/Billing/Startup.cs @@ -58,6 +58,10 @@ namespace Bit.Billing config.Filters.Add(new LoggingExceptionHandlerFilterAttribute()); }); services.Configure(options => options.LowercaseUrls = true); + + // Jobs service + Jobs.JobsHostedService.AddJobsServices(services); + services.AddHostedService(); } public void Configure( @@ -67,7 +71,17 @@ namespace Bit.Billing GlobalSettings globalSettings, ILoggerFactory loggerFactory) { - loggerFactory.AddSerilog(app, env, appLifetime, globalSettings, (e) => e.Level >= LogEventLevel.Error); + loggerFactory.AddSerilog(app, env, appLifetime, globalSettings, (e) => + { + var context = e.Properties["SourceContext"].ToString(); + if(e.Level == LogEventLevel.Information && + (context.StartsWith("\"Bit.Billing.Jobs") || context.StartsWith("\"Bit.Core.Jobs"))) + { + return true; + } + + return e.Level >= LogEventLevel.Error; + }); if(env.IsDevelopment()) {