Validation fixes, finished application creation, added required char (*) for required fields
This commit is contained in:
13
SchengenVisaApi/ApplicationLayer/Constants.cs
Normal file
13
SchengenVisaApi/ApplicationLayer/Constants.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace ApplicationLayer
|
||||
{
|
||||
public static class Constants
|
||||
{
|
||||
public readonly static Regex EnglishWordRegex = new("^[a-zA-Z]*$");
|
||||
|
||||
public readonly static Regex EnglishPhraseRegex = new(@"^[a-zA-Z№0-9?><;,{}[\]\-_+=!@#$%\^&*|']*$");
|
||||
|
||||
public readonly static Regex PhoneNumRegex = new(@"^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$");
|
||||
}
|
||||
}
|
||||
@@ -10,16 +10,22 @@ public class NameModelValidator : AbstractValidator<NameModel>
|
||||
RuleFor(m => m.FirstName)
|
||||
.NotEmpty()
|
||||
.WithMessage("First Name can not be empty")
|
||||
.Matches(Constants.EnglishWordRegex)
|
||||
.WithMessage("First name must be in english characters")
|
||||
.MaximumLength(ConfigurationConstraints.NameLength)
|
||||
.WithMessage($"First Name length must be less than {ConfigurationConstraints.NameLength}");
|
||||
|
||||
RuleFor(m => m.Surname)
|
||||
.NotEmpty()
|
||||
.WithMessage("Surname can not be empty")
|
||||
.Matches(Constants.EnglishWordRegex)
|
||||
.WithMessage("Surname must be in english characters")
|
||||
.MaximumLength(ConfigurationConstraints.NameLength)
|
||||
.WithMessage($"Surname length must be less than {ConfigurationConstraints.NameLength}");
|
||||
|
||||
RuleFor(m => m.Patronymic)
|
||||
.Matches(Constants.EnglishWordRegex)
|
||||
.WithMessage("Patronymic must be in english characters")
|
||||
.MaximumLength(ConfigurationConstraints.NameLength)
|
||||
.WithMessage($"Patronymic length must be less than {ConfigurationConstraints.NameLength}");
|
||||
}
|
||||
|
||||
@@ -11,12 +11,16 @@ public class PassportModelValidator : AbstractValidator<PassportModel>
|
||||
RuleFor(r => r.Issuer)
|
||||
.NotEmpty()
|
||||
.WithMessage("Passport issuer can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Passport issuer field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.IssuerNameLength)
|
||||
.WithMessage($"Passport issuer length must be less than {ConfigurationConstraints.IssuerNameLength}");
|
||||
|
||||
RuleFor(r => r.Number)
|
||||
.NotEmpty()
|
||||
.WithMessage("Passport number can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Passport number field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.PassportNumberLength)
|
||||
.WithMessage($"Passport number length must be less than {ConfigurationConstraints.PassportNumberLength}");
|
||||
|
||||
|
||||
@@ -10,12 +10,16 @@ public class PlaceOfWorkModelValidator : AbstractValidator<PlaceOfWorkModel>
|
||||
RuleFor(p => p.Name)
|
||||
.NotEmpty()
|
||||
.WithMessage("Place of work name can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Place of work name field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.PlaceOfWorkNameLength)
|
||||
.WithMessage($"Place of work name length must be less than {ConfigurationConstraints.PlaceOfWorkNameLength}");
|
||||
|
||||
RuleFor(p => p.PhoneNum)
|
||||
.NotEmpty()
|
||||
.WithMessage("Place of work phone number can not be empty")
|
||||
.Matches(Constants.PhoneNumRegex)
|
||||
.WithMessage("Place of work phone number field must be valid")
|
||||
.MaximumLength(ConfigurationConstraints.PhoneNumberLength)
|
||||
.WithMessage(
|
||||
$"Phone number length must be in range from {ConfigurationConstraints.PhoneNumberMinLength} to {ConfigurationConstraints.PhoneNumberLength}")
|
||||
@@ -23,27 +27,39 @@ public class PlaceOfWorkModelValidator : AbstractValidator<PlaceOfWorkModel>
|
||||
.WithMessage(
|
||||
$"Phone number length must be in range from {ConfigurationConstraints.PhoneNumberMinLength} to {ConfigurationConstraints.PhoneNumberLength}");
|
||||
|
||||
RuleFor(p => p.Address)
|
||||
.NotEmpty()
|
||||
.WithMessage("Place of work address can not be empty");
|
||||
|
||||
RuleFor(p => p.Address.Country)
|
||||
.NotEmpty()
|
||||
.WithMessage("Country name of place of work can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Place of work Country field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CountryNameLength)
|
||||
.WithMessage($"Country name of place of work length must be less than {ConfigurationConstraints.CountryNameLength}");
|
||||
|
||||
RuleFor(p => p.Address.City)
|
||||
.NotEmpty()
|
||||
.WithMessage("City name of place of work can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Place of work City field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CityNameLength)
|
||||
.WithMessage($"City name of place of work length must be less than {ConfigurationConstraints.CityNameLength}");
|
||||
|
||||
RuleFor(p => p.Address.Street)
|
||||
.NotEmpty()
|
||||
.WithMessage("Street name of place of work can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Place of work Street field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.StreetNameLength)
|
||||
.WithMessage($"Street name of place of work length must be less than {ConfigurationConstraints.StreetNameLength}");
|
||||
|
||||
RuleFor(p => p.Address.Building)
|
||||
.NotEmpty()
|
||||
.WithMessage("Building of place of work can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Place of work building field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CountryNameLength)
|
||||
.WithMessage($"Building of place of work length must be less than {ConfigurationConstraints.BuildingNumberLength}");
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ public class AuthDataValidator : AbstractValidator<AuthData>
|
||||
RuleFor(d => d.Password)
|
||||
.NotEmpty()
|
||||
.WithMessage("Password can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Password can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.PasswordLength)
|
||||
.WithMessage($"Password length must be less than {ConfigurationConstraints.PasswordLength}");
|
||||
}
|
||||
|
||||
@@ -15,18 +15,23 @@ public class RegisterApplicantRequestValidator : AbstractValidator<RegisterAppli
|
||||
IValidator<PlaceOfWorkModel> placeOfWorkModelValidator)
|
||||
{
|
||||
RuleFor(r => r.RegisterRequest)
|
||||
.NotEmpty()
|
||||
.SetValidator(registerRequestValidator);
|
||||
|
||||
RuleFor(r => r.ApplicantName)
|
||||
.NotEmpty()
|
||||
.SetValidator(nameValidator);
|
||||
|
||||
RuleFor(r => r.FatherName)
|
||||
.NotEmpty()
|
||||
.SetValidator(nameValidator);
|
||||
|
||||
RuleFor(r => r.MotherName)
|
||||
.NotEmpty()
|
||||
.SetValidator(nameValidator);
|
||||
|
||||
RuleFor(r => r.Passport)
|
||||
.NotEmpty()
|
||||
.SetValidator(passportValidator);
|
||||
|
||||
RuleFor(r => r.BirthDate)
|
||||
@@ -38,38 +43,51 @@ public class RegisterApplicantRequestValidator : AbstractValidator<RegisterAppli
|
||||
RuleFor(r => r.CountryOfBirth)
|
||||
.NotEmpty()
|
||||
.WithMessage("Country of birth can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Country of birth field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CountryNameLength)
|
||||
.WithMessage($"Country of birth name length must be less than {ConfigurationConstraints.CountryNameLength}");
|
||||
|
||||
RuleFor(r => r.CityOfBirth)
|
||||
.NotEmpty()
|
||||
.WithMessage("City of birth can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("City of birth field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CityNameLength)
|
||||
.WithMessage($"City of birth name length must be less than {ConfigurationConstraints.CityNameLength}");
|
||||
|
||||
RuleFor(r => r.Citizenship)
|
||||
.NotEmpty()
|
||||
.WithMessage("Citizenship can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Citizenship field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CitizenshipLength)
|
||||
.WithMessage($"Citizenship length must be less than {ConfigurationConstraints.CitizenshipLength}");
|
||||
|
||||
RuleFor(r => r.CitizenshipByBirth)
|
||||
.NotEmpty()
|
||||
.WithMessage("Citizenship by birth can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Citizenship by birth field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CitizenshipLength)
|
||||
.WithMessage($"Citizenship by birth length must be less than {ConfigurationConstraints.CitizenshipLength}");
|
||||
|
||||
RuleFor(r => r.Gender).IsInEnum();
|
||||
RuleFor(r => r.Gender)
|
||||
.IsInEnum();
|
||||
|
||||
RuleFor(r => r.MaritalStatus).IsInEnum();
|
||||
RuleFor(r => r.MaritalStatus)
|
||||
.IsInEnum();
|
||||
|
||||
RuleFor(r => r.JobTitle)
|
||||
.NotEmpty()
|
||||
.WithMessage("Title of job can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Title of job field can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.JobTitleLength)
|
||||
.WithMessage($"Title of job length must be less than {ConfigurationConstraints.JobTitleLength}");
|
||||
|
||||
RuleFor(r => r.PlaceOfWork)
|
||||
.NotEmpty()
|
||||
.SetValidator(placeOfWorkModelValidator);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ public class RegisterRequestValidator : AbstractValidator<RegisterRequest>
|
||||
public RegisterRequestValidator(IUsersRepository users, IValidator<AuthData> authDataValidator)
|
||||
{
|
||||
RuleFor(r => r.AuthData)
|
||||
.NotEmpty()
|
||||
.SetValidator(authDataValidator)
|
||||
.MustAsync(async (authData, ct) => await users.FindByEmailAsync(authData.Email, ct) is null)
|
||||
.WithMessage("Email already exists");
|
||||
|
||||
@@ -12,6 +12,7 @@ public class PastVisaModel
|
||||
|
||||
/// Name of visa
|
||||
[MaxLength(ConfigurationConstraints.VisaNameLength)]
|
||||
[Required]
|
||||
public string Name { get; set; } = null!;
|
||||
|
||||
/// Date when visa expires
|
||||
|
||||
@@ -16,5 +16,6 @@ public class PastVisitModel
|
||||
|
||||
/// Destination country of past visit
|
||||
[MaxLength(ConfigurationConstraints.CountryNameLength)]
|
||||
[Required]
|
||||
public string DestinationCountry { get; set; } = null!;
|
||||
}
|
||||
|
||||
@@ -12,5 +12,6 @@ public class PermissionToDestCountryModel
|
||||
|
||||
/// Issuing authority
|
||||
[MaxLength(ConfigurationConstraints.IssuerNameLength)]
|
||||
[Required]
|
||||
public string Issuer { get; set; } = null!;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using ApplicationLayer.InfrastructureServicesInterfaces;
|
||||
using Domains;
|
||||
using FluentValidation;
|
||||
|
||||
namespace ApplicationLayer.Services.VisaApplications.Models.Validation;
|
||||
@@ -21,6 +22,10 @@ public class PastVisaModelValidator : AbstractValidator<PastVisaModel>
|
||||
|
||||
RuleFor(v => v.Name)
|
||||
.NotEmpty()
|
||||
.WithMessage("Name of past visa can not be empty");
|
||||
.WithMessage("Name of past visa can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Name of past visa can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.VisaNameLength)
|
||||
.WithMessage($"Past visa name length must be less than {ConfigurationConstraints.VisaNameLength}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ public class PastVisitModelValidator : AbstractValidator<PastVisitModel>
|
||||
RuleFor(v => v.DestinationCountry)
|
||||
.NotEmpty()
|
||||
.WithMessage("Destination Country of past visit can not be null")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Destination Country of past visit can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.CountryNameLength)
|
||||
.WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}");
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ public class PermissionToDestCountryModelValidator : AbstractValidator<Permissio
|
||||
RuleFor(p => p!.Issuer)
|
||||
.NotEmpty()
|
||||
.WithMessage("Issuer of permission for destination Country can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Issuer of permission for destination Country can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.IssuerNameLength)
|
||||
.WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}");
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ public class ReentryPermitModelValidator : AbstractValidator<ReentryPermitModel?
|
||||
RuleFor(p => p!.Number)
|
||||
.NotEmpty()
|
||||
.WithMessage("Re-entry permit number can not be empty")
|
||||
.Matches(Constants.EnglishPhraseRegex)
|
||||
.WithMessage("Re-entry permit number can contain only english letters, digits and special symbols")
|
||||
.MaximumLength(ConfigurationConstraints.ReentryPermitNumberLength)
|
||||
.WithMessage($"Re-entry permit number length must be less than {ConfigurationConstraints.ReentryPermitNumberLength}");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user