143 lines
4.3 KiB
Go
143 lines
4.3 KiB
Go
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
|
|
}
|