Improve vehicles management

This commit is contained in:
Arnaud Delcasse 2022-11-07 01:33:53 +01:00
parent da16c90fc3
commit d48c1ccf8e
3 changed files with 54 additions and 6 deletions

View File

@ -7,6 +7,7 @@ import (
"net" "net"
"git.coopgo.io/coopgo-platform/fleets/handlers" "git.coopgo.io/coopgo-platform/fleets/handlers"
"git.coopgo.io/coopgo-platform/fleets/storage"
"github.com/spf13/viper" "github.com/spf13/viper"
"google.golang.org/grpc" "google.golang.org/grpc"
codes "google.golang.org/grpc/codes" codes "google.golang.org/grpc/codes"
@ -53,7 +54,16 @@ func (s FleetsServerImpl) GetVehicle(ctx context.Context, req *GetVehicleRequest
} }
func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesRequest) (*GetVehiclesResponse, error) { func (s FleetsServerImpl) GetVehicles(ctx context.Context, req *GetVehiclesRequest) (*GetVehiclesResponse, error) {
responses, err := s.handler.GetVehicles(req.Namespaces) filter := storage.VehicleFilters{
Types: req.Types,
}
if req.AvailabilityFrom.IsValid() {
filter.AvailableFrom = req.AvailabilityFrom.AsTime()
}
if req.AvailabilityTo.IsValid() {
filter.AvailableTo = req.AvailabilityTo.AsTime()
}
responses, err := s.handler.GetVehicles(req.Namespaces, filter)
if err != nil { if err != nil {
return nil, status.Errorf(codes.NotFound, "could not get vehicles : %v", err) return nil, status.Errorf(codes.NotFound, "could not get vehicles : %v", err)
} }

View File

@ -37,7 +37,7 @@ func (h FleetsHandler) GetVehicle(id string) (vehicle *storage.Vehicle, err erro
return vehicle, nil return vehicle, nil
} }
func (h FleetsHandler) GetVehicles(namespaces []string) ([]storage.Vehicle, error) { func (h FleetsHandler) GetVehicles(namespaces []string, filters storage.VehicleFilters) ([]storage.Vehicle, error) {
vehicles, err := h.storage.GetVehicles(namespaces) vehicles, err := h.storage.GetVehicles(namespaces)
newvehicles := []storage.Vehicle{} newvehicles := []storage.Vehicle{}
for _, v := range vehicles { for _, v := range vehicles {
@ -48,6 +48,10 @@ func (h FleetsHandler) GetVehicles(namespaces []string) ([]storage.Vehicle, erro
} }
v.Bookings = bookings v.Bookings = bookings
if !v.MatchesFilters(filters) {
continue
}
newvehicles = append(newvehicles, v) newvehicles = append(newvehicles, v)
} }
return newvehicles, err return newvehicles, err

View File

@ -1,6 +1,9 @@
package storage package storage
import "time" import (
"fmt"
"time"
)
type Vehicle struct { type Vehicle struct {
ID string `json:"id" bson:"_id"` ID string `json:"id" bson:"_id"`
@ -13,13 +16,44 @@ type Vehicle struct {
Bookings []Booking Bookings []Booking
} }
type VehicleFilters struct {
Types []string
AvailableFrom time.Time
AvailableTo time.Time
}
func (v Vehicle) Free(start time.Time, end time.Time) bool { func (v Vehicle) Free(start time.Time, end time.Time) bool {
for _, b := range v.Bookings { for _, b := range v.Bookings {
if (start.After(b.Unavailablefrom) && start.Before(b.Unavailableto)) || fmt.Println("Bookings for", v)
(end.After(b.Unavailablefrom) && end.Before(b.Unavailableto)) || fmt.Println(b)
(start.Before(b.Unavailablefrom) && end.After(b.Unavailableto)) { if (start.Before(b.Unavailablefrom) && end.After(b.Unavailablefrom.Add(24*time.Hour))) ||
(start.Before(b.Unavailableto) && end.After(b.Unavailableto.Add(24*time.Hour))) ||
(start.After(b.Unavailablefrom) && end.Before(b.Unavailableto.Add(24*time.Hour))) {
return false return false
} }
} }
return true return true
} }
func (v Vehicle) MatchesFilters(filters VehicleFilters) bool {
if len(filters.Types) > 0 {
found := false
for _, t := range filters.Types {
if t == v.Type {
found = true
break
}
}
if !found {
return false
}
}
if !v.Free(filters.AvailableFrom, filters.AvailableTo) {
return false
}
fmt.Println(filters)
return true
}