150 lines
4.3 KiB
Go
150 lines
4.3 KiB
Go
package validation
|
|
|
|
import (
|
|
"regexp"
|
|
"time"
|
|
|
|
"bitbucket.org/nemt/nemt-portal-api/application/viewmodel"
|
|
"bitbucket.org/nemt/nemt-portal-api/infra/errors"
|
|
)
|
|
|
|
const (
|
|
firstNameMaxLength = 50
|
|
lastNameMaxLength = 50
|
|
emailMaxLength = 150
|
|
|
|
memberNumberValidNumberOfLetters = 3
|
|
)
|
|
|
|
const (
|
|
formModeVisit = 1
|
|
formModeRide = 2
|
|
)
|
|
|
|
func isAlphabetic(input string) bool {
|
|
for _, character := range input {
|
|
if !(characterIsUpperCase(character) || characterIsLowerCase(character)){
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func isNumeric(input string) bool {
|
|
for _, character := range input {
|
|
if !characterIsNumber(character){
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func isEmailValid (email string) bool {
|
|
validEmailRegex := regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
|
|
|
|
return validEmailRegex.MatchString(email)
|
|
}
|
|
|
|
func isMemberNumberValid(input string) bool {
|
|
if len(input) < memberNumberValidNumberOfLetters {
|
|
return false
|
|
}
|
|
|
|
if !isAlphabetic(input[:memberNumberValidNumberOfLetters]) {
|
|
return false
|
|
}
|
|
|
|
if !isNumeric(input[memberNumberValidNumberOfLetters:]){
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func ValidateEligibility(user *viewmodel.User) []errors.ValidationError {
|
|
var result []errors.ValidationError
|
|
|
|
formMode:= formModeVisit // This should be red from request, not hardcoded
|
|
|
|
//First name validation
|
|
if len(user.First) < 1 {
|
|
result = append(result, errors.ValidationError{Field: "first", Message: "First Name is required"})
|
|
}
|
|
|
|
if !isAlphabetic(user.First){
|
|
result = append(result, errors.ValidationError{Field: "first", Message: "First Name contains non-alphabetic characters"})
|
|
}
|
|
|
|
if len(user.First) > firstNameMaxLength {
|
|
result = append(result, errors.ValidationError{Field: "first", Message: "First Name is too long"})
|
|
}
|
|
|
|
//Last name validation
|
|
if len(user.Last) < 1 {
|
|
result = append(result, errors.ValidationError{Field: "last", Message: "Last Name is required"})
|
|
}
|
|
|
|
if !isAlphabetic(user.Last){
|
|
result = append(result, errors.ValidationError{Field: "last", Message: "Last Name contains non-alphabetic characters"})
|
|
}
|
|
|
|
if len(user.Last) > lastNameMaxLength {
|
|
result = append(result, errors.ValidationError{Field: "last", Message: "Last Name is too long"})
|
|
}
|
|
|
|
//Email validation
|
|
if user.Email != nil {
|
|
if (formMode==formModeRide) && len(*user.Email) < 1 {
|
|
result = append(result, errors.ValidationError{Field: "email", Message: "Email is required"})
|
|
}
|
|
|
|
if !isEmailValid(*user.Email) {
|
|
result = append(result, errors.ValidationError{Field: "email", Message: "Email is invalid"})
|
|
}
|
|
|
|
if len(*user.Email) > emailMaxLength {
|
|
result = append(result, errors.ValidationError{Field: "email", Message: "Email is too long"})
|
|
}
|
|
}else{
|
|
if (formMode==formModeRide){
|
|
result = append(result, errors.ValidationError{Field: "email", Message: "Email is required"})
|
|
}
|
|
}
|
|
|
|
//Gender validation
|
|
if ((user.Gender != nil) && len(*user.Gender) < 1) || (user.Gender == nil) {
|
|
result = append(result, errors.ValidationError{Field: "gender", Message: "Member Gender is required"})
|
|
}
|
|
|
|
//Member type validation
|
|
if (user.Type != nil && len(*user.Type) < 1) || (user.Type == nil) {
|
|
result = append(result, errors.ValidationError{Field: "type", Message: "Member Type is required"})
|
|
}
|
|
|
|
//Member# validation
|
|
if !isMemberNumberValid(*user.Member){
|
|
result = append(result, errors.ValidationError{Field: "member", Message: "Member# is invalid"})
|
|
}
|
|
//Birthdate validation
|
|
if user.BirthDate == nil {
|
|
result = append(result, errors.ValidationError{Field: "birthdate", Message: "Choose a Birth Date"})
|
|
}else{
|
|
yesterday := time.Now().Add(-1*time.Hour*hoursInDay)
|
|
if user.BirthDate.After(yesterday) {
|
|
result = append(result, errors.ValidationError{Field: "birthdate", Message: "Choose a valid Birth Date"})
|
|
}
|
|
}
|
|
//Mobile validation
|
|
if formMode == formModeRide {
|
|
if (user.PhoneNumber != nil && len(*user.PhoneNumber) < 1) || (user.PhoneNumber == nil) {
|
|
result = append(result, errors.ValidationError{Field: "phonenumber", Message: "Phone number is required"})
|
|
}
|
|
}
|
|
//User consent validation
|
|
if !user.Consent{
|
|
result = append(result, errors.ValidationError{Field: "consent", Message: "Must be 'Checked'"})
|
|
}
|
|
|
|
return result
|
|
} |