package application import ( "context" "net/http" groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" "git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/proto/gen" "git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/transformers" "github.com/gorilla/mux" "github.com/rs/zerolog/log" ) func (h *ApplicationHandler) SolidarityTransportExternalBookingProposal(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) bookingId := vars["bookingid"] resp, err := h.services.GRPC.SolidarityTransport.GetSolidarityTransportBooking(context.Background(), &gen.GetSolidarityTransportBookingRequest{ Id: bookingId, }) booking, err := transformers.BookingProtoToType(resp.Booking) if err != nil { log.Error().Err(err).Msg("could not transform booking type") w.WriteHeader(http.StatusBadRequest) return } driver, err := h.services.GetAccount(booking.DriverId) if err != nil { log.Error().Err(err).Msg("driver retrieval issue") w.WriteHeader(http.StatusInternalServerError) return } passenger, err := h.services.GetAccount(booking.PassengerId) if err != nil { log.Error().Err(err).Msg("passenger retrieval issue") w.WriteHeader(http.StatusInternalServerError) return } if r.Method == "POST" { if err = r.ParseForm(); err != nil { log.Error().Err(err).Msg("error parsing form data") } message := r.FormValue("message") action := r.FormValue("action") var status string if action == "confirm" { status = "VALIDATED" } else if action == "cancel" { status = "CANCELLED" } else if action == "waitconfirmation" { status = "WAITING_CONFIRMATION" } if status != "" { if _, err := h.services.GRPC.SolidarityTransport.UpdateSolidarityTransportBookingStatus(context.Background(), &gen.UpdateSolidarityTransportBookingStatusRequest{ BookingId: bookingId, NewStatus: status, Reason: "Refusé par le bénévole", }); err != nil { log.Error().Err(err).Msg("update booking status issue") w.WriteHeader(http.StatusInternalServerError) return } booking.Status = status if status == "VALIDATED" { h.GenerateSMS(passenger.ID, message) } else if status == "CANCELLED" { if err := h.creditWallet(passenger.ID, booking.Journey.Price.Amount); err != nil { log.Error().Err(err).Msg("could not credit wallet") w.WriteHeader(http.StatusInternalServerError) return } // NOTIFY GROUP MEMBERS groupsrequest := &groupsmanagement.GetGroupsRequest{ Namespaces: []string{"parcoursmob_organizations"}, Member: booking.PassengerId, } groupsresp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), groupsrequest) if err != nil { log.Error().Err(err).Msg("") } if len(groupsresp.Groups) > 0 { members, _, err := h.groupmembers(groupsresp.Groups[0].Id) if err != nil { log.Error().Err(err).Msg("could not retrieve groupe members") } else { for _, m := range members { if email, ok := m.Data["email"].(string); ok { h.emailing.Send("solidarity_transport.booking_driver_decline", email, map[string]string{ "bookingid": booking.Id, "baseUrl": h.config.GetString("base_url"), }) } } } } } } } h.Renderer.SolidarityTransportExternalBookingDisplay(w, r, booking, driver, passenger) }