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"
"git.coopgo.io/coopgo-platform/fleets/handlers"
"git.coopgo.io/coopgo-platform/fleets/storage"
"github.com/spf13/viper"
"google.golang.org/grpc"
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) {
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 {
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
}
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)
newvehicles := []storage.Vehicle{}
for _, v := range vehicles {
@ -48,6 +48,10 @@ func (h FleetsHandler) GetVehicles(namespaces []string) ([]storage.Vehicle, erro
}
v.Bookings = bookings
if !v.MatchesFilters(filters) {
continue
}
newvehicles = append(newvehicles, v)
}
return newvehicles, err

View File

@ -1,6 +1,9 @@
package storage
import "time"
import (
"fmt"
"time"
)
type Vehicle struct {
ID string `json:"id" bson:"_id"`
@ -13,13 +16,44 @@ type Vehicle struct {
Bookings []Booking
}
type VehicleFilters struct {
Types []string
AvailableFrom time.Time
AvailableTo time.Time
}
func (v Vehicle) Free(start time.Time, end time.Time) bool {
for _, b := range v.Bookings {
if (start.After(b.Unavailablefrom) && start.Before(b.Unavailableto)) ||
(end.After(b.Unavailablefrom) && end.Before(b.Unavailableto)) ||
(start.Before(b.Unavailablefrom) && end.After(b.Unavailableto)) {
fmt.Println("Bookings for", v)
fmt.Println(b)
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 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
}