Files
parcoursmob/servers/publicweb/journeys.go
2026-01-05 17:50:05 +01:00

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
}