From d1680d50bfe6b48a142560598fcc634b18bd7e58 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Thu, 3 May 2018 07:57:08 +0200 Subject: [PATCH 1/8] Upstream sync --- config.dev.toml | 1 - config.prd.toml | 1 - config.stg.toml | 1 - data/datamysql/notification.go | 4 +--- infra/cache/cache.go | 3 +-- infra/config/config.go | 2 -- server/serverconfig/serverconfig.go | 2 +- 7 files changed, 3 insertions(+), 11 deletions(-) diff --git a/config.dev.toml b/config.dev.toml index 77cbd91..9a901e7 100644 --- a/config.dev.toml +++ b/config.dev.toml @@ -37,7 +37,6 @@ db = 0 pass = "3rdaP3KL2x%V" prefix = "nemt-portal-api-dev" default-expiration = "5m" -master-name = "devmaster01" [log] log-to-file = false diff --git a/config.prd.toml b/config.prd.toml index dacdcc8..b341a3e 100644 --- a/config.prd.toml +++ b/config.prd.toml @@ -37,7 +37,6 @@ db = 0 pass = "3rdaP3KL2x%V" prefix = "portal-api-prod" default-expiration = "5m" -master-name = "master01" [log] log-to-file = false diff --git a/config.stg.toml b/config.stg.toml index 4ca8fb6..66ef0eb 100644 --- a/config.stg.toml +++ b/config.stg.toml @@ -37,7 +37,6 @@ db = 0 pass = "3rdaP3KL2x%V" prefix = "portal-api-test" default-expiration = "5m" -master-name = "devmaster01" [log] log-to-file = false diff --git a/data/datamysql/notification.go b/data/datamysql/notification.go index c6b9166..3d5f834 100644 --- a/data/datamysql/notification.go +++ b/data/datamysql/notification.go @@ -80,9 +80,7 @@ func (c *notificationRepo) getQuery() string { INNER JOIN tab_login e ON c.user_id = e.user_id INNER JOIN tab_login f - ON d.user_id = f.user_id - INNER JOIN tab_ride g - ON g.ride_id = a.ride_id ` + ON d.user_id = f.user_id` } func (c *notificationRepo) GetLastNotificationFromPhoneNumber(notificationType string, phoneNumber string, status string) (entity.Notification, error) { diff --git a/infra/cache/cache.go b/infra/cache/cache.go index 8c4eb11..d7c4f31 100644 --- a/infra/cache/cache.go +++ b/infra/cache/cache.go @@ -31,11 +31,10 @@ type RedisCache struct { func Instance(cfg *config.Config) contract.CacheManager { once.Do(func() { client := redis.NewFailoverClient(&redis.FailoverOptions{ - MasterName: cfg.Cache.Master, + MasterName: "master01", SentinelAddrs: []string{fmt.Sprintf("%s:%v", cfg.Cache.Server, cfg.Cache.Port)}, Password: cfg.Cache.Pass, DB: cfg.Cache.DB, - MaxRetries: 10, }) instance = &RedisCache{cfg, client} diff --git a/infra/config/config.go b/infra/config/config.go index d17cdb8..402805a 100644 --- a/infra/config/config.go +++ b/infra/config/config.go @@ -120,7 +120,6 @@ type CacheConfig struct { Pass string Prefix string DefaultExpiration time.Duration - Master string } // CacheConfig represents the configuration values about the documentation config. @@ -200,7 +199,6 @@ func Read() (*Config, error) { Pass: viper.GetString("cache.pass"), Prefix: viper.GetString("cache.prefix"), DefaultExpiration: viper.GetDuration("cache.default-expiration"), - Master: viper.GetString("cache.master-name"), }, Lyft: LyftConfig{ Client: viper.GetString("lyft.key"), diff --git a/server/serverconfig/serverconfig.go b/server/serverconfig/serverconfig.go index 04687a3..6b34b93 100644 --- a/server/serverconfig/serverconfig.go +++ b/server/serverconfig/serverconfig.go @@ -18,7 +18,7 @@ func SetMiddlewares(server *echo.Echo, cfg *config.Config, log *logger.Logger, s setCORSMiddleware(server, cfg) setBodyLimitMiddleware(server) setRateLimitMiddleware(server) - //setAuthorizationMiddleware(server, log, cfg, appsvc) + setAuthorizationMiddleware(server, log, cfg, appsvc) err := setJWTMiddleware(server, cfg) if err != nil { -- 2.47.3 From cbbbdc601b9bcc3b61c7298066745bf650b0a6fe Mon Sep 17 00:00:00 2001 From: GotPPay Date: Thu, 3 May 2018 18:29:24 +0200 Subject: [PATCH 2/8] create structure for rules checking --- server/router/organizationroute/controller.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/router/organizationroute/controller.go b/server/router/organizationroute/controller.go index 1044379..d399c6e 100644 --- a/server/router/organizationroute/controller.go +++ b/server/router/organizationroute/controller.go @@ -239,6 +239,10 @@ func (c *controller) handleRemoveAddress(ctx echo.Context) error { return routeutils.HandleAPIError(ctx, err) } + if !authorization.CanDeleteAddress(authUser, address) { + return routeutils.ResponseAPIAuthorizationError(ctx) + } + address.UpdatedUser.ID = authUser.ID err = c.svc.Organization.InactivateOrganizationAddress(orgUUID, address, authUser) @@ -315,6 +319,10 @@ func (c *controller) handleRemoveContact(ctx echo.Context) error { return routeutils.HandleAPIError(ctx, err) } + if !authorization.CanDeleteContact(authUser, contact) { + return routeutils.ResponseAPIAuthorizationError(ctx) + } + contact.UpdatedUser.ID = authUser.ID err = c.svc.Organization.InactivateOrganizationContact(orgUUID, contact, authUser) -- 2.47.3 From 1ed02e2e739608f4b0506f7afc98f8a18fc5ce79 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Mon, 7 May 2018 16:39:23 +0200 Subject: [PATCH 3/8] Upsteam sync --- config.dev.toml | 1 + config.prd.toml | 1 + config.stg.toml | 1 + data/datamysql/notification.go | 4 +++- infra/cache/cache.go | 3 ++- infra/config/config.go | 2 ++ server/serverconfig/serverconfig.go | 2 +- 7 files changed, 11 insertions(+), 3 deletions(-) diff --git a/config.dev.toml b/config.dev.toml index 9a901e7..77cbd91 100644 --- a/config.dev.toml +++ b/config.dev.toml @@ -37,6 +37,7 @@ db = 0 pass = "3rdaP3KL2x%V" prefix = "nemt-portal-api-dev" default-expiration = "5m" +master-name = "devmaster01" [log] log-to-file = false diff --git a/config.prd.toml b/config.prd.toml index b341a3e..dacdcc8 100644 --- a/config.prd.toml +++ b/config.prd.toml @@ -37,6 +37,7 @@ db = 0 pass = "3rdaP3KL2x%V" prefix = "portal-api-prod" default-expiration = "5m" +master-name = "master01" [log] log-to-file = false diff --git a/config.stg.toml b/config.stg.toml index 66ef0eb..4ca8fb6 100644 --- a/config.stg.toml +++ b/config.stg.toml @@ -37,6 +37,7 @@ db = 0 pass = "3rdaP3KL2x%V" prefix = "portal-api-test" default-expiration = "5m" +master-name = "devmaster01" [log] log-to-file = false diff --git a/data/datamysql/notification.go b/data/datamysql/notification.go index 3d5f834..c6b9166 100644 --- a/data/datamysql/notification.go +++ b/data/datamysql/notification.go @@ -80,7 +80,9 @@ func (c *notificationRepo) getQuery() string { INNER JOIN tab_login e ON c.user_id = e.user_id INNER JOIN tab_login f - ON d.user_id = f.user_id` + ON d.user_id = f.user_id + INNER JOIN tab_ride g + ON g.ride_id = a.ride_id ` } func (c *notificationRepo) GetLastNotificationFromPhoneNumber(notificationType string, phoneNumber string, status string) (entity.Notification, error) { diff --git a/infra/cache/cache.go b/infra/cache/cache.go index d7c4f31..8c4eb11 100644 --- a/infra/cache/cache.go +++ b/infra/cache/cache.go @@ -31,10 +31,11 @@ type RedisCache struct { func Instance(cfg *config.Config) contract.CacheManager { once.Do(func() { client := redis.NewFailoverClient(&redis.FailoverOptions{ - MasterName: "master01", + MasterName: cfg.Cache.Master, SentinelAddrs: []string{fmt.Sprintf("%s:%v", cfg.Cache.Server, cfg.Cache.Port)}, Password: cfg.Cache.Pass, DB: cfg.Cache.DB, + MaxRetries: 10, }) instance = &RedisCache{cfg, client} diff --git a/infra/config/config.go b/infra/config/config.go index 402805a..d17cdb8 100644 --- a/infra/config/config.go +++ b/infra/config/config.go @@ -120,6 +120,7 @@ type CacheConfig struct { Pass string Prefix string DefaultExpiration time.Duration + Master string } // CacheConfig represents the configuration values about the documentation config. @@ -199,6 +200,7 @@ func Read() (*Config, error) { Pass: viper.GetString("cache.pass"), Prefix: viper.GetString("cache.prefix"), DefaultExpiration: viper.GetDuration("cache.default-expiration"), + Master: viper.GetString("cache.master-name"), }, Lyft: LyftConfig{ Client: viper.GetString("lyft.key"), diff --git a/server/serverconfig/serverconfig.go b/server/serverconfig/serverconfig.go index 6b34b93..04687a3 100644 --- a/server/serverconfig/serverconfig.go +++ b/server/serverconfig/serverconfig.go @@ -18,7 +18,7 @@ func SetMiddlewares(server *echo.Echo, cfg *config.Config, log *logger.Logger, s setCORSMiddleware(server, cfg) setBodyLimitMiddleware(server) setRateLimitMiddleware(server) - setAuthorizationMiddleware(server, log, cfg, appsvc) + //setAuthorizationMiddleware(server, log, cfg, appsvc) err := setJWTMiddleware(server, cfg) if err != nil { -- 2.47.3 From f0e63f41660953ef23ef4853bcf38d1487892fd5 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Tue, 8 May 2018 05:26:31 +0200 Subject: [PATCH 4/8] implement ride validation --- server/router/tncroute/controller.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/router/tncroute/controller.go b/server/router/tncroute/controller.go index 336dfce..0bea613 100644 --- a/server/router/tncroute/controller.go +++ b/server/router/tncroute/controller.go @@ -13,6 +13,7 @@ import ( "bitbucket.org/nemt/nemt-portal-api/application/tncservice" "bitbucket.org/nemt/nemt-portal-api/application/viewmodel" "bitbucket.org/nemt/nemt-portal-api/infra/auth" + "bitbucket.org/nemt/nemt-portal-api/infra/errors" "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" @@ -24,6 +25,18 @@ import ( "github.com/gorilla/websocket" ) +const ( + tripTypeFromVisit = "From Visit" + tripTypeToVisit = "To Visit" + tripTypeFromVisitWillCall = "From Visit / Will Call" + tripTypeRoundTrip = "Round Trip" + tripTypeRountTripWillCall = "Round Trip / Will Call" +) + +const ( + loadingTime = 30 //in minutes +) + var ( instance *controller once sync.Once -- 2.47.3 From 1ad4b8a38ef39876c006288c79cbadfb998dc059 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Tue, 8 May 2018 11:03:39 +0200 Subject: [PATCH 5/8] update validation rules based on new instructions --- server/router/tncroute/controller.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/router/tncroute/controller.go b/server/router/tncroute/controller.go index 0bea613..3d2898d 100644 --- a/server/router/tncroute/controller.go +++ b/server/router/tncroute/controller.go @@ -35,6 +35,8 @@ const ( const ( loadingTime = 30 //in minutes + minimumLoadTime = 30 //in minutes + minimumPickupTime = 0 //in minutes ) var ( -- 2.47.3 From 1e2b7fcd4c3e4c840efd63e5b111f6d6954113bf Mon Sep 17 00:00:00 2001 From: GotPPay Date: Tue, 8 May 2018 17:57:03 +0200 Subject: [PATCH 6/8] move validation to external function and update rules --- server/router/tncroute/controller.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/server/router/tncroute/controller.go b/server/router/tncroute/controller.go index 3d2898d..336dfce 100644 --- a/server/router/tncroute/controller.go +++ b/server/router/tncroute/controller.go @@ -13,7 +13,6 @@ import ( "bitbucket.org/nemt/nemt-portal-api/application/tncservice" "bitbucket.org/nemt/nemt-portal-api/application/viewmodel" "bitbucket.org/nemt/nemt-portal-api/infra/auth" - "bitbucket.org/nemt/nemt-portal-api/infra/errors" "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" @@ -25,20 +24,6 @@ import ( "github.com/gorilla/websocket" ) -const ( - tripTypeFromVisit = "From Visit" - tripTypeToVisit = "To Visit" - tripTypeFromVisitWillCall = "From Visit / Will Call" - tripTypeRoundTrip = "Round Trip" - tripTypeRountTripWillCall = "Round Trip / Will Call" -) - -const ( - loadingTime = 30 //in minutes - minimumLoadTime = 30 //in minutes - minimumPickupTime = 0 //in minutes -) - var ( instance *controller once sync.Once -- 2.47.3 From 8137447e7f2d789fc9ac3f471cf077bbc25fe7e0 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Wed, 16 May 2018 15:57:14 +0200 Subject: [PATCH 7/8] apply regex match on user and locations UUID --- server/validation/tnc.go | 237 +++++++++++++++++++-------------------- 1 file changed, 117 insertions(+), 120 deletions(-) diff --git a/server/validation/tnc.go b/server/validation/tnc.go index 14352da..15c8e73 100644 --- a/server/validation/tnc.go +++ b/server/validation/tnc.go @@ -1,36 +1,34 @@ package validation import ( - - "time" "fmt" - "strconv" "regexp" + "strconv" + "time" "bitbucket.org/nemt/nemt-portal-api/application/viewmodel" "bitbucket.org/nemt/nemt-portal-api/infra/errors" - ) const ( - tripTypeFromVisit = "from_visit" - tripTypeToVisit = "to_visit" - tripTypeFromVisitWillCall = "from_visit_call" - tripTypeRoundTrip = "roundtrip" - tripTypeRountTripWillCall = "roundtrip_call" + tripTypeFromVisit = "from_visit" + tripTypeToVisit = "to_visit" + tripTypeFromVisitWillCall = "from_visit_call" + tripTypeRoundTrip = "roundtrip" + tripTypeRountTripWillCall = "roundtrip_call" ) const ( - loadingTime = 30 //in minutes - minimumLoadTime = 30 //in minutes - minimumPickupTime = 10 //in minutes + loadingTime = 30 //in minutes + minimumLoadTime = 30 //in minutes + minimumPickupTime = 10 //in minutes ) const ( - hoursInDay = 24 - hoursIn180Days = 24*180 - time8Hours = 8 - time10Minutes = 10 + hoursInDay = 24 + hoursIn180Days = 24 * 180 + time8Hours = 8 + time10Minutes = 10 ) func isMixedIDValid(id string) bool { @@ -38,7 +36,7 @@ func isMixedIDValid(id string) bool { hasLowerCase := false hasNumber := false - for _, character := range (id) { + for _, character := range id { hasUpperCase = hasUpperCase || ((character >= 65) && (character <= 90)) hasLowerCase = hasLowerCase || ((character >= 97) && (character <= 122)) hasNumber = hasNumber || ((character >= 48) && (character <= 57)) @@ -53,163 +51,162 @@ func ValidateRide(requestRide *viewmodel.RideRequest, user *viewmodel.User) []er //Step #1 validation - if !validUUIDregex.MatchString(user.ID){ - result = append(result, errors.ValidationError{Field : "user_uuid", Message : "Step #1 - Choose a Member" }) + if !validUUIDregex.MatchString(user.ID) { + result = append(result, errors.ValidationError{Field: "user_uuid", Message: "Step #1 - Choose a Member"}) } fmt.Println("\n\n", requestRide.Origin.ID, "\n\n") if !isMixedIDValid(requestRide.Origin.ID) { //it is not UUID or similar to UUID, let's try with just a number - if originID, err := strconv.Atoi(requestRide.Origin.ID) ; err!= nil || originID <= 0 { + if originID, err := strconv.Atoi(requestRide.Origin.ID); err != nil || originID <= 0 { //it is not a number - result = append (result, errors.ValidationError{Field : "origin.id", Message : "Step #1 - Choose a Pickup Address"}) - } + result = append(result, errors.ValidationError{Field: "origin.id", Message: "Step #1 - Choose a Pickup Address"}) + } } if !requestRide.UserConsent { - result = append (result, errors.ValidationError{Field : "user_consent", Message : "Step #1 - Member must consent to Terms of Use"}) - } + result = append(result, errors.ValidationError{Field: "user_consent", Message: "Step #1 - Member must consent to Terms of Use"}) + } //Step #2 validation fmt.Println("\n\n", requestRide.Destination.ID, "\n\n") if !isMixedIDValid(requestRide.Destination.ID) { //it is not UUID or similar to UUID, let's try with just a number - if destinationID, err := strconv.Atoi(requestRide.Destination.ID) ; err!= nil || destinationID <= 0 { - result = append (result, errors.ValidationError{Field : "destination.id", Message : "Step #2 - Choose a Provider"}) - } + if destinationID, err := strconv.Atoi(requestRide.Destination.ID); err != nil || destinationID <= 0 { + result = append(result, errors.ValidationError{Field: "destination.id", Message: "Step #2 - Choose a Provider"}) + } } //Step #3 validation isVisitDayToday := requestRide.VisitDate.Day() == time.Now().Day() && requestRide.VisitDate.Month() == time.Now().Month() && requestRide.VisitDate.Year() == time.Now().Year() - before8Hours := time.Now().Add(-time.Hour*time8Hours) + before8Hours := time.Now().Add(-time.Hour * time8Hours) if requestRide.VisitDate == nil { - result = append (result, errors.ValidationError{Field : "visit_date", Message : "Step #3 - Choose a Date for the Visit"}) - }else{ - dayBeforeToday := time.Now().Add(-time.Hour*hoursInDay) + result = append(result, errors.ValidationError{Field: "visit_date", Message: "Step #3 - Choose a Date for the Visit"}) + } else { + dayBeforeToday := time.Now().Add(-time.Hour * hoursInDay) if requestRide.VisitDate.Before(dayBeforeToday) { - result = append (result, errors.ValidationError{Field : "visit_date", Message : "Step #3 - Visit cannot occur more than one day before today"}) + result = append(result, errors.ValidationError{Field: "visit_date", Message: "Step #3 - Visit cannot occur more than one day before today"}) } - dayAfter180Days := time.Now().Add(time.Hour*hoursIn180Days) + dayAfter180Days := time.Now().Add(time.Hour * hoursIn180Days) if requestRide.VisitDate.After(dayAfter180Days) { - result = append (result, errors.ValidationError{Field : "visit_date", Message : "Step #3 - Visit cannot occur more than 180 days after today"}) + result = append(result, errors.ValidationError{Field: "visit_date", Message: "Step #3 - Visit cannot occur more than 180 days after today"}) } if requestRide.VisitTime == nil { - result = append (result, errors.ValidationError{Field : "visit_time", Message : "Step #3 - Choose a Time for the Visit"}) - }else{ + result = append(result, errors.ValidationError{Field: "visit_time", Message: "Step #3 - Choose a Time for the Visit"}) + } else { if isVisitDayToday && requestRide.VisitTime.Before(before8Hours) { - result = append (result, errors.ValidationError{Field : "visit_time", Message : "Step #3 - Visit is more than 8 hours in the past"}) + result = append(result, errors.ValidationError{Field: "visit_time", Message: "Step #3 - Visit is more than 8 hours in the past"}) } } } //Step #4 validation - timeWithDurationAndLoadingTime := requestRide.VisitTime.Add(-time.Duration(requestRide.Duration)*time.Second).Add(-loadingTime*time.Minute) - after10Minutes := time.Now().Add(time.Minute*time10Minutes) + timeWithDurationAndLoadingTime := requestRide.VisitTime.Add(-time.Duration(requestRide.Duration) * time.Second).Add(-loadingTime * time.Minute) + after10Minutes := time.Now().Add(time.Minute * time10Minutes) isTripTypeValid := true switch requestRide.TripType.Key { - case tripTypeToVisit: - if requestRide.PickupTime == nil { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Choose a Pickup Time"}) - }else{ - if requestRide.PickupTime.After(*requestRide.VisitTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time must occur before Visit Time"}) - } - - if requestRide.PickupTime.After(timeWithDurationAndLoadingTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time less than required time before Visit Time"}) - } - - if isVisitDayToday && requestRide.PickupTime.Before(before8Hours) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Visit cannot occour in the past"}) - } + case tripTypeToVisit: + if requestRide.PickupTime == nil { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Choose a Pickup Time"}) + } else { + if requestRide.PickupTime.After(*requestRide.VisitTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time must occur before Visit Time"}) } - case tripTypeFromVisit : - if requestRide.PickupTime == nil { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Choose a Pickup Time"}) - }else{ - timeWithMinimumPickupTime := time.Now().Add(minimumPickupTime*time.Minute) - if isVisitDayToday && requestRide.PickupTime.Before(timeWithMinimumPickupTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : fmt.Sprint("Step #4 - Time must be more than %d minutes from now",minimumPickupTime)}) - } - - if requestRide.PickupTime.Before(*requestRide.VisitTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time less than required time after Visit Time"}) - } - - timeWithMinimumLoadTime := time.Now().Add(minimumLoadTime*time.Minute) - if requestRide.PickupTime.Before(timeWithMinimumLoadTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time less than Minimum Load Time before Visit Time"}) - } + if requestRide.PickupTime.After(timeWithDurationAndLoadingTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time less than required time before Visit Time"}) } - case tripTypeFromVisitWillCall: - //no special validation for this case + if isVisitDayToday && requestRide.PickupTime.Before(before8Hours) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Visit cannot occour in the past"}) + } + } - case tripTypeRoundTrip: - if requestRide.PickupTime == nil { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Choose a Pickup Time"}) - }else{ - if requestRide.PickupTime.After(*requestRide.VisitTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time must occur before Visit Time"}) - } - - if requestRide.PickupTime.After(timeWithDurationAndLoadingTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time less than required time before Visit Time"}) - } - - if isVisitDayToday && requestRide.PickupTime.Before(after10Minutes) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time must be at least 10 minutes from now"}) - } + case tripTypeFromVisit: + if requestRide.PickupTime == nil { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Choose a Pickup Time"}) + } else { + timeWithMinimumPickupTime := time.Now().Add(minimumPickupTime * time.Minute) + if isVisitDayToday && requestRide.PickupTime.Before(timeWithMinimumPickupTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: fmt.Sprint("Step #4 - Time must be more than %d minutes from now", minimumPickupTime)}) } - if requestRide.ReturnTime == nil { - result = append (result, errors.ValidationError{Field : "return_time", Message : "Step #4 - Choose a Pickup Time"}) - }else{ - if isVisitDayToday { - if requestRide.ReturnTime.Before(before8Hours) { - result = append (result, errors.ValidationError{Field : "return_time", Message : "Step #4 - Return Time is more than 8 hours after Visit Time"}) - } - - if requestRide.ReturnTime.Before(after10Minutes) { - result = append (result, errors.ValidationError{Field : "return_time", Message : "Step #4 - Return Time must be at least 10 minutes from now"}) - } - } + if requestRide.PickupTime.Before(*requestRide.VisitTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time less than required time after Visit Time"}) } - case tripTypeRountTripWillCall: - if requestRide.PickupTime == nil { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Choose a Pickup Time"}) - }else{ - if requestRide.PickupTime.After(*requestRide.VisitTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time must occur before Visit Time"}) - } - - if requestRide.PickupTime.After(timeWithDurationAndLoadingTime) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Pickup Time less than required time after Visit Time"}) - } - - if isVisitDayToday && requestRide.PickupTime.Before(before8Hours) { - result = append (result, errors.ValidationError{Field : "pickup_time", Message : "Step #4 - Visit cannot occur in the past "}) - } + timeWithMinimumLoadTime := time.Now().Add(minimumLoadTime * time.Minute) + if requestRide.PickupTime.Before(timeWithMinimumLoadTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time less than Minimum Load Time before Visit Time"}) + } + } + + case tripTypeFromVisitWillCall: + //no special validation for this case + + case tripTypeRoundTrip: + if requestRide.PickupTime == nil { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Choose a Pickup Time"}) + } else { + if requestRide.PickupTime.After(*requestRide.VisitTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time must occur before Visit Time"}) } - default: - isTripTypeValid = false + if requestRide.PickupTime.After(timeWithDurationAndLoadingTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time less than required time before Visit Time"}) + } + + if isVisitDayToday && requestRide.PickupTime.Before(after10Minutes) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time must be at least 10 minutes from now"}) + } + } + + if requestRide.ReturnTime == nil { + result = append(result, errors.ValidationError{Field: "return_time", Message: "Step #4 - Choose a Pickup Time"}) + } else { + if isVisitDayToday { + if requestRide.ReturnTime.Before(before8Hours) { + result = append(result, errors.ValidationError{Field: "return_time", Message: "Step #4 - Return Time is more than 8 hours after Visit Time"}) + } + + if requestRide.ReturnTime.Before(after10Minutes) { + result = append(result, errors.ValidationError{Field: "return_time", Message: "Step #4 - Return Time must be at least 10 minutes from now"}) + } + } + } + + case tripTypeRountTripWillCall: + if requestRide.PickupTime == nil { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Choose a Pickup Time"}) + } else { + if requestRide.PickupTime.After(*requestRide.VisitTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time must occur before Visit Time"}) + } + + if requestRide.PickupTime.After(timeWithDurationAndLoadingTime) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Pickup Time less than required time after Visit Time"}) + } + + if isVisitDayToday && requestRide.PickupTime.Before(before8Hours) { + result = append(result, errors.ValidationError{Field: "pickup_time", Message: "Step #4 - Visit cannot occur in the past "}) + } + } + + default: + isTripTypeValid = false } if !isTripTypeValid { - result = append (result, errors.ValidationError{Field : "trip_type.key", Message : "Step #4 - Choose a Trip Type"}) + result = append(result, errors.ValidationError{Field: "trip_type.key", Message: "Step #4 - Choose a Trip Type"}) } - return result -} \ No newline at end of file +} -- 2.47.3 From 6d77f470ee498811330ffb4f9d5ba64e1caf2647 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Wed, 16 May 2018 19:20:31 +0200 Subject: [PATCH 8/8] No need to check on delete --- server/router/organizationroute/controller.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/router/organizationroute/controller.go b/server/router/organizationroute/controller.go index d399c6e..1044379 100644 --- a/server/router/organizationroute/controller.go +++ b/server/router/organizationroute/controller.go @@ -239,10 +239,6 @@ func (c *controller) handleRemoveAddress(ctx echo.Context) error { return routeutils.HandleAPIError(ctx, err) } - if !authorization.CanDeleteAddress(authUser, address) { - return routeutils.ResponseAPIAuthorizationError(ctx) - } - address.UpdatedUser.ID = authUser.ID err = c.svc.Organization.InactivateOrganizationAddress(orgUUID, address, authUser) @@ -319,10 +315,6 @@ func (c *controller) handleRemoveContact(ctx echo.Context) error { return routeutils.HandleAPIError(ctx, err) } - if !authorization.CanDeleteContact(authUser, contact) { - return routeutils.ResponseAPIAuthorizationError(ctx) - } - contact.UpdatedUser.ID = authUser.ID err = c.svc.Organization.InactivateOrganizationContact(orgUUID, contact, authUser) -- 2.47.3