From bb2f1f5c92587975f776f79defdd48dc7e007b9e Mon Sep 17 00:00:00 2001 From: Mia Winter Date: Mon, 22 Apr 2024 14:17:11 +0200 Subject: [PATCH] Implemented add subscribers on Subscribers Page (CSV) --- Wave/Components/Pages/Subscribers.razor | 83 ++++++++++++++++++- .../Components/Pages/Subscribers.de-DE.resx | 16 ++++ .../Components/Pages/Subscribers.resx | 16 ++++ Wave/Wave.csproj | 1 + 4 files changed, 115 insertions(+), 1 deletion(-) diff --git a/Wave/Components/Pages/Subscribers.razor b/Wave/Components/Pages/Subscribers.razor index 667a20e..af94862 100644 --- a/Wave/Components/Pages/Subscribers.razor +++ b/Wave/Components/Pages/Subscribers.razor @@ -3,6 +3,9 @@ @using Microsoft.Extensions.Options @using Wave.Data @using Wave.Utilities +@using CsvHelper.Configuration +@using System.Globalization +@using CsvHelper @attribute [Authorize(Roles = "Admin")] @@ -12,12 +15,40 @@ @inject IMessageDisplay Message @inject IOptions Features + + +
+ + +

@Localizer["AddSubscribers_Label"]

+ Format: Email;[Name];[Exclusion Reason]; + + + + +
+ + + +
+ @(Localizer["Title"] + TitlePostfix)

@Localizer["Title"]

+
+ +
+
-
@@ -92,6 +123,10 @@ private const int ItemsPerPage = 10; private int TotalPages { get; set; } + [SupplyParameterFromForm(FormName = "AddSubscribers")] + private string SubscribersInput { get; set; } = string.Empty; + private static string ModalId => "AddSubscribersDialog"; + protected override async Task OnInitializedAsync() { await using var context = await ContextFactory.CreateDbContextAsync(); var query = context.Set(); @@ -111,4 +146,50 @@ return []; } } + + private async Task AddSubscribers() { + var config = new CsvConfiguration(CultureInfo.CurrentCulture) { + NewLine = Environment.NewLine, + HasHeaderRecord = false + }; + + List list; + try { + using var reader = new CsvReader(new StringReader(SubscribersInput), config); + list = reader.GetRecords().ToList(); + } catch (Exception ex) { + Message.ShowError(string.Format(Localizer["AddSubscribers_Parse_Error"], ex.Message)); + return; + } + if (list.Count < 1) return; + + try { + var emailSubscribers = new List(); + foreach (var input in list) { + emailSubscribers.Add(new EmailSubscriber { + Email = input.Email, + Name = input.Name, + Unsubscribed = !string.IsNullOrWhiteSpace(input.UnsubscribeReason), + UnsubscribeReason = input.UnsubscribeReason, + Language = "en-US" + }); + } + + await using var context = await ContextFactory.CreateDbContextAsync(); + context.AddRange(emailSubscribers); + await context.SaveChangesAsync(); + SubscribersInput = string.Empty; + } catch (Exception ex) { + Message.ShowError(string.Format(Localizer["AddSubscribers_Save_Error"], ex.InnerException?.Message ?? ex.Message)); + } + } + + internal sealed class SubscriberModel { + [CsvHelper.Configuration.Attributes.Index(0)] + public string Email { get; set; } = string.Empty; + [CsvHelper.Configuration.Attributes.Index(1)] + public string? Name { get; set; } + [CsvHelper.Configuration.Attributes.Index(2)] + public string? UnsubscribeReason { get; set; } + } } diff --git a/Wave/Resources/Components/Pages/Subscribers.de-DE.resx b/Wave/Resources/Components/Pages/Subscribers.de-DE.resx index 3640b33..817bf38 100644 --- a/Wave/Resources/Components/Pages/Subscribers.de-DE.resx +++ b/Wave/Resources/Components/Pages/Subscribers.de-DE.resx @@ -131,4 +131,20 @@ Alle Uhrzeiten sind in der folgenden Zeitzone: + + Fehler beim einlesen von Abonennent(en): {0} + + + Fehler beim speichern von Abonennent(en): {0} + + + Abonnent(en) Hinzufügen + + + Abonnent(en) [CSV] + + + anna.muster@example.de; Anna Muster; Spam; +peter.muster@example.de;;; + \ No newline at end of file diff --git a/Wave/Resources/Components/Pages/Subscribers.resx b/Wave/Resources/Components/Pages/Subscribers.resx index 7419ca6..605449c 100644 --- a/Wave/Resources/Components/Pages/Subscribers.resx +++ b/Wave/Resources/Components/Pages/Subscribers.resx @@ -134,4 +134,20 @@ All times are using this timezone: + + Failed to parse subscriber(s): {0} + + + Failed to save subscriber(s): {0} + + + Add Subscriber(s) + + + Subscriber(s) [CSV] + + + john.smith@example.com; John Smith; Spam; +jay.smith@example.com;;; + \ No newline at end of file diff --git a/Wave/Wave.csproj b/Wave/Wave.csproj index c98e862..97de6c4 100644 --- a/Wave/Wave.csproj +++ b/Wave/Wave.csproj @@ -11,6 +11,7 @@ +