diff --git a/FoodsharingSiegen.Server/Auth/AuthService.cs b/FoodsharingSiegen.Server/Auth/AuthService.cs
index 1503d0d..6ff91c4 100644
--- a/FoodsharingSiegen.Server/Auth/AuthService.cs
+++ b/FoodsharingSiegen.Server/Auth/AuthService.cs
@@ -212,6 +212,34 @@ namespace FoodsharingSiegen.Server.Auth
#region Password Recovery
+ public async Task InitiateInitialPasswordSetup(string email, string baseUri)
+ {
+ if (string.IsNullOrWhiteSpace(email)) return;
+
+ var user = await Context.Users!.FirstOrDefaultAsync(x => x.Mail.ToLower() == email.ToLower());
+ if (user == null) return; // Do not leak existence
+
+ var resetToken = Guid.NewGuid().ToString("N");
+ user.ResetToken = resetToken;
+ user.ResetTokenExpiry = DateTime.UtcNow.AddDays(7);
+
+ await Context.SaveChangesAsync();
+
+ var resetLink = $"{baseUri.TrimEnd('/')}/reset-password/{resetToken}";
+ var mailBody = $"""
+ Hallo {user.Name},
+
+ für dich wurde ein neues Konto bei {_appSettings.Terms.Title} erstellt.
+
+ Um dein Passwort festzulegen, klicke bitte auf den folgenden Link (dieser ist 7 Tage gültig):
+ {resetLink}
+
+ Viele Grüße
Dein Team {_appSettings.Terms.Title}
+ """;
+
+ await _mailService.SendEmailAsync(user.Mail, "Passwort festlegen", mailBody);
+ }
+
public async Task InitiatePasswordReset(string email, string baseUri)
{
if (string.IsNullOrWhiteSpace(email)) return;
diff --git a/FoodsharingSiegen.Server/Pages/Users.razor b/FoodsharingSiegen.Server/Pages/Users.razor
index 8cf4923..1fabec4 100644
--- a/FoodsharingSiegen.Server/Pages/Users.razor
+++ b/FoodsharingSiegen.Server/Pages/Users.razor
@@ -56,9 +56,11 @@
-
-
+
+
+
+
@@ -77,7 +79,7 @@
grid-template-columns: repeat(2, 1fr);
}
}
- @@media (min-width: 1070px) {
+ @@media (min-width: 1250px) {
.user-grid {
grid-template-columns: repeat(3, 1fr);
}
diff --git a/FoodsharingSiegen.Server/Pages/Users.razor.cs b/FoodsharingSiegen.Server/Pages/Users.razor.cs
index 80d43b3..9504d7e 100644
--- a/FoodsharingSiegen.Server/Pages/Users.razor.cs
+++ b/FoodsharingSiegen.Server/Pages/Users.razor.cs
@@ -22,6 +22,12 @@ namespace FoodsharingSiegen.Server.Pages
[Inject]
public UserService UserService { get; set; } = null!;
+ [Inject]
+ public new FoodsharingSiegen.Server.Auth.AuthService AuthService { get; set; } = null!;
+
+ [Inject]
+ public new NavigationManager NavigationManager { get; set; } = null!;
+
#endregion
#region Private Properties
@@ -115,6 +121,14 @@ namespace FoodsharingSiegen.Server.Pages
PasswordModal?.Show(user);
}
+ private async Task SendPasswordSetupMail(User user)
+ {
+ await ConfirmDialog.ShowAsync(ModalService, "Bestätigen", $"Soll eine E-Mail zum Festlegen des Passworts an {user.Mail} gesendet werden?", async () =>
+ {
+ await AuthService.InitiateInitialPasswordSetup(user.Mail, NavigationManager.BaseUri);
+ });
+ }
+
private async Task SaveUser()
{
if (EditModel == null) return;