From dc3d2b77f9ebe52279ca0b86b8b91c588d310829 Mon Sep 17 00:00:00 2001 From: Daniel Balk <67603460+Daniel-Balk@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:14:38 +0200 Subject: [PATCH 1/4] User Settings form --- Moonlight/Shared/Views/Profile/Index.razor | 83 +++++++++++++++++++++- Moonlight/resources/lang/de_de.lang | 7 ++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/Moonlight/Shared/Views/Profile/Index.razor b/Moonlight/Shared/Views/Profile/Index.razor index 5f0511c2..bbac5f73 100644 --- a/Moonlight/Shared/Views/Profile/Index.razor +++ b/Moonlight/Shared/Views/Profile/Index.razor @@ -1,4 +1,85 @@ @page "/profile" @using Moonlight.Shared.Components.Navigations +@using Moonlight.App.Services.Sessions +@using Moonlight.App.Database.Entities +@inject IdentityService IdentityService - \ No newline at end of file + + + + +
+
+
+

Persönliche Daten

+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +@code +{ + private User User = new User(); + + + private async Task Load(LazyLoader loader) + { + User = await IdentityService.Get(); + } +} diff --git a/Moonlight/resources/lang/de_de.lang b/Moonlight/resources/lang/de_de.lang index 038b7e81..37f97fde 100644 --- a/Moonlight/resources/lang/de_de.lang +++ b/Moonlight/resources/lang/de_de.lang @@ -394,3 +394,10 @@ Discord id;Discord id Discord username;Discord username Discord discriminator;Discord discriminator The Name field is required.;The Name field is required. +The FirstName field is required.;The FirstName field is required. +The LastName field is required.;The LastName field is required. +The Address field is required.;The Address field is required. +The City field is required.;The City field is required. +The State field is required.;The State field is required. +The Country field is required.;The Country field is required. +Street and house number requered;Street and house number requered From f178c59661b520ad143cb2f0359c19e536be2ba8 Mon Sep 17 00:00:00 2001 From: Daniel Balk <67603460+Daniel-Balk@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:15:07 +0200 Subject: [PATCH 2/4] regexes; thank you, google --- Moonlight/App/Database/Entities/User.cs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Moonlight/App/Database/Entities/User.cs b/Moonlight/App/Database/Entities/User.cs index 76d23e46..40f0eae0 100644 --- a/Moonlight/App/Database/Entities/User.cs +++ b/Moonlight/App/Database/Entities/User.cs @@ -1,4 +1,5 @@ -using Moonlight.App.Models.Misc; +using System.ComponentModel.DataAnnotations; +using Moonlight.App.Models.Misc; namespace Moonlight.App.Database.Entities; @@ -8,13 +9,35 @@ public class User // Personal data + [Required] + [MinLength(3, ErrorMessage = "Invalid first name")] public string FirstName { get; set; } = ""; + + [Required] + [MinLength(3, ErrorMessage = "Invalid last name")] public string LastName { get; set; } = ""; + + [Required] + [RegularExpression(@"^((((([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)[;]?)+$", + ErrorMessage = "Must be a valid email")] public string Email { get; set; } = ""; + public string Password { get; set; } = ""; + + [Required] + [RegularExpression(@"^(?:[A-Z] \d|[^\W\d_]{2,}\.?)(?:[- '’][^\W\d_]+\.?)*\s+[1-9]\d{0,3} ?[a-zA-Z]?(?: ?[/-] ?[1-9]\d{0,3} ?[a-zA-Z]?)?$", ErrorMessage = "Street and house number required")] public string Address { get; set; } = ""; + + [Required] + [MinLength(3, ErrorMessage = "Invalid city")] public string City { get; set; } = ""; + + [Required] + [MinLength(3, ErrorMessage = "Invalid state")] public string State { get; set; } = ""; + + [Required] + [MinLength(3, ErrorMessage = "Invalid country")] public string Country { get; set; } = ""; // States From 37c8e640a7527ad135c9048a020d70181bff46cc Mon Sep 17 00:00:00 2001 From: Daniel Balk <67603460+Daniel-Balk@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:20:08 +0200 Subject: [PATCH 3/4] Account data save --- Moonlight/Shared/Views/Profile/Index.razor | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Moonlight/Shared/Views/Profile/Index.razor b/Moonlight/Shared/Views/Profile/Index.razor index bbac5f73..81fd74df 100644 --- a/Moonlight/Shared/Views/Profile/Index.razor +++ b/Moonlight/Shared/Views/Profile/Index.razor @@ -1,13 +1,17 @@ @page "/profile" + @using Moonlight.Shared.Components.Navigations @using Moonlight.App.Services.Sessions @using Moonlight.App.Database.Entities +@using Moonlight.App.Repositories + @inject IdentityService IdentityService +@inject UserRepository UserRepository - +
@@ -82,4 +86,9 @@ { User = await IdentityService.Get(); } + + private void Save() + { + UserRepository.Update(User); + } } From ee661f7fd4f750d9d810d0df4a217e022d670af8 Mon Sep 17 00:00:00 2001 From: Daniel Balk <67603460+Daniel-Balk@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:23:56 +0200 Subject: [PATCH 4/4] more form validation --- Moonlight/App/Database/Entities/User.cs | 10 +++++++++- Moonlight/resources/lang/de_de.lang | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Moonlight/App/Database/Entities/User.cs b/Moonlight/App/Database/Entities/User.cs index 40f0eae0..e0f45831 100644 --- a/Moonlight/App/Database/Entities/User.cs +++ b/Moonlight/App/Database/Entities/User.cs @@ -11,33 +11,41 @@ public class User [Required] [MinLength(3, ErrorMessage = "Invalid first name")] + [MaxLength(64, ErrorMessage = "Max lenght reached")] public string FirstName { get; set; } = ""; [Required] [MinLength(3, ErrorMessage = "Invalid last name")] + [MaxLength(64, ErrorMessage = "Max lenght reached")] public string LastName { get; set; } = ""; [Required] [RegularExpression(@"^((((([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)[;]?)+$", ErrorMessage = "Must be a valid email")] + [MaxLength(128, ErrorMessage = "Max lenght reached")] public string Email { get; set; } = ""; public string Password { get; set; } = ""; [Required] - [RegularExpression(@"^(?:[A-Z] \d|[^\W\d_]{2,}\.?)(?:[- '’][^\W\d_]+\.?)*\s+[1-9]\d{0,3} ?[a-zA-Z]?(?: ?[/-] ?[1-9]\d{0,3} ?[a-zA-Z]?)?$", ErrorMessage = "Street and house number required")] + [RegularExpression(@"^(?:[A-Z] \d|[^\W\d_]{2,}\.?)(?:[- '’][^\W\d_]+\.?)*\s+[1-9]\d{0,3} ?[a-zA-Z]?(?: ?[/-] ?[1-9]\d{0,3} ?[a-zA-Z]?)?$", + ErrorMessage = "Street and house number required")] + [MaxLength(128, ErrorMessage = "Max lenght reached")] public string Address { get; set; } = ""; [Required] [MinLength(3, ErrorMessage = "Invalid city")] + [MaxLength(128, ErrorMessage = "Max lenght reached")] public string City { get; set; } = ""; [Required] [MinLength(3, ErrorMessage = "Invalid state")] + [MaxLength(64, ErrorMessage = "Max lenght reached")] public string State { get; set; } = ""; [Required] [MinLength(3, ErrorMessage = "Invalid country")] + [MaxLength(64, ErrorMessage = "Max lenght reached")] public string Country { get; set; } = ""; // States diff --git a/Moonlight/resources/lang/de_de.lang b/Moonlight/resources/lang/de_de.lang index 37f97fde..4c4a41a5 100644 --- a/Moonlight/resources/lang/de_de.lang +++ b/Moonlight/resources/lang/de_de.lang @@ -401,3 +401,4 @@ The City field is required.;The City field is required. The State field is required.;The State field is required. The Country field is required.;The Country field is required. Street and house number requered;Street and house number requered +Max lenght reached;Max lenght reached