package publicweb import ( "net/http" "time" "github.com/paulmach/orb/geojson" "github.com/rs/zerolog/log" ) // JourneySearchResponse represents the search results for hydration type JourneySearchResponse struct { Searched bool `json:"searched"` DepartureDate string `json:"departure_date,omitempty"` DepartureTime string `json:"departure_time,omitempty"` Departure any `json:"departure,omitempty"` Destination any `json:"destination,omitempty"` Error string `json:"error,omitempty"` Results struct { SolidarityDrivers struct { Number int `json:"number"` } `json:"solidarity_drivers"` OrganizedCarpools struct { Number int `json:"number"` } `json:"organized_carpools"` Carpools struct { Number int `json:"number"` Results any `json:"results,omitempty"` } `json:"carpools"` PublicTransit struct { Number int `json:"number"` Results any `json:"results,omitempty"` } `json:"public_transit"` Vehicles struct { Number int `json:"number"` Results any `json:"results,omitempty"` } `json:"vehicles"` LocalSolutions struct { Number int `json:"number"` Results any `json:"results,omitempty"` } `json:"local_solutions"` } `json:"results"` } // journeySearchDataProvider provides data for the journey search page func (s *PublicWebServer) journeySearchDataProvider(r *http.Request) (any, error) { if err := r.ParseForm(); err != nil { log.Error().Err(err).Msg("error parsing form") return JourneySearchResponse{Error: "invalid request"}, nil } departureDate := r.FormValue("departuredate") departureTime := r.FormValue("departuretime") departure := r.FormValue("departure") destination := r.FormValue("destination") response := JourneySearchResponse{ DepartureDate: departureDate, DepartureTime: departureTime, } // If no search parameters, return empty response if departure == "" || destination == "" || departureDate == "" || departureTime == "" { return response, nil } // Parse timezone and datetime locTime, err := time.LoadLocation("Europe/Paris") if err != nil { log.Error().Err(err).Msg("timezone error") response.Error = "internal error" return response, nil } departureDateTime, err := time.ParseInLocation("2006-01-02 15:04", departureDate+" "+departureTime, locTime) if err != nil { log.Error().Err(err).Msg("error parsing datetime") response.Error = "invalid date/time format" return response, nil } // Parse departure location departureGeo, err := geojson.UnmarshalFeature([]byte(departure)) if err != nil { log.Error().Err(err).Msg("error unmarshalling departure") response.Error = "invalid departure location" return response, nil } response.Departure = departureGeo // Parse destination location destinationGeo, err := geojson.UnmarshalFeature([]byte(destination)) if err != nil { log.Error().Err(err).Msg("error unmarshalling destination") response.Error = "invalid destination location" return response, nil } response.Destination = destinationGeo // Call business logic result, err := s.applicationHandler.SearchJourneys( r.Context(), departureDateTime, departureGeo, destinationGeo, "", // passengerID "", // solidarityTransportExcludeDriver "", // solidarityExcludeGroupId nil, // options - use defaults ) if err != nil { log.Error().Err(err).Msg("error in journey search") response.Error = "search failed" return response, nil } response.Searched = result.Searched // Solidarity drivers response.Results.SolidarityDrivers.Number = len(result.DriverJourneys) // Organized carpools response.Results.OrganizedCarpools.Number = len(result.OrganizedCarpools) // Carpools (from external operators like Movici) response.Results.Carpools.Number = len(result.CarpoolResults) response.Results.Carpools.Results = result.CarpoolResults // Public transit response.Results.PublicTransit.Number = len(result.TransitResults) response.Results.PublicTransit.Results = result.TransitResults // Fleet vehicles response.Results.Vehicles.Number = len(result.VehicleResults) response.Results.Vehicles.Results = result.VehicleResults // Knowledge base / local solutions response.Results.LocalSolutions.Number = len(result.KnowledgeBaseResults) response.Results.LocalSolutions.Results = result.KnowledgeBaseResults return response, nil }