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