Upstream sync

This commit is contained in:
Senad Uka
2018-05-30 08:45:32 +02:00
parent 756d84359d
commit f1ac874276
15 changed files with 306 additions and 200 deletions

View File

@@ -9,21 +9,21 @@ import (
)
const (
firstNameMaxLength = 50
lastNameMaxLength = 50
emailMaxLength = 150
firstNameMaxLength = 50
lastNameMaxLength = 50
emailMaxLength = 150
memberNumberValidNumberOfLetters = 3
memberNumberValidNumberOfLetters = 3
)
const (
formModeVisit = 1
formModeRide = 2
formModeVisit = 1
formModeRide = 2
)
func isAlphabetic(input string) bool {
for _, character := range input {
if !(characterIsUpperCase(character) || characterIsLowerCase(character)){
if !(characterIsUpperCase(character) || characterIsLowerCase(character)) {
return false
}
}
@@ -32,7 +32,7 @@ func isAlphabetic(input string) bool {
func isNumeric(input string) bool {
for _, character := range input {
if !characterIsNumber(character){
if !characterIsNumber(character) {
return false
}
}
@@ -40,7 +40,7 @@ func isNumeric(input string) bool {
return true
}
func isEmailValid (email string) bool {
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)
@@ -55,7 +55,7 @@ func isMemberNumberValid(input string) bool {
return false
}
if !isNumeric(input[memberNumberValidNumberOfLetters:]){
if !isNumeric(input[memberNumberValidNumberOfLetters:]) {
return false
}
@@ -65,19 +65,19 @@ func isMemberNumberValid(input string) bool {
func ValidateEligibility(user *viewmodel.User) []errors.ValidationError {
var result []errors.ValidationError
formMode:= formModeVisit // This should be red from request, not hardcoded
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){
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"})
result = append(result, errors.ValidationError{Field: "first", Message: "First Name is too long"})
}
//Last name validation
@@ -85,66 +85,66 @@ func ValidateEligibility(user *viewmodel.User) []errors.ValidationError {
result = append(result, errors.ValidationError{Field: "last", Message: "Last Name is required"})
}
if !isAlphabetic(user.Last){
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"})
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 {
if user.Email != nil && len(*user.Email) > 0 {
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){
} 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"})
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"})
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"})
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)
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"})
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"})
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'"})
if !user.Consent {
result = append(result, errors.ValidationError{Field: "consent", Message: "Must be 'Checked'"})
}
return result
}
}

View File

@@ -45,6 +45,23 @@ func isMixedIDValid(id string) bool {
return (hasUpperCase || hasLowerCase) && hasNumber
}
func ValidateVisitRide(requestRide *viewmodel.RideRequest, user *viewmodel.User) []errors.ValidationError {
var result []errors.ValidationError
if user.Email != nil && len(*user.Email) == 0 {
result = append(result, errors.ValidationError{Field: "email", Message: "Step #1 - Email is mandatory"})
}
if user.PhoneNumber != nil && len(*user.PhoneNumber) == 0 {
result = append(result, errors.ValidationError{Field: "phonenumber", Message: "Step #1 - Phonenumber is mandatory"})
}
rideValidation := ValidateRide(requestRide, user)
result = append(result, rideValidation...)
return result
}
func ValidateRide(requestRide *viewmodel.RideRequest, user *viewmodel.User) []errors.ValidationError {
var result []errors.ValidationError
var validUUIDregex = regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`)

View File

@@ -1,35 +1,44 @@
package validation
import (
"time"
"bitbucket.org/nemt/nemt-portal-api/application/viewmodel"
"bitbucket.org/nemt/nemt-portal-api/infra/errors"
)
func ValidateVisit(visit *viewmodel.Visit, user *viewmodel.User) []errors.ValidationError {
var result []errors.ValidationError
if len(visit.User.First) == 0 {
result = append(result, errors.ValidationError{Field: "first", Message: "Step #1 - First Name is mandatory"})
// Step #1
if len(visit.Provider.ProviderUUID) == 0 {
result = append(result, errors.ValidationError{Field: "provider.id", Message: "Step #1 - Provider is required"})
}
if len(visit.User.Last) == 0 {
result = append(result, errors.ValidationError{Field: "last", Message: "Step #1 - Last Name is mandatory"})
// Step #2
eligibilityResult := ValidateEligibility(&visit.User)
if len(eligibilityResult) > 0 {
result = append(result, eligibilityResult...)
}
if visit.User.Gender == nil || (*visit.User.Gender != "M" && *visit.User.Gender != "F" && *visit.User.Gender != "U") {
result = append(result, errors.ValidationError{Field: "gender", Message: "Step #1 - Gender is mandatory"})
}
//Step #3
if visit.VisitDatetime.IsZero() {
result = append(result, errors.ValidationError{Field: "visit_datetime", Message: "Step #3 - Choose a Date for the Visit"})
} else {
isVisitDayToday := visit.VisitDatetime.Day() == time.Now().Day() && visit.VisitDatetime.Month() == time.Now().Month() && visit.VisitDatetime.Year() == time.Now().Year()
before8Hours := time.Now().Add(-time.Hour * time8Hours)
dayBeforeToday := time.Now().Add(-time.Hour * hoursInDay)
if visit.VisitDatetime.Before(dayBeforeToday) {
result = append(result, errors.ValidationError{Field: "visit_datetime", Message: "Step #3 - Visit cannot occur more than one day before today"})
}
if visit.User.Type == nil || (*visit.User.Type != "S" && *visit.User.Gender != "D" && *visit.User.Gender != "U") {
result = append(result, errors.ValidationError{Field: "type", Message: "Step #1 - Member Type is mandatory"})
}
dayAfter180Days := time.Now().Add(time.Hour * hoursIn180Days)
if visit.VisitDatetime.After(dayAfter180Days) {
result = append(result, errors.ValidationError{Field: "visit_datetime", Message: "Step #3 - Visit cannot occur more than 180 days after today"})
}
if visit.User.Member == nil || len(*visit.User.Member) == 0 {
result = append(result, errors.ValidationError{Field: "member", Message: "Step #1 - Member # is mandatory"})
}
if visit.User.BirthDate == nil || visit.User.BirthDate.IsZero() {
result = append(result, errors.ValidationError{Field: "birthdate", Message: "Step #1 - Birth Date is mandatory"})
if isVisitDayToday && visit.VisitDatetime.Before(before8Hours) {
result = append(result, errors.ValidationError{Field: "visit_datetime", Message: "Step #3 - Visit is more than 8 hours in the past"})
}
}
return result