From a1dbd3f8b88e9c857fd8e97262715b8c8657af48 Mon Sep 17 00:00:00 2001 From: Abdullah Atta Date: Wed, 8 Jul 2026 09:05:58 +0500 Subject: [PATCH] common: simplify email sender api --- Streetwriters.Common/Interfaces/IEmailSender.cs | 3 ++- Streetwriters.Common/Models/Subscription.cs | 15 +++++++++++++++ Streetwriters.Common/Services/EmailSender.cs | 11 ++++------- .../Services/TemplatedEmailSender.cs | 10 +++++----- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Streetwriters.Common/Interfaces/IEmailSender.cs b/Streetwriters.Common/Interfaces/IEmailSender.cs index 570d0c6..fafad17 100644 --- a/Streetwriters.Common/Interfaces/IEmailSender.cs +++ b/Streetwriters.Common/Interfaces/IEmailSender.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Net.Mail; using System.Threading.Tasks; using MimeKit; using MimeKit.Cryptography; @@ -11,7 +12,7 @@ namespace Streetwriters.Common.Interfaces Task SendEmailAsync( string email, EmailTemplate template, - IClient client, + MailAddress from, GnuPGContext? gpgContext = null, Dictionary? attachments = null ); diff --git a/Streetwriters.Common/Models/Subscription.cs b/Streetwriters.Common/Models/Subscription.cs index 6272bcf..0ddfa2c 100644 --- a/Streetwriters.Common/Models/Subscription.cs +++ b/Streetwriters.Common/Models/Subscription.cs @@ -93,6 +93,9 @@ namespace Streetwriters.Common.Models [JsonPropertyName("trialsAvailed")] public SubscriptionPlan[]? TrialsAvailed { get; set; } + [JsonPropertyName("extensionsAvailed")] + public SubscriptionExtension[]? ExtensionsAvailed { get; set; } + [JsonPropertyName("updatedAt")] public long UpdatedAt { get; set; } @@ -104,4 +107,16 @@ namespace Streetwriters.Common.Models [JsonPropertyName("status")] public SubscriptionStatus Status { get; set; } } + + public class SubscriptionExtension + { + [JsonPropertyName("timestamp")] + public required long Timestamp { get; set; } + + [JsonPropertyName("expiry")] + public required long ExpiryDate { get; set; } + + [JsonPropertyName("type")] + public required string Type { get; set; } + } } diff --git a/Streetwriters.Common/Services/EmailSender.cs b/Streetwriters.Common/Services/EmailSender.cs index 97131ce..63f43c9 100644 --- a/Streetwriters.Common/Services/EmailSender.cs +++ b/Streetwriters.Common/Services/EmailSender.cs @@ -27,7 +27,7 @@ namespace Streetwriters.Common.Services public async Task SendEmailAsync( string email, EmailTemplate template, - IClient client, + System.Net.Mail.MailAddress from, GnuPGContext? gpgContext = null, Dictionary? attachments = null ) @@ -55,8 +55,7 @@ namespace Streetwriters.Common.Services ); var message = new MimeMessage(); - var sender = new MailboxAddress(client.SenderName, client.SenderEmail); - message.From.Add(sender); + message.From.Add(new MailboxAddress(from.DisplayName, from.Address)); message.To.Add(new MailboxAddress("", email)); message.Subject = await Template.Parse(template.Subject).RenderAsync(template.Data); @@ -65,8 +64,7 @@ namespace Streetwriters.Common.Services message.Body = await GetEmailBodyAsync( template, - client, - sender, + new MailboxAddress(from.DisplayName, from.Address), gpgContext, attachments ); @@ -76,7 +74,6 @@ namespace Streetwriters.Common.Services private async Task GetEmailBodyAsync( EmailTemplate template, - IClient client, MailboxAddress sender, GnuPGContext? gpgContext = null, Dictionary? attachments = null @@ -107,7 +104,7 @@ namespace Streetwriters.Common.Services } outputStream.Seek(0, SeekOrigin.Begin); builder.Attachments.Add( - $"{client.Id}_pub.asc", + $"pub.asc", Encoding.ASCII.GetBytes( Encoding.ASCII.GetString(outputStream.ToArray()) ) diff --git a/Streetwriters.Identity/Services/TemplatedEmailSender.cs b/Streetwriters.Identity/Services/TemplatedEmailSender.cs index 9001b7b..a1e30d9 100644 --- a/Streetwriters.Identity/Services/TemplatedEmailSender.cs +++ b/Streetwriters.Identity/Services/TemplatedEmailSender.cs @@ -104,7 +104,7 @@ namespace Streetwriters.Identity.Services Subject = Email2FATemplate.Subject, Data = new { app_name = client.Name, code }, }; - await EmailSender.SendEmailAsync(email, template, client, NNGnuPGContext); + await EmailSender.SendEmailAsync(email, template, new System.Net.Mail.MailAddress(client.SenderEmail, client.SenderName), NNGnuPGContext); } public async Task SendConfirmationEmailAsync( @@ -120,7 +120,7 @@ namespace Streetwriters.Identity.Services Subject = ConfirmEmailTemplate.Subject, Data = new { app_name = client.Name, confirm_link = callbackUrl }, }; - await EmailSender.SendEmailAsync(email, template, client, NNGnuPGContext); + await EmailSender.SendEmailAsync(email, template, new System.Net.Mail.MailAddress(client.SenderEmail, client.SenderName), NNGnuPGContext); } public async Task SendChangeEmailConfirmationAsync( @@ -136,7 +136,7 @@ namespace Streetwriters.Identity.Services Subject = ConfirmChangeEmailTemplate.Subject, Data = new { app_name = client.Name, code }, }; - await EmailSender.SendEmailAsync(email, template, client, NNGnuPGContext); + await EmailSender.SendEmailAsync(email, template, new System.Net.Mail.MailAddress(client.SenderEmail, client.SenderName), NNGnuPGContext); } public async Task SendPasswordResetEmailAsync( @@ -152,7 +152,7 @@ namespace Streetwriters.Identity.Services Subject = PasswordResetEmailTemplate.Subject, Data = new { app_name = client.Name, reset_link = callbackUrl }, }; - await EmailSender.SendEmailAsync(email, template, client, NNGnuPGContext); + await EmailSender.SendEmailAsync(email, template, new System.Net.Mail.MailAddress(client.SenderEmail, client.SenderName), NNGnuPGContext); } public async Task SendFailedLoginAlertAsync(string email, string deviceInfo, IClient client) @@ -168,7 +168,7 @@ namespace Streetwriters.Identity.Services device_info = deviceInfo.Replace("\n", "
"), }, }; - await EmailSender.SendEmailAsync(email, template, client, NNGnuPGContext); + await EmailSender.SendEmailAsync(email, template, new System.Net.Mail.MailAddress(client.SenderEmail, client.SenderName), NNGnuPGContext); } }