diff --git a/handler/journeys.go b/handler/journeys.go index f92b6e5..89123ce 100644 --- a/handler/journeys.go +++ b/handler/journeys.go @@ -12,14 +12,28 @@ import ( "github.com/rs/zerolog/log" ) -func (h *Handler) GetDriverJourneys(departure *geojson.Feature, arrival *geojson.Feature, departureDate time.Time, noreturn bool) ([]*types.DriverJourney, error) { - log.Info().Time("departureDate", departureDate).Bool("noreturn", noreturn).Str("departure", departure.Properties.MustString("label")).Str("arrival", arrival.Properties.MustString("label")).Msg("calling GetDriverJourneys") +func (h *Handler) GetDriverJourneys(departure *geojson.Feature, arrival *geojson.Feature, departureDate time.Time, noreturn bool, excludeGroupId string) ([]*types.DriverJourney, error) { + log.Info().Time("departureDate", departureDate).Bool("noreturn", noreturn).Str("departure", departure.Properties.MustString("label")).Str("arrival", arrival.Properties.MustString("label")).Str("excludeGroupId", excludeGroupId).Msg("calling GetDriverJourneys") minDistance := h.Config.GetInt64("parameters.limits.distance.min") maxDistance := h.Config.GetInt64("parameters.limits.distance.max") day := int(departureDate.Weekday()) timeInDay := departureDate.Format("15:04") driverJourneys := []*types.DriverJourney{} + // Build map of drivers to exclude based on group_id + excludedDrivers := make(map[string]bool) + if excludeGroupId != "" { + bookings, err := h.Storage.GetBookingsByGroupId(excludeGroupId) + if err != nil { + log.Warn().Err(err).Str("group_id", excludeGroupId).Msg("could not get bookings by group_id for exclusion") + } else { + for _, booking := range bookings { + excludedDrivers[booking.DriverId] = true + log.Debug().Str("driver_id", booking.DriverId).Str("group_id", excludeGroupId).Msg("excluding driver from search") + } + } + } + // Get Availabilities availabilities, err := h.Storage.GetRegularAvailabilities(day, timeInDay) if err != nil { @@ -28,6 +42,11 @@ func (h *Handler) GetDriverJourneys(departure *geojson.Feature, arrival *geojson } for _, a := range availabilities { + // Skip excluded drivers + if excludedDrivers[a.DriverId] { + continue + } + if a.Address != nil { var route *routing.Route if noreturn { diff --git a/handler/journeys_test.go b/handler/journeys_test.go index 1f57785..b1dd531 100644 --- a/handler/journeys_test.go +++ b/handler/journeys_test.go @@ -207,7 +207,7 @@ func TestHandler_GetDriverJourneys(t *testing.T) { Routing: mockRouting, } - journeys, err := handler.GetDriverJourneys(departure, arrival, tt.departureDate, tt.noreturn) + journeys, err := handler.GetDriverJourneys(departure, arrival, tt.departureDate, tt.noreturn, "") assert.NoError(t, err, tt.description) assert.Len(t, journeys, tt.expectedJourneys, tt.description) diff --git a/servers/grpc/proto/gen/solidarity-transport.pb.go b/servers/grpc/proto/gen/solidarity-transport.pb.go index 8e11e2c..2be17ca 100644 --- a/servers/grpc/proto/gen/solidarity-transport.pb.go +++ b/servers/grpc/proto/gen/solidarity-transport.pb.go @@ -392,14 +392,15 @@ func (*DeleteDriverRegularAvailabilityResponse) Descriptor() ([]byte, []int) { } type GetDriverJourneysRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Departure *GeoJsonFeature `protobuf:"bytes,1,opt,name=departure,proto3" json:"departure,omitempty"` - Arrival *GeoJsonFeature `protobuf:"bytes,3,opt,name=arrival,proto3" json:"arrival,omitempty"` - DepartureDate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=departure_date,json=departureDate,proto3" json:"departure_date,omitempty"` - TimeDelta *int64 `protobuf:"varint,6,opt,name=time_delta,json=timeDelta,proto3,oneof" json:"time_delta,omitempty"` - Noreturn bool `protobuf:"varint,7,opt,name=noreturn,proto3" json:"noreturn,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Departure *GeoJsonFeature `protobuf:"bytes,1,opt,name=departure,proto3" json:"departure,omitempty"` + Arrival *GeoJsonFeature `protobuf:"bytes,3,opt,name=arrival,proto3" json:"arrival,omitempty"` + DepartureDate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=departure_date,json=departureDate,proto3" json:"departure_date,omitempty"` + TimeDelta *int64 `protobuf:"varint,6,opt,name=time_delta,json=timeDelta,proto3,oneof" json:"time_delta,omitempty"` + Noreturn bool `protobuf:"varint,7,opt,name=noreturn,proto3" json:"noreturn,omitempty"` + ExcludeGroupId *string `protobuf:"bytes,8,opt,name=exclude_group_id,json=excludeGroupId,proto3,oneof" json:"exclude_group_id,omitempty"` // Exclude drivers who have bookings in this group + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetDriverJourneysRequest) Reset() { @@ -467,6 +468,13 @@ func (x *GetDriverJourneysRequest) GetNoreturn() bool { return false } +func (x *GetDriverJourneysRequest) GetExcludeGroupId() string { + if x != nil && x.ExcludeGroupId != nil { + return *x.ExcludeGroupId + } + return "" +} + type GetDriverJourneysResponse struct { state protoimpl.MessageState `protogen:"open.v1"` DriverJourneys []*SolidarityTransportDriverJourney `protobuf:"bytes,1,rep,name=driver_journeys,json=driverJourneys,proto3" json:"driver_journeys,omitempty"` @@ -1254,15 +1262,17 @@ const file_solidarity_transport_proto_rawDesc = "" + "&DeleteDriverRegularAvailabilityRequest\x12\x1b\n" + "\tdriver_id\x18\x01 \x01(\tR\bdriverId\x12'\n" + "\x0favailability_id\x18\x02 \x01(\tR\x0eavailabilityId\")\n" + - "'DeleteDriverRegularAvailabilityResponse\"\x86\x02\n" + + "'DeleteDriverRegularAvailabilityResponse\"\xca\x02\n" + "\x18GetDriverJourneysRequest\x12-\n" + "\tdeparture\x18\x01 \x01(\v2\x0f.GeoJsonFeatureR\tdeparture\x12)\n" + "\aarrival\x18\x03 \x01(\v2\x0f.GeoJsonFeatureR\aarrival\x12A\n" + "\x0edeparture_date\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\rdepartureDate\x12\"\n" + "\n" + "time_delta\x18\x06 \x01(\x03H\x00R\ttimeDelta\x88\x01\x01\x12\x1a\n" + - "\bnoreturn\x18\a \x01(\bR\bnoreturnB\r\n" + - "\v_time_delta\"g\n" + + "\bnoreturn\x18\a \x01(\bR\bnoreturn\x12-\n" + + "\x10exclude_group_id\x18\b \x01(\tH\x01R\x0eexcludeGroupId\x88\x01\x01B\r\n" + + "\v_time_deltaB\x13\n" + + "\x11_exclude_group_id\"g\n" + "\x19GetDriverJourneysResponse\x12J\n" + "\x0fdriver_journeys\x18\x01 \x03(\v2!.SolidarityTransportDriverJourneyR\x0edriverJourneys\"U\n" + "\x17GetDriverJourneyRequest\x12\x1b\n" + diff --git a/servers/grpc/proto/solidarity-transport.proto b/servers/grpc/proto/solidarity-transport.proto index a209b77..4e07c49 100644 --- a/servers/grpc/proto/solidarity-transport.proto +++ b/servers/grpc/proto/solidarity-transport.proto @@ -65,6 +65,7 @@ message GetDriverJourneysRequest { google.protobuf.Timestamp departure_date = 5; optional int64 time_delta = 6; bool noreturn = 7; + optional string exclude_group_id = 8; // Exclude drivers who have bookings in this group } message GetDriverJourneysResponse { diff --git a/servers/grpc/server/journeys.go b/servers/grpc/server/journeys.go index 36e9fba..02b3c25 100644 --- a/servers/grpc/server/journeys.go +++ b/servers/grpc/server/journeys.go @@ -22,7 +22,12 @@ func (s SolidarityTransportServerImpl) GetDriverJourneys(ctx context.Context, re return nil, status.Errorf(codes.Internal, "arrival unmarhsalling error : %v", err) } - driverJourneys, err := s.Handler.GetDriverJourneys(departure, arrival, departureDate, req.Noreturn) + excludeGroupId := "" + if req.ExcludeGroupId != nil { + excludeGroupId = *req.ExcludeGroupId + } + + driverJourneys, err := s.Handler.GetDriverJourneys(departure, arrival, departureDate, req.Noreturn, excludeGroupId) if err != nil { log.Error().Err(err).Msg("issue in GetDriverJourneys handler") return nil, status.Errorf(codes.Internal, "could not get driver journeys : %v", err) diff --git a/storage/mongodb.go b/storage/mongodb.go index 8c18fd6..27ecb49 100644 --- a/storage/mongodb.go +++ b/storage/mongodb.go @@ -231,7 +231,7 @@ func (s MongoDBStorage) UpdateBookingStatus(bookingid string, newStatus string, } func (s MongoDBStorage) GetBookingsByGroupId(groupId string) ([]*types.Booking, error) { - filter := bson.M{"groupid": groupId} + filter := bson.M{"group_id": groupId} cursor, err := s.Collections.Bookings.Find(context.Background(), filter) if err != nil {