Skip to content

Commit

Permalink
Replace MQ with ServiceStack Jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
mythz committed Sep 4, 2024
1 parent 0f3a305 commit 34797ba
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 91 deletions.
30 changes: 19 additions & 11 deletions MyApp.ServiceInterface/EmailServices.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.Net.Mail;
using Microsoft.Extensions.Logging;
using ServiceStack;
using MyApp.ServiceModel;
using ServiceStack.Jobs;

namespace MyApp.ServiceInterface;

Expand Down Expand Up @@ -45,16 +45,26 @@ public class SmtpConfig
public string? Bcc { get; set; }
}

/// <summary>
/// Uses a configured SMTP client to send emails
/// </summary>
public class EmailServices(SmtpConfig config, ILogger<EmailServices> log)
// TODO: Uncomment to enable sending emails with SMTP
// : Service
public class SendEmail
{
public string To { get; set; }
public string? ToName { get; set; }
public string Subject { get; set; }
public string? BodyText { get; set; }
public string? BodyHtml { get; set; }
}

[Worker("smtp")]
public class SendEmailCommand(ILogger<SendEmailCommand> logger, IBackgroundJobs jobs, SmtpConfig config)
: SyncCommand<SendEmail>
{
public object Any(SendEmail request)
private static long count = 0;
protected override void Run(SendEmail request)
{
log.LogInformation("Sending email to {Email} with subject {Subject}", request.To, request.Subject);
Interlocked.Increment(ref count);
var log = Request.CreateJobLogger(jobs, logger);
log.LogInformation("Sending {Count} email to {Email} with subject {Subject}",
count, request.To, request.Subject);

using var client = new SmtpClient(config.Host, config.Port);
client.Credentials = new System.Net.NetworkCredential(config.Username, config.Password);
Expand All @@ -80,7 +90,5 @@ public object Any(SendEmail request)
}

client.Send(msg);

return new EmptyResponse();
}
}
15 changes: 0 additions & 15 deletions MyApp.ServiceModel/Emails.cs

This file was deleted.

62 changes: 62 additions & 0 deletions MyApp/Configure.BackgroundJobs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Identity;
using MyApp.Data;
using MyApp.ServiceInterface;
using ServiceStack.Jobs;

[assembly: HostingStartup(typeof(MyApp.ConfigureBackgroundJobs))]

namespace MyApp;

public class ConfigureBackgroundJobs : IHostingStartup
{
public void Configure(IWebHostBuilder builder) => builder
.ConfigureServices(services => {
services.AddPlugin(new CommandsFeature());
services.AddPlugin(new BackgroundsJobFeature());
services.AddHostedService<JobsHostedService>();
}).ConfigureAppHost(afterAppHostInit: appHost => {
var services = appHost.GetApplicationServices();
var jobs = services.GetRequiredService<IBackgroundJobs>();
// Example of registering a Recurring Job to run Every Hour
//jobs.RecurringCommand<MyCommand>(Schedule.Hourly);
});
}

public class JobsHostedService(ILogger<JobsHostedService> log, IBackgroundJobs jobs) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await jobs.StartAsync(stoppingToken);

using var timer = new PeriodicTimer(TimeSpan.FromSeconds(3));
while (!stoppingToken.IsCancellationRequested && await timer.WaitForNextTickAsync(stoppingToken))
{
await jobs.TickAsync();
}
}
}

/// <summary>
/// Sends emails by executing SendEmailCommand in a background job where it's serially processed by 'smtp' worker
/// </summary>
public class EmailSender(IBackgroundJobs jobs) : IEmailSender<ApplicationUser>
{
public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
jobs.EnqueueCommand<SendEmailCommand>(new SendEmail {
To = email,
Subject = subject,
BodyHtml = htmlMessage,
});
return Task.CompletedTask;
}

public Task SendConfirmationLinkAsync(ApplicationUser user, string email, string confirmationLink) =>
SendEmailAsync(email, "Confirm your email", $"Please confirm your account by <a href='{confirmationLink}'>clicking here</a>.");

public Task SendPasswordResetLinkAsync(ApplicationUser user, string email, string resetLink) =>
SendEmailAsync(email, "Reset your password", $"Please reset your password by <a href='{resetLink}'>clicking here</a>.");

public Task SendPasswordResetCodeAsync(ApplicationUser user, string email, string resetCode) =>
SendEmailAsync(email, "Reset your password", $"Please reset your password using the following code: {resetCode}");
}
64 changes: 0 additions & 64 deletions MyApp/Configure.Mq.cs

This file was deleted.

1 change: 1 addition & 0 deletions MyApp/MyApp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.*" />
<PackageReference Include="ServiceStack" Version="8.*" />
<PackageReference Include="ServiceStack.Server" Version="8.*" />
<PackageReference Include="ServiceStack.Jobs" Version="8.*" />
<PackageReference Include="ServiceStack.Ormlite.Sqlite.Data" Version="8.*" />
</ItemGroup>

Expand Down
2 changes: 2 additions & 0 deletions MyApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@

// Add application services.
services.AddSingleton<IEmailSender<ApplicationUser>, IdentityNoOpEmailSender>();
// Uncomment to send emails with SMTP, configure SMTP with "SmtpConfig" in appsettings.json
// services.AddSingleton<IEmailSender<ApplicationUser>, EmailSender>();
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AdditionalUserClaimsPrincipalFactory>();

// Register all services
Expand Down
2 changes: 1 addition & 1 deletion MyApp/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "metadata",
"applicationUrl": "http://localhost:5000",
"applicationUrl": "https://localhost:5001",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
Expand Down

0 comments on commit 34797ba

Please sign in to comment.