package storage import ( "fmt" "time" ) type Vehicle struct { ID string `json:"id" bson:"_id"` Type string `json:"type"` Namespace string `json:"namespace"` Administrators []string `json:"administrators"` Data map[string]any `json:"data"` Metadata map[string]any `json:"metadata"` Bookings []Booking } type VehicleFilters struct { Types []string Administrators []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.Before(b.Unavailablefrom) || start.Equal(b.Unavailablefrom)) && (end.After(b.Unavailablefrom.Add(24*time.Hour)) || end.Equal(b.Unavailablefrom.Add(24*time.Hour)))) || ((start.Before(b.Unavailableto) || start.Equal(b.Unavailableto)) && (end.After(b.Unavailableto.Add(24*time.Hour)) || end.Equal(b.Unavailableto.Add(24*time.Hour)))) || ((start.After(b.Unavailablefrom) || start.Equal(b.Unavailablefrom)) && (end.Before(b.Unavailableto.Add(24*time.Hour)) || end.Equal(b.Unavailableto.Add(24*time.Hour)))) { return false } } return true } func (v Vehicle) MatchesFilters(filters VehicleFilters) bool { fmt.Println("Filters : ", filters) if len(filters.Types) > 0 { found := false for _, t := range filters.Types { if t == v.Type { found = true break } } if !found { return false } } if len(filters.Administrators) > 0 { found := false for _, a := range filters.Administrators { for _, va := range v.Administrators { if a == va { found = true break } } } if !found { return false } } if !v.Free(filters.AvailableFrom, filters.AvailableTo) { return false } return true }