package handler import ( "errors" "time" "git.coopgo.io/coopgo-platform/carpool-service/internal" "git.coopgo.io/coopgo-platform/carpool-service/interoperability/ocss" "github.com/google/uuid" "github.com/rs/zerolog/log" ) // Book handles the booking flow func (h *CarpoolServiceHandler) Book(booking ocss.Booking) (*internal.Booking, error) { log.Debug().Any("booking", booking).Msg("handler - Book") log.Debug().Str("passengerPickupDate", booking.PassengerPickupDate.ToTime().Format(time.RFC3339)).Msg("handler - Book") log.Debug().Str("internal_operator_id", h.InternalOperatorID).Str("driver_operator", booking.Driver.Operator).Str("passenger_operator", booking.Passenger.Operator).Msg("operator comparison") futureBooking := internal.Booking{} roles := []string{} if booking.Driver.Operator == h.InternalOperatorID { roles = append(roles, "driver") log.Debug().Str("driver_journey_id", booking.DriverJourneyID).Msg("looking up driver route schedule") previous_search_result, err := h.Storage.GetRouteSchedule(booking.DriverJourneyID) if err != nil { log.Error().Err(err).Str("driver_journey_id", booking.DriverJourneyID).Msg("could not get driver route schedule") } if err == nil { if previous_search_result.Route != nil { futureBooking.DriverRoute = previous_search_result.Route log.Debug().Msg("driver route added to booking") } else { log.Warn().Msg("driver route schedule found but route is nil") } } } if booking.Passenger.Operator == h.InternalOperatorID { roles = append(roles, "passenger") log.Debug().Str("passenger_journey_id", booking.PassengerJourneyID).Msg("looking up passenger route schedule") previous_search_result, err := h.Storage.GetRouteSchedule(booking.PassengerJourneyID) if err != nil { log.Error().Err(err).Str("passenger_journey_id", booking.PassengerJourneyID).Msg("could not get passenger route schedule") } if err == nil { if previous_search_result.Route != nil { futureBooking.PassengerRoute = previous_search_result.Route log.Debug().Msg("passenger route added to booking") } else { log.Warn().Msg("passenger route schedule found but route is nil") } } } if len(roles) == 0 { roles = append(roles, "driver") // return nil, fmt.Errorf("couldn't find the right operator id : \"%s\" should be set for driver or passenger", h.InternalOperatorID) } if _, err := uuid.Parse(booking.ID); err != nil { booking.ID = uuid.NewString() // return nil, errors.New("bookingid is not a valid uuid") } futureBooking.Booking = booking err := h.Storage.CreateBooking(futureBooking) if err != nil { log.Error().Err(err).Msg("issue creating booking in database") return nil, err } return &futureBooking, nil } // GetBooking returns the booking with the given ID func (h *CarpoolServiceHandler) GetBooking(id string) (*internal.Booking, error) { booking, err := h.Storage.GetBooking(id) if err != nil { log.Error().Err(err).Msg("issue retrieving booking in storage") return nil, errors.New("booking id not found") } return booking, nil } // GetUserBookings retrieves all the bookings for a specified user id func (h *CarpoolServiceHandler) GetUserBookings(user_id string, mindate *time.Time, maxdate *time.Time) ([]internal.Booking, error) { bookings, err := h.Storage.GetUserBookings(user_id) if err != nil { return nil, err } results := []internal.Booking{} for _, b := range bookings { if mindate != nil { if b.PassengerPickupDate.ToTime().Before(*mindate) { continue } } if maxdate != nil { if b.PassengerPickupDate.ToTime().After(*maxdate) { continue } } results = append(results, b) } return results, nil } // GetBookings retrieves all the bookings between 2 dates func (h *CarpoolServiceHandler) GetBookings(mindate *time.Time, maxdate *time.Time) ([]internal.Booking, error) { bookings, err := h.Storage.GetAllBookings() if err != nil { return nil, err } results := []internal.Booking{} for _, b := range bookings { if mindate != nil { if b.PassengerPickupDate.ToTime().Before(*mindate) { continue } } if maxdate != nil { if b.PassengerPickupDate.ToTime().After(*maxdate) { continue } } results = append(results, b) } return results, nil } // UpdateBookingStatus sets a new status for a given booking id func (h *CarpoolServiceHandler) UpdateBookingStatus(id string, status ocss.BookingStatus) error { err := h.Storage.UpdateBookingStatus(id, status.String()) if err != nil { log.Error().Err(err).Msg("not able to update booking status") return err } return nil }