aboutsummaryrefslogtreecommitdiff
path: root/VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs
diff options
context:
space:
mode:
authorLibravatar vman <public@vaughnnugent.com>2022-11-18 16:08:51 -0500
committerLibravatar vman <public@vaughnnugent.com>2022-11-18 16:08:51 -0500
commit526c2364b9ad685d1c000fc8a168bf1305aaa8b7 (patch)
treea2bc01607320a6a75e1a869d5bd34e79fd63c595 /VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs
parent2080400119be00bdc354f3121d84ec2f89606ac7 (diff)
Add project files.
Diffstat (limited to 'VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs')
-rw-r--r--VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs109
1 files changed, 109 insertions, 0 deletions
diff --git a/VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs b/VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs
new file mode 100644
index 0000000..839bc27
--- /dev/null
+++ b/VNLib.Plugins.Essentials.Accounts.Registration/src/AccountValidations.cs
@@ -0,0 +1,109 @@
+
+using FluentValidation;
+
+using VNLib.Plugins.Essentials.Accounts.Registration.Endpoints;
+using VNLib.Plugins.Extensions.Validation;
+
+namespace VNLib.Plugins.Essentials.Accounts.Registration
+{
+ internal static class AccountValidations
+ {
+ /// <summary>
+ /// Central password requirement validator
+ /// </summary>
+ public static IValidator<string> PasswordValidator { get; } = GetPassVal();
+
+ public static IValidator<AccountData> AccountDataValidator { get; } = GetAcVal();
+
+ /// <summary>
+ /// A validator used to validate new registration request messages
+ /// </summary>
+ public static IValidator<RegRequestMessage> RegRequestValidator { get; } = GetRequestValidator();
+
+ static IValidator<string> GetPassVal()
+ {
+ InlineValidator<string> passVal = new();
+
+ passVal.RuleFor(static password => password)
+ .NotEmpty()
+ .Length(min: 8, max: 100)
+ .Password()
+ .WithMessage(errorMessage: "Password does not meet minium requirements");
+
+ return passVal;
+ }
+
+ static IValidator<AccountData> GetAcVal()
+ {
+ InlineValidator<AccountData> adv = new ();
+
+ //Validate city
+
+ adv.RuleFor(t => t.City)
+ .MaximumLength(35)
+ .AlphaOnly()
+ .When(t => t.City?.Length > 0);
+
+ adv.RuleFor(t => t.Company)
+ .MaximumLength(50)
+ .SpecialCharacters()
+ .When(t => t.Company?.Length > 0);
+
+ //Require a first and last names to be set together
+ adv.When(t => t.First?.Length > 0 || t.Last?.Length > 0, () =>
+ {
+ adv.RuleFor(t => t.First)
+ .Length(1, 35)
+ .AlphaOnly();
+ adv.RuleFor(t => t.Last)
+ .Length(1, 35)
+ .AlphaOnly();
+ });
+
+ adv.RuleFor(t => t.PhoneNumber)
+ .PhoneNumber()
+ .When(t => t.PhoneNumber?.Length > 0)
+ .OverridePropertyName("Phone");
+
+ //State must be 2 characters for us states if set
+ adv.RuleFor(t => t.State)
+ .Length(2)
+ .When(t => t.State?.Length > 0);
+
+ adv.RuleFor(t => t.Street)
+ .AlphaNumericOnly()
+ .MaximumLength(50)
+ .When(t => t.Street?.Length > 0);
+
+ //Allow empty zip codes, but if one is defined, is must be less than 7 characters
+ adv.RuleFor(t => t.Zip)
+ .NumericOnly()
+ .MaximumLength(7)
+ .When(t => t.Zip?.Length > 0);
+
+ return adv;
+ }
+
+ static IValidator<RegRequestMessage> GetRequestValidator()
+ {
+ InlineValidator<RegRequestMessage> reqVal = new();
+
+ reqVal.RuleFor(static s => s.ClientId)
+ .NotEmpty()
+ .IllegalCharacters()
+ .Length(1, 100);
+
+ //Convert to universal time before validating
+ reqVal.RuleFor(static s => s.Timestamp.ToUniversalTime())
+ .Must(t => t > DateTimeOffset.UtcNow.AddSeconds(-60) && t < DateTimeOffset.UtcNow.AddSeconds(60));
+
+ reqVal.RuleFor(static s => s.UserName)
+ .NotEmpty()
+ .EmailAddress()
+ .IllegalCharacters()
+ .Length(5, 50);
+
+ return reqVal;
+ }
+ }
+}