🗑️ Remove built-in frontend serving code
This commit is contained in:
31
DysonNetwork.Pass/Mailer/EmailModels.cs
Normal file
31
DysonNetwork.Pass/Mailer/EmailModels.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
namespace DysonNetwork.Pass.Mailer;
|
||||
|
||||
public class LandingEmailModel
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
public required string Link { get; set; }
|
||||
}
|
||||
|
||||
public class AccountDeletionEmailModel
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
public required string Link { get; set; }
|
||||
}
|
||||
|
||||
public class PasswordResetEmailModel
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
public required string Link { get; set; }
|
||||
}
|
||||
|
||||
public class VerificationEmailModel
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
public required string Code { get; set; }
|
||||
}
|
||||
|
||||
public class ContactVerificationEmailModel
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
public required string Link { get; set; }
|
||||
}
|
48
DysonNetwork.Pass/Mailer/EmailService.cs
Normal file
48
DysonNetwork.Pass/Mailer/EmailService.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using DysonNetwork.Shared.Proto;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace DysonNetwork.Pass.Mailer;
|
||||
|
||||
public class EmailService(
|
||||
RingService.RingServiceClient pusher,
|
||||
RazorViewRenderer viewRenderer,
|
||||
ILogger<EmailService> logger
|
||||
)
|
||||
{
|
||||
public async Task SendEmailAsync(
|
||||
string? recipientName,
|
||||
string recipientEmail,
|
||||
string subject,
|
||||
string htmlBody
|
||||
)
|
||||
{
|
||||
await pusher.SendEmailAsync(
|
||||
new SendEmailRequest()
|
||||
{
|
||||
Email = new EmailMessage()
|
||||
{
|
||||
ToName = recipientName,
|
||||
ToAddress = recipientEmail,
|
||||
Subject = subject,
|
||||
Body = htmlBody
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public async Task SendTemplatedEmailAsync<TComponent, TModel>(string? recipientName, string recipientEmail,
|
||||
string subject, TModel model)
|
||||
where TComponent : IComponent
|
||||
{
|
||||
try
|
||||
{
|
||||
var htmlBody = await viewRenderer.RenderComponentToStringAsync<TComponent, TModel>(model);
|
||||
await SendEmailAsync(recipientName, recipientEmail, subject, htmlBody);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
logger.LogError(err, "Failed to render email template...");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
37
DysonNetwork.Pass/Mailer/RazorViewRenderer.cs
Normal file
37
DysonNetwork.Pass/Mailer/RazorViewRenderer.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
|
||||
namespace DysonNetwork.Pass.Mailer;
|
||||
|
||||
public class RazorViewRenderer(
|
||||
IServiceProvider serviceProvider,
|
||||
ILoggerFactory loggerFactory,
|
||||
ILogger<RazorViewRenderer> logger
|
||||
)
|
||||
{
|
||||
public async Task<string> RenderComponentToStringAsync<TComponent, TModel>(TModel? model)
|
||||
where TComponent : IComponent
|
||||
{
|
||||
await using var htmlRenderer = new HtmlRenderer(serviceProvider, loggerFactory);
|
||||
|
||||
return await htmlRenderer.Dispatcher.InvokeAsync(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var dictionary = model?.GetType().GetProperties()
|
||||
.ToDictionary(
|
||||
prop => prop.Name,
|
||||
prop => prop.GetValue(model, null)
|
||||
) ?? new Dictionary<string, object?>();
|
||||
var parameterView = ParameterView.FromDictionary(dictionary);
|
||||
var output = await htmlRenderer.RenderComponentAsync<TComponent>(parameterView);
|
||||
return output.ToHtmlString();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, "Error rendering component {ComponentName}", typeof(TComponent).Name);
|
||||
throw;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user