Add public web functionalities
This commit is contained in:
142
servers/publicweb/journeys.go
Normal file
142
servers/publicweb/journeys.go
Normal file
@@ -0,0 +1,142 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user