Add PostgreSQL database option and more booking flow functionalities
This commit is contained in:
101
handler/bookings.go
Normal file
101
handler/bookings.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"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")
|
||||
futureBooking := internal.Booking{}
|
||||
roles := []string{}
|
||||
if booking.Driver.Operator == h.InternalOperatorID {
|
||||
roles = append(roles, "driver")
|
||||
previous_search_result, err := h.Storage.GetRouteSchedule(booking.DriverJourneyID)
|
||||
if err == nil {
|
||||
futureBooking.DriverRoute = previous_search_result.Route
|
||||
}
|
||||
}
|
||||
|
||||
if booking.Passenger.Operator == h.InternalOperatorID {
|
||||
roles = append(roles, "passenger")
|
||||
previous_search_result, err := h.Storage.GetRouteSchedule(booking.PassengerJourneyID)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("could not get previous result")
|
||||
}
|
||||
if err == nil {
|
||||
futureBooking.PassengerRoute = previous_search_result.Route
|
||||
}
|
||||
}
|
||||
|
||||
if len(roles) == 0 {
|
||||
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 {
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user