Upstream sync
This commit is contained in:
@@ -16,6 +16,7 @@ import (
|
||||
"bitbucket.org/nemt/nemt-portal-api/infra/auth"
|
||||
"bitbucket.org/nemt/nemt-portal-api/infra/config"
|
||||
"bitbucket.org/nemt/nemt-portal-api/server/router/routeutils"
|
||||
"bitbucket.org/nemt/nemt-portal-api/server/validation"
|
||||
"github.com/labstack/echo"
|
||||
"googlemaps.github.io/maps"
|
||||
)
|
||||
@@ -77,6 +78,10 @@ func (c *controller) handleEligibility(ctx echo.Context) error {
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
|
||||
if validationErrors := validation.ValidateEligibility(&eligibility.User); len(validationErrors) > 0 {
|
||||
return routeutils.ResponseAPICustomValidationError(ctx, "eligibility validation failed", validationErrors)
|
||||
}
|
||||
|
||||
if eligibility.Provider.ProviderNPI == "" {
|
||||
provider, err := c.svc.Provider.GetByOrganization(authUser.Profiles[0].Organization.UUID, authUser)
|
||||
if err != nil {
|
||||
|
||||
@@ -239,6 +239,42 @@ func (c *controller) handle(ctx echo.Context) error {
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
|
||||
var provider viewmodel.ProviderResp
|
||||
provider, err = c.svc.Provider.GetByNPI(requestRide.RawProvider.FivePartKeyGroups[0].ProviderNum, createdUser)
|
||||
if err != nil {
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
|
||||
fmt.Println("Provider Found: ", provider.ProviderUUID)
|
||||
if provider.ProviderUUID == "" {
|
||||
org := viewmodel.Organization{
|
||||
Type: viewmodel.OrganizationType{
|
||||
Key: "provider",
|
||||
Name: "Provider",
|
||||
},
|
||||
Name: requestRide.RawProvider.OrgName,
|
||||
Description: requestRide.RawProvider.OrgName,
|
||||
Main: false,
|
||||
Author: createdUser,
|
||||
LastEditor: createdUser,
|
||||
Reference: requestRide.RawProvider,
|
||||
}
|
||||
|
||||
org, err = c.svc.Organization.AddOrganization(org, createdUser)
|
||||
if err != nil {
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
fmt.Println("Organization Created: ", org.UUID)
|
||||
|
||||
provider, err = c.svc.Provider.GetByOrganization(org.UUID, createdUser)
|
||||
if err != nil {
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
fmt.Println("Provider Found: ", provider.ProviderUUID)
|
||||
}
|
||||
requestRide.Provider = provider
|
||||
requestRide.Destination.ID = provider.MukID
|
||||
|
||||
name := user.Name
|
||||
names := strings.Split(name, " ")
|
||||
requestRide.Passenger.FirstName = names[0]
|
||||
@@ -304,14 +340,14 @@ func (c *controller) handle(ctx echo.Context) error {
|
||||
|
||||
if requestRide.TripType.Key == "from_visit" {
|
||||
resp.Origin.Name = requestRide.Destination.Name
|
||||
resp.Origin.ID = requestRide.Destination.ID
|
||||
resp.Origin.ID = requestRide.Provider.MukID
|
||||
resp.Destination.Name = requestRide.Origin.Name
|
||||
resp.Destination.ID = requestRide.Origin.ID
|
||||
} else {
|
||||
resp.Origin.Name = requestRide.Origin.Name
|
||||
resp.Origin.ID = requestRide.Origin.ID
|
||||
resp.Destination.Name = requestRide.Destination.Name
|
||||
resp.Destination.ID = requestRide.Destination.ID
|
||||
resp.Destination.ID = requestRide.Provider.MukID
|
||||
}
|
||||
|
||||
resp.Distance = requestRide.Distance
|
||||
@@ -338,6 +374,7 @@ func (c *controller) handle(ctx echo.Context) error {
|
||||
|
||||
entity, err := c.svc.Rides.Save(resp)
|
||||
if err != nil {
|
||||
fmt.Println("Error to save rides: ", err.Error())
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
|
||||
|
||||
@@ -88,9 +88,14 @@ func (c *controller) handleRide(ctx echo.Context) error {
|
||||
fmt.Println(err)
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
user.PhoneNumber = ride.User.PhoneNumber
|
||||
user.Email = ride.User.Email
|
||||
|
||||
ride.Visit.User = user
|
||||
subscriber := "S"
|
||||
ride.Visit.User.Type = &subscriber
|
||||
if ride.Visit.User.Type == nil {
|
||||
subscriber := "S"
|
||||
ride.Visit.User.Type = &subscriber
|
||||
}
|
||||
|
||||
var provider viewmodel.ProviderResp
|
||||
provider, err = c.svc.Provider.GetByUUID(ride.Visit.Provider.ProviderUUID, authUser)
|
||||
@@ -189,13 +194,17 @@ func (c *controller) handleRide(ctx echo.Context) error {
|
||||
Longitude: visit.Provider.Address.Longitude,
|
||||
Address: visit.Provider.Address.StreetAddress1,
|
||||
}
|
||||
ride.Origin = viewmodel.Location{
|
||||
ID: homeAddress.UUID,
|
||||
Name: homeAddress.AddressTypeName,
|
||||
Latitude: homeAddress.Latitude,
|
||||
Longitude: homeAddress.Longitude,
|
||||
Address: homeAddress.Address,
|
||||
|
||||
if len(ride.Origin.ID) == 0 {
|
||||
ride.Origin = viewmodel.Location{
|
||||
ID: homeAddress.UUID,
|
||||
Name: homeAddress.AddressTypeName,
|
||||
Latitude: homeAddress.Latitude,
|
||||
Longitude: homeAddress.Longitude,
|
||||
Address: homeAddress.Address,
|
||||
}
|
||||
}
|
||||
|
||||
ride.Notes = ride.Notes
|
||||
ride.Passenger.FirstName = visit.User.First
|
||||
ride.Passenger.LastName = " "
|
||||
@@ -205,7 +214,7 @@ func (c *controller) handleRide(ctx echo.Context) error {
|
||||
ride.VisitTime = &visit.VisitDatetime
|
||||
ride.UserConsent = true
|
||||
|
||||
if validationErrors := validation.ValidateRide(&ride, &user); len(validationErrors) > 0 {
|
||||
if validationErrors := validation.ValidateVisitRide(&ride, &user); len(validationErrors) > 0 {
|
||||
return routeutils.ResponseAPICustomValidationError(ctx, "ride validation failed", validationErrors)
|
||||
}
|
||||
|
||||
@@ -462,25 +471,25 @@ func (c *controller) handle(ctx echo.Context) error {
|
||||
return routeutils.ResponseAPICustomValidationError(ctx, "visit validation failed", validationErrors)
|
||||
}
|
||||
|
||||
// eligibility := viewmodel.Eligibility{}
|
||||
// eligibility.Provider.ProviderNPI = provider.InternalID
|
||||
// eligibility.Provider.ProviderName = provider.OrganizatioName
|
||||
// eligibility.TrackingID = c.rangeIn(1000000, 9999999)
|
||||
// eligibility.Subscriber.SubscriberID = *visit.User.Member
|
||||
// eligibility.Subscriber.PatientType = *visit.User.Type
|
||||
// eligibility.Subscriber.Name.First = visit.User.First
|
||||
// eligibility.Subscriber.Name.Last = visit.User.Last
|
||||
// eligibility.Subscriber.DemographicInfo.DateOfBirth = *visit.User.BirthDate
|
||||
// eligibility.Subscriber.DemographicInfo.Gender = *visit.User.Gender
|
||||
// loc, _ := time.LoadLocation("America/Chicago")
|
||||
// eligibility.ServiceInfo.DateOfService = time.Now().In(loc)
|
||||
// eligibility.ServiceInfo.ServiceTypeCodes = []string{"30"}
|
||||
eligibility := viewmodel.Eligibility{}
|
||||
eligibility.Provider.ProviderNPI = provider.InternalID
|
||||
eligibility.Provider.ProviderName = provider.OrganizatioName
|
||||
eligibility.TrackingID = c.rangeIn(1000000, 9999999)
|
||||
eligibility.Subscriber.SubscriberID = *visit.User.Member
|
||||
eligibility.Subscriber.PatientType = *visit.User.Type
|
||||
eligibility.Subscriber.Name.First = visit.User.First
|
||||
eligibility.Subscriber.Name.Last = visit.User.Last
|
||||
eligibility.Subscriber.DemographicInfo.DateOfBirth = *visit.User.BirthDate
|
||||
eligibility.Subscriber.DemographicInfo.Gender = *visit.User.Gender
|
||||
loc, _ := time.LoadLocation("America/Chicago")
|
||||
eligibility.ServiceInfo.DateOfService = time.Now().In(loc)
|
||||
eligibility.ServiceInfo.ServiceTypeCodes = []string{"30"}
|
||||
|
||||
// resp, err := c.bcbsi.BXE.Get271(eligibility)
|
||||
// if err != nil {
|
||||
// fmt.Println("Error to get eligibility: ", err.Error())
|
||||
// return routeutils.ResponseAPIValidationError(ctx, err.Error())
|
||||
// }
|
||||
resp, err := c.bcbsi.BXE.Get271(eligibility)
|
||||
if err != nil {
|
||||
fmt.Println("Error to get eligibility: ", err.Error())
|
||||
return routeutils.ResponseAPIValidationError(ctx, err.Error())
|
||||
}
|
||||
|
||||
user, err := c.svc.Users.GetByMemberID(*visit.User.Member)
|
||||
if err != nil {
|
||||
@@ -556,60 +565,60 @@ func (c *controller) handle(ctx echo.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
// address := viewmodel.Address{}
|
||||
// header := resp.Division.HealthCareEligibilityResponse.LoopHL0030[0].HL_0460[0].HL_0890[0].NM1_0920[0].N3_0950
|
||||
// body := resp.Division.HealthCareEligibilityResponse.LoopHL0030[0].HL_0460[0].HL_0890[0].NM1_0920[0].N4_0960
|
||||
// zipCode := strings.TrimSpace(body.N403)
|
||||
address := viewmodel.Address{}
|
||||
header := resp.Division.HealthCareEligibilityResponse.LoopHL0030[0].HL_0460[0].HL_0890[0].NM1_0920[0].N3_0950
|
||||
body := resp.Division.HealthCareEligibilityResponse.LoopHL0030[0].HL_0460[0].HL_0890[0].NM1_0920[0].N4_0960
|
||||
zipCode := strings.TrimSpace(body.N403)
|
||||
|
||||
// address.AddressTypeName = "Home"
|
||||
// address.AddressType = "home"
|
||||
// address.Name = fmt.Sprintf("%s, %s", header.N301, body.N401)
|
||||
// address.Address = fmt.Sprintf("%s, %s (%s)", header.N301, body.N401, zipCode)
|
||||
// address.CreatedUserUUID = authUser.ID
|
||||
// address.User = user
|
||||
// address.Type = "provider"
|
||||
address.AddressTypeName = "Home"
|
||||
address.AddressType = "home"
|
||||
address.Name = fmt.Sprintf("%s, %s", header.N301, body.N401)
|
||||
address.Address = fmt.Sprintf("%s, %s (%s)", header.N301, body.N401, zipCode)
|
||||
address.CreatedUserUUID = authUser.ID
|
||||
address.User = user
|
||||
address.Type = "provider"
|
||||
|
||||
// googleMapsAPI, err := maps.NewClient(maps.WithClientIDAndSignature("gme-bluecrossandblue1", "msqgD-jdqCyR0M_1u5C1HION5iI="))
|
||||
// if err != nil {
|
||||
// fmt.Println("Error to instantiate googles api: ", err.Error())
|
||||
// return routeutils.HandleAPIError(ctx, err)
|
||||
// }
|
||||
googleMapsAPI, err := maps.NewClient(maps.WithClientIDAndSignature("gme-bluecrossandblue1", "msqgD-jdqCyR0M_1u5C1HION5iI="))
|
||||
if err != nil {
|
||||
fmt.Println("Error to instantiate googles api: ", err.Error())
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
|
||||
// r := &maps.GeocodingRequest{
|
||||
// Address: address.Address + " " + body.N402 + ", " + zipCode,
|
||||
// }
|
||||
r := &maps.GeocodingRequest{
|
||||
Address: address.Address + " " + body.N402 + ", " + zipCode,
|
||||
}
|
||||
|
||||
// result, err := googleMapsAPI.Geocode(context.Background(), r)
|
||||
// if err != nil {
|
||||
// fmt.Println("Error to instantiate googles api: ", err.Error())
|
||||
// return routeutils.HandleAPIError(ctx, err)
|
||||
// }
|
||||
result, err := googleMapsAPI.Geocode(context.Background(), r)
|
||||
if err != nil {
|
||||
fmt.Println("Error to instantiate googles api: ", err.Error())
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
|
||||
// if len(result) > 0 {
|
||||
// address.Latitude = result[0].Geometry.Location.Lat
|
||||
// address.Longitude = result[0].Geometry.Location.Lng
|
||||
// }
|
||||
if len(result) > 0 {
|
||||
address.Latitude = result[0].Geometry.Location.Lat
|
||||
address.Longitude = result[0].Geometry.Location.Lng
|
||||
}
|
||||
|
||||
// if address.Latitude != 0 && address.Longitude != 0 {
|
||||
// if len(user.Addresses) > 0 {
|
||||
// for _, a := range user.Addresses {
|
||||
// if a.AddressType == "home" {
|
||||
// err := c.svc.Users.RemoveAddress(a.UUID)
|
||||
// if err != nil {
|
||||
// fmt.Println("Error to remove old address: ", err.Error())
|
||||
// return routeutils.HandleAPIError(ctx, err)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
if address.Latitude != 0 && address.Longitude != 0 {
|
||||
if len(user.Addresses) > 0 {
|
||||
for _, a := range user.Addresses {
|
||||
if a.AddressType == "home" {
|
||||
err := c.svc.Users.RemoveAddress(a.UUID)
|
||||
if err != nil {
|
||||
fmt.Println("Error to remove old address: ", err.Error())
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// address, err = c.svc.Users.SaveAddress(address)
|
||||
// if err != nil {
|
||||
// fmt.Println("Error saving address: ", err.Error())
|
||||
// return routeutils.HandleAPIError(ctx, err)
|
||||
// }
|
||||
// user.Addresses = append(user.Addresses, address)
|
||||
// }
|
||||
address, err = c.svc.Users.SaveAddress(address)
|
||||
if err != nil {
|
||||
fmt.Println("Error saving address: ", err.Error())
|
||||
return routeutils.HandleAPIError(ctx, err)
|
||||
}
|
||||
user.Addresses = append(user.Addresses, address)
|
||||
}
|
||||
|
||||
visit.TripType = viewmodel.TripType{
|
||||
Key: "no_trip",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}$`)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user