Improve vehicles management
This commit is contained in:
parent
da16c90fc3
commit
d48c1ccf8e
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue